diff --git a/004ec9e5.2db8f980.js b/004ec9e5.a87d57ac.js similarity index 99% rename from 004ec9e5.2db8f980.js rename to 004ec9e5.a87d57ac.js index dc3d683966..30f1f7ea72 100644 --- a/004ec9e5.2db8f980.js +++ b/004ec9e5.a87d57ac.js @@ -1,2 +1,2 @@ -/*! For license information please see 004ec9e5.2db8f980.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{153:function(n,t,e){"use strict";e.r(t);e(468);var r=e(0),u=e.n(r),i=e(487),a=e(556),o=e(470);t.default=function(n){var t=n.metadata,e=n.items,r=t.allTagsPath,c=t.name,l=t.count;return u.a.createElement(i.a,{title:'Guides tagged "'+c+'"',description:'Guide | Tagged "'+c+'"'},u.a.createElement("header",{className:"hero hero--clean"},u.a.createElement("div",{className:"container"},u.a.createElement("h1",null,l," ",function(n,t){return n>1?t+"s":t}(l,"guide"),' tagged with "',c,'"'),u.a.createElement("div",{className:"hero--subtitle"},u.a.createElement(o.a,{href:r},"View All Tags")))),u.a.createElement("main",{className:"container container--s"},u.a.createElement(a.a,{items:e})))}},463:function(n,t,e){var r;!function(){"use strict";var e={}.hasOwnProperty;function u(){for(var n=[],t=0;t1?arguments[1]:void 0)}}),e(74)("find")},487:function(n,t,e){"use strict";e(497);var r=e(0),u=e.n(r),i=e(498),a=e(486),o=e(1),c=(e(488),e(489),e(499),e(470)),l=e(500),f=e(484),s=e.n(f),v=e(501),h=e.n(v),d=e(476),p=e(463),g=e.n(p),D=e(135),_=e.n(D),m=function(){return u.a.createElement("span",{className:g()(_.a.toggle,_.a.moon)})},y=function(){return u.a.createElement("span",{className:g()(_.a.toggle,_.a.sun)})},b=function(n){var t=Object(d.a)().isClient;return u.a.createElement(h.a,Object(o.a)({disabled:!t,icons:{checked:u.a.createElement(m,null),unchecked:u.a.createElement(y,null)}},n))};function E(){var n=Object(d.a)().siteConfig,t=(void 0===n?{}:n).customFields.metadata.latest_post,e=Date.parse(t.date),r=new Date,u=Math.abs(r-e),i=Math.ceil(u/864e5),a=null;return"undefined"!=typeof window&&(a=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!a||a0&&u.a.createElement("div",{className:"row footer__links"},u.a.createElement("div",{className:"col col--5 footer__col"},u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement(s.a,{className:"navbar__logo",src:h,alt:"Qovery",width:"150",height:"auto"})),u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),u.a.createElement("div",null,u.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},u.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},u.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},u.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),c.map((function(n,t){return u.a.createElement("div",{key:t,className:"col footer__col"},null!=n.title?u.a.createElement("h4",{className:"footer__title"},n.title):null,null!=n.items&&Array.isArray(n.items)&&n.items.length>0?u.a.createElement("ul",{className:"footer__items"},n.items.map((function(n,t){return n.html?u.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):u.a.createElement("li",{key:n.href||n.to,className:"footer__item"},u.a.createElement(z,n))}))):null)}))),(f||a)&&u.a.createElement("div",{className:"text--center"},f&&f.src&&u.a.createElement("div",{className:"margin-bottom--sm"},f.href?u.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:L.a.footerLogoLink},u.a.createElement(R,{alt:f.alt,url:v})):u.a.createElement(R,{alt:f.alt,url:v})),u.a.createElement("small",null,a),u.a.createElement("br",null))))},W=e(502),M=e(503),U=e(3);e(138);t.a=function(n){var t=Object(d.a)().siteConfig,e=void 0===t?{}:t,r=e.title,o=e.themeConfig.image,c=e.url,l=n.children,f=n.title,s=n.noFooter,v=n.description,h=n.image,p=n.keywords,g=n.version,D=f?f+" | "+r:r,_=h||o,m=c+Object(F.a)(_),y=Object(U.h)(),b=y?"https://docs.qovery.com"+(y.pathname.endsWith("/")?y.pathname:y.pathname+"/"):null;return u.a.createElement(M.a,null,u.a.createElement(W.a,null,u.a.createElement(a.a,null,u.a.createElement("html",{lang:"en"}),u.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),D&&u.a.createElement("title",null,D),D&&u.a.createElement("meta",{property:"og:title",content:D}),u.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),u.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),u.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),u.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),u.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),u.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),u.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),u.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),v&&u.a.createElement("meta",{name:"description",content:v}),v&&u.a.createElement("meta",{property:"og:description",content:v}),g&&u.a.createElement("meta",{name:"docsearch:version",content:g}),p&&p.length&&u.a.createElement("meta",{name:"keywords",content:p.join(",")}),_&&u.a.createElement("meta",{property:"og:image",content:m}),_&&u.a.createElement("meta",{property:"twitter:image",content:m}),_&&u.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+D}),b&&u.a.createElement("meta",{property:"og:url",content:b}),u.a.createElement("meta",{name:"twitter:card",content:"summary"}),b&&u.a.createElement("link",{rel:"canonical",href:b})),u.a.createElement(i.a,null),u.a.createElement(B,null),u.a.createElement("div",{className:"main-wrapper"},l),!s&&u.a.createElement(T,null)))}},490:function(n,t,e){"use strict";var r=e(9),u=e(0),i=e.n(u),a=e(463),o=e.n(a),c=e(476),l=(e(139),e(140)),f=e.n(l);t.a=function(n){return function(t){var e,u=t.id,a=Object(r.a)(t,["id"]),l=Object(c.a)().siteConfig,s=(l=void 0===l?{}:l).themeConfig,v=(s=void 0===s?{}:s).navbar,h=(v=void 0===v?{}:v).hideOnScroll,d=void 0!==h&&h;return u?i.a.createElement(n,a,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:o()("anchor",(e={},e[f.a.enhancedAnchor]=!d,e)),id:u}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+u,title:"Direct link to heading"},"#"),a.children):i.a.createElement(n,a)}}},491:function(n,t,e){(function(n,r){var u;(function(){var i="Expected a function",a="__lodash_placeholder__",o=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",f="[object Boolean]",s="[object Date]",v="[object Error]",h="[object Function]",d="[object GeneratorFunction]",p="[object Map]",g="[object Number]",D="[object Object]",_="[object RegExp]",m="[object Set]",y="[object String]",b="[object Symbol]",E="[object WeakMap]",w="[object ArrayBuffer]",F="[object DataView]",C="[object Float32Array]",k="[object Float64Array]",x="[object Int8Array]",A="[object Int16Array]",j="[object Int32Array]",O="[object Uint8Array]",N="[object Uint16Array]",B="[object Uint32Array]",I=/\b__p \+= '';/g,S=/\b(__p \+=) '' \+/g,L=/(__e\(.*?\)|\b__t\)) \+\n'';/g,z=/&(?:amp|lt|gt|quot|#39);/g,R=/[&<>"']/g,T=RegExp(z.source),W=RegExp(R.source),M=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,P=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,q=/^\w*$/,V=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,G=/[\\^$.*+?()[\]{}|]/g,Z=RegExp(G.source),H=/^\s+|\s+$/g,K=/^\s+/,J=/\s+$/,Q=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,nn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,tn=/\\(\\)?/g,en=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,rn=/\w*$/,un=/^[-+]0x[0-9a-f]+$/i,an=/^0b[01]+$/i,on=/^\[object .+?Constructor\]$/,cn=/^0o[0-7]+$/i,ln=/^(?:0|[1-9]\d*)$/,fn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,sn=/($^)/,vn=/['\n\r\u2028\u2029\\]/g,hn="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",dn="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",pn="[\\ud800-\\udfff]",gn="["+dn+"]",Dn="["+hn+"]",_n="\\d+",mn="[\\u2700-\\u27bf]",yn="[a-z\\xdf-\\xf6\\xf8-\\xff]",bn="[^\\ud800-\\udfff"+dn+_n+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",En="\\ud83c[\\udffb-\\udfff]",wn="[^\\ud800-\\udfff]",Fn="(?:\\ud83c[\\udde6-\\uddff]){2}",Cn="[\\ud800-\\udbff][\\udc00-\\udfff]",kn="[A-Z\\xc0-\\xd6\\xd8-\\xde]",xn="(?:"+yn+"|"+bn+")",An="(?:"+kn+"|"+bn+")",jn="(?:"+Dn+"|"+En+")"+"?",On="[\\ufe0e\\ufe0f]?"+jn+("(?:\\u200d(?:"+[wn,Fn,Cn].join("|")+")[\\ufe0e\\ufe0f]?"+jn+")*"),Nn="(?:"+[mn,Fn,Cn].join("|")+")"+On,Bn="(?:"+[wn+Dn+"?",Dn,Fn,Cn,pn].join("|")+")",In=RegExp("['\u2019]","g"),Sn=RegExp(Dn,"g"),Ln=RegExp(En+"(?="+En+")|"+Bn+On,"g"),zn=RegExp([kn+"?"+yn+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[gn,kn,"$"].join("|")+")",An+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[gn,kn+xn,"$"].join("|")+")",kn+"?"+xn+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",kn+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",_n,Nn].join("|"),"g"),Rn=RegExp("[\\u200d\\ud800-\\udfff"+hn+"\\ufe0e\\ufe0f]"),Tn=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Mn=-1,Un={};Un[C]=Un[k]=Un[x]=Un[A]=Un[j]=Un[O]=Un["[object Uint8ClampedArray]"]=Un[N]=Un[B]=!0,Un[c]=Un[l]=Un[w]=Un[f]=Un[F]=Un[s]=Un[v]=Un[h]=Un[p]=Un[g]=Un[D]=Un[_]=Un[m]=Un[y]=Un[E]=!1;var Pn={};Pn[c]=Pn[l]=Pn[w]=Pn[F]=Pn[f]=Pn[s]=Pn[C]=Pn[k]=Pn[x]=Pn[A]=Pn[j]=Pn[p]=Pn[g]=Pn[D]=Pn[_]=Pn[m]=Pn[y]=Pn[b]=Pn[O]=Pn["[object Uint8ClampedArray]"]=Pn[N]=Pn[B]=!0,Pn[v]=Pn[h]=Pn[E]=!1;var $n={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},qn=parseFloat,Vn=parseInt,Gn="object"==typeof n&&n&&n.Object===Object&&n,Zn="object"==typeof self&&self&&self.Object===Object&&self,Hn=Gn||Zn||Function("return this")(),Kn=t&&!t.nodeType&&t,Jn=Kn&&"object"==typeof r&&r&&!r.nodeType&&r,Qn=Jn&&Jn.exports===Kn,Yn=Qn&&Gn.process,Xn=function(){try{var n=Jn&&Jn.require&&Jn.require("util").types;return n||Yn&&Yn.binding&&Yn.binding("util")}catch(t){}}(),nt=Xn&&Xn.isArrayBuffer,tt=Xn&&Xn.isDate,et=Xn&&Xn.isMap,rt=Xn&&Xn.isRegExp,ut=Xn&&Xn.isSet,it=Xn&&Xn.isTypedArray;function at(n,t,e){switch(e.length){case 0:return n.call(t);case 1:return n.call(t,e[0]);case 2:return n.call(t,e[0],e[1]);case 3:return n.call(t,e[0],e[1],e[2])}return n.apply(t,e)}function ot(n,t,e,r){for(var u=-1,i=null==n?0:n.length;++u-1}function ht(n,t,e){for(var r=-1,u=null==n?0:n.length;++r-1;);return e}function Lt(n,t){for(var e=n.length;e--&&Et(t,n[e],0)>-1;);return e}function zt(n,t){for(var e=n.length,r=0;e--;)n[e]===t&&++r;return r}var Rt=xt({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Tt=xt({"&":"&","<":"<",">":">",'"':""","'":"'"});function Wt(n){return"\\"+$n[n]}function Mt(n){return Rn.test(n)}function Ut(n){var t=-1,e=Array(n.size);return n.forEach((function(n,r){e[++t]=[r,n]})),e}function Pt(n,t){return function(e){return n(t(e))}}function $t(n,t){for(var e=-1,r=n.length,u=0,i=[];++e",""":'"',"'":"'"});var Kt=function n(t){var e,r=(t=null==t?Hn:Kt.defaults(Hn.Object(),t,Kt.pick(Hn,Wn))).Array,u=t.Date,hn=t.Error,dn=t.Function,pn=t.Math,gn=t.Object,Dn=t.RegExp,_n=t.String,mn=t.TypeError,yn=r.prototype,bn=dn.prototype,En=gn.prototype,wn=t["__core-js_shared__"],Fn=bn.toString,Cn=En.hasOwnProperty,kn=0,xn=(e=/[^.]+$/.exec(wn&&wn.keys&&wn.keys.IE_PROTO||""))?"Symbol(src)_1."+e:"",An=En.toString,jn=Fn.call(gn),On=Hn._,Nn=Dn("^"+Fn.call(Cn).replace(G,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Bn=Qn?t.Buffer:void 0,Ln=t.Symbol,Rn=t.Uint8Array,$n=Bn?Bn.allocUnsafe:void 0,Gn=Pt(gn.getPrototypeOf,gn),Zn=gn.create,Kn=En.propertyIsEnumerable,Jn=yn.splice,Yn=Ln?Ln.isConcatSpreadable:void 0,Xn=Ln?Ln.iterator:void 0,mt=Ln?Ln.toStringTag:void 0,xt=function(){try{var n=Xu(gn,"defineProperty");return n({},"",{}),n}catch(t){}}(),Jt=t.clearTimeout!==Hn.clearTimeout&&t.clearTimeout,Qt=u&&u.now!==Hn.Date.now&&u.now,Yt=t.setTimeout!==Hn.setTimeout&&t.setTimeout,Xt=pn.ceil,ne=pn.floor,te=gn.getOwnPropertySymbols,ee=Bn?Bn.isBuffer:void 0,re=t.isFinite,ue=yn.join,ie=Pt(gn.keys,gn),ae=pn.max,oe=pn.min,ce=u.now,le=t.parseInt,fe=pn.random,se=yn.reverse,ve=Xu(t,"DataView"),he=Xu(t,"Map"),de=Xu(t,"Promise"),pe=Xu(t,"Set"),ge=Xu(t,"WeakMap"),De=Xu(gn,"create"),_e=ge&&new ge,me={},ye=ki(ve),be=ki(he),Ee=ki(de),we=ki(pe),Fe=ki(ge),Ce=Ln?Ln.prototype:void 0,ke=Ce?Ce.valueOf:void 0,xe=Ce?Ce.toString:void 0;function Ae(n){if($a(n)&&!Ba(n)&&!(n instanceof Be)){if(n instanceof Ne)return n;if(Cn.call(n,"__wrapped__"))return xi(n)}return new Ne(n)}var je=function(){function n(){}return function(t){if(!Pa(t))return{};if(Zn)return Zn(t);n.prototype=t;var e=new n;return n.prototype=void 0,e}}();function Oe(){}function Ne(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Be(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Ie(n){var t=-1,e=null==n?0:n.length;for(this.clear();++t=t?n:t)),n}function Je(n,t,e,r,u,i){var a,o=1&t,l=2&t,v=4&t;if(e&&(a=u?e(n,r,u,i):e(n)),void 0!==a)return a;if(!Pa(n))return n;var E=Ba(n);if(E){if(a=function(n){var t=n.length,e=new n.constructor(t);t&&"string"==typeof n[0]&&Cn.call(n,"index")&&(e.index=n.index,e.input=n.input);return e}(n),!o)return Du(n,a)}else{var I=ei(n),S=I==h||I==d;if(za(n))return su(n,o);if(I==D||I==c||S&&!u){if(a=l||S?{}:ui(n),!o)return l?function(n,t){return _u(n,ti(n),t)}(n,function(n,t){return n&&_u(t,bo(t),n)}(a,n)):function(n,t){return _u(n,ni(n),t)}(n,Ge(a,n))}else{if(!Pn[I])return u?n:{};a=function(n,t,e){var r=n.constructor;switch(t){case w:return vu(n);case f:case s:return new r(+n);case F:return function(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.byteLength)}(n,e);case C:case k:case x:case A:case j:case O:case"[object Uint8ClampedArray]":case N:case B:return hu(n,e);case p:return new r;case g:case y:return new r(n);case _:return function(n){var t=new n.constructor(n.source,rn.exec(n));return t.lastIndex=n.lastIndex,t}(n);case m:return new r;case b:return u=n,ke?gn(ke.call(u)):{}}var u}(n,I,o)}}i||(i=new Re);var L=i.get(n);if(L)return L;i.set(n,a),Ha(n)?n.forEach((function(r){a.add(Je(r,t,e,r,n,i))})):qa(n)&&n.forEach((function(r,u){a.set(u,Je(r,t,e,u,n,i))}));var z=E?void 0:(v?l?Gu:Vu:l?bo:yo)(n);return ct(z||n,(function(r,u){z&&(r=n[u=r]),$e(a,u,Je(r,t,e,u,n,i))})),a}function Qe(n,t,e){var r=e.length;if(null==n)return!r;for(n=gn(n);r--;){var u=e[r],i=t[u],a=n[u];if(void 0===a&&!(u in n)||!i(a))return!1}return!0}function Ye(n,t,e){if("function"!=typeof n)throw new mn(i);return mi((function(){n.apply(void 0,e)}),t)}function Xe(n,t,e,r){var u=-1,i=vt,a=!0,o=n.length,c=[],l=t.length;if(!o)return c;e&&(t=dt(t,Nt(e))),r?(i=ht,a=!1):t.length>=200&&(i=It,a=!1,t=new ze(t));n:for(;++u-1},Se.prototype.set=function(n,t){var e=this.__data__,r=qe(e,n);return r<0?(++this.size,e.push([n,t])):e[r][1]=t,this},Le.prototype.clear=function(){this.size=0,this.__data__={hash:new Ie,map:new(he||Se),string:new Ie}},Le.prototype.delete=function(n){var t=Qu(this,n).delete(n);return this.size-=t?1:0,t},Le.prototype.get=function(n){return Qu(this,n).get(n)},Le.prototype.has=function(n){return Qu(this,n).has(n)},Le.prototype.set=function(n,t){var e=Qu(this,n),r=e.size;return e.set(n,t),this.size+=e.size==r?0:1,this},ze.prototype.add=ze.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},ze.prototype.has=function(n){return this.__data__.has(n)},Re.prototype.clear=function(){this.__data__=new Se,this.size=0},Re.prototype.delete=function(n){var t=this.__data__,e=t.delete(n);return this.size=t.size,e},Re.prototype.get=function(n){return this.__data__.get(n)},Re.prototype.has=function(n){return this.__data__.has(n)},Re.prototype.set=function(n,t){var e=this.__data__;if(e instanceof Se){var r=e.__data__;if(!he||r.length<199)return r.push([n,t]),this.size=++e.size,this;e=this.__data__=new Le(r)}return e.set(n,t),this.size=e.size,this};var nr=bu(cr),tr=bu(lr,!0);function er(n,t){var e=!0;return nr(n,(function(n,r,u){return e=!!t(n,r,u)})),e}function rr(n,t,e){for(var r=-1,u=n.length;++r0&&e(o)?t>1?ir(o,t-1,e,r,u):pt(u,o):r||(u[u.length]=o)}return u}var ar=Eu(),or=Eu(!0);function cr(n,t){return n&&ar(n,t,yo)}function lr(n,t){return n&&or(n,t,yo)}function fr(n,t){return st(t,(function(t){return Wa(n[t])}))}function sr(n,t){for(var e=0,r=(t=ou(t,n)).length;null!=n&&et}function pr(n,t){return null!=n&&Cn.call(n,t)}function gr(n,t){return null!=n&&t in gn(n)}function Dr(n,t,e){for(var u=e?ht:vt,i=n[0].length,a=n.length,o=a,c=r(a),l=1/0,f=[];o--;){var s=n[o];o&&t&&(s=dt(s,Nt(t))),l=oe(s.length,l),c[o]=!e&&(t||i>=120&&s.length>=120)?new ze(o&&s):void 0}s=n[0];var v=-1,h=c[0];n:for(;++v=o)return c;var l=e[r];return c*("desc"==l?-1:1)}}return n.index-t.index}(n,t,e)}))}function Ir(n,t,e){for(var r=-1,u=t.length,i={};++r-1;)o!==n&&Jn.call(o,c,1),Jn.call(n,c,1);return n}function Lr(n,t){for(var e=n?t.length:0,r=e-1;e--;){var u=t[e];if(e==r||u!==i){var i=u;ai(u)?Jn.call(n,u,1):Xr(n,u)}}return n}function zr(n,t){return n+ne(fe()*(t-n+1))}function Rr(n,t){var e="";if(!n||t<1||t>9007199254740991)return e;do{t%2&&(e+=n),(t=ne(t/2))&&(n+=n)}while(t);return e}function Tr(n,t){return yi(di(n,t,Go),n+"")}function Wr(n){return We(jo(n))}function Mr(n,t){var e=jo(n);return wi(e,Ke(t,0,e.length))}function Ur(n,t,e,r){if(!Pa(n))return n;for(var u=-1,i=(t=ou(t,n)).length,a=i-1,o=n;null!=o&&++ui?0:i+t),(e=e>i?i:e)<0&&(e+=i),i=t>e?0:e-t>>>0,t>>>=0;for(var a=r(i);++u>>1,a=n[i];null!==a&&!Ja(a)&&(e?a<=t:a=200){var l=t?null:Ru(n);if(l)return qt(l);a=!1,u=It,c=new ze}else c=t?[]:o;n:for(;++r=r?n:Vr(n,t,e)}var fu=Jt||function(n){return Hn.clearTimeout(n)};function su(n,t){if(t)return n.slice();var e=n.length,r=$n?$n(e):new n.constructor(e);return n.copy(r),r}function vu(n){var t=new n.constructor(n.byteLength);return new Rn(t).set(new Rn(n)),t}function hu(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.length)}function du(n,t){if(n!==t){var e=void 0!==n,r=null===n,u=n==n,i=Ja(n),a=void 0!==t,o=null===t,c=t==t,l=Ja(t);if(!o&&!l&&!i&&n>t||i&&a&&c&&!o&&!l||r&&a&&c||!e&&c||!u)return 1;if(!r&&!i&&!l&&n1?e[u-1]:void 0,a=u>2?e[2]:void 0;for(i=n.length>3&&"function"==typeof i?(u--,i):void 0,a&&oi(e[0],e[1],a)&&(i=u<3?void 0:i,u=1),t=gn(t);++r-1?u[i?t[a]:a]:void 0}}function xu(n){return qu((function(t){var e=t.length,r=e,u=Ne.prototype.thru;for(n&&t.reverse();r--;){var a=t[r];if("function"!=typeof a)throw new mn(i);if(u&&!o&&"wrapper"==Hu(a))var o=new Ne([],!0)}for(r=o?r:e;++r1&&m.reverse(),s&&l<_&&(m.length=l),this&&this!==Hn&&this instanceof D&&(C=g||Cu(C)),C.apply(F,m)}}function ju(n,t){return function(e,r){return function(n,t,e,r){return cr(n,(function(n,u,i){t(r,e(n),u,i)})),r}(e,n,t(r),{})}}function Ou(n,t){return function(e,r){var u;if(void 0===e&&void 0===r)return t;if(void 0!==e&&(u=e),void 0!==r){if(void 0===u)return r;"string"==typeof e||"string"==typeof r?(e=Qr(e),r=Qr(r)):(e=Jr(e),r=Jr(r)),u=n(e,r)}return u}}function Nu(n){return qu((function(t){return t=dt(t,Nt(Ju())),Tr((function(e){var r=this;return n(t,(function(n){return at(n,r,e)}))}))}))}function Bu(n,t){var e=(t=void 0===t?" ":Qr(t)).length;if(e<2)return e?Rr(t,n):t;var r=Rr(t,Xt(n/Gt(t)));return Mt(t)?lu(Zt(r),0,n).join(""):r.slice(0,n)}function Iu(n){return function(t,e,u){return u&&"number"!=typeof u&&oi(t,e,u)&&(e=u=void 0),t=to(t),void 0===e?(e=t,t=0):e=to(e),function(n,t,e,u){for(var i=-1,a=ae(Xt((t-n)/(e||1)),0),o=r(a);a--;)o[u?a:++i]=n,n+=e;return o}(t,e,u=void 0===u?to))return!1;var l=i.get(n);if(l&&i.get(t))return l==t;var f=-1,s=!0,v=2&e?new ze:void 0;for(i.set(n,t),i.set(t,n);++f-1&&n%1==0&&n1?"& ":"")+t[r],t=t.join(e>2?", ":" "),n.replace(Q,"{\n/* [wrapped with "+t+"] */\n")}(r,function(n,t){return ct(o,(function(e){var r="_."+e[0];t&e[1]&&!vt(n,r)&&n.push(r)})),n.sort()}(function(n){var t=n.match(Y);return t?t[1].split(X):[]}(r),e)))}function Ei(n){var t=0,e=0;return function(){var r=ce(),u=16-(r-e);if(e=r,u>0){if(++t>=800)return arguments[0]}else t=0;return n.apply(void 0,arguments)}}function wi(n,t){var e=-1,r=n.length,u=r-1;for(t=void 0===t?r:t;++e1?n[t-1]:void 0;return e="function"==typeof e?(n.pop(),e):void 0,Zi(n,e)}));function na(n){var t=Ae(n);return t.__chain__=!0,t}function ta(n,t){return t(n)}var ea=qu((function(n){var t=n.length,e=t?n[0]:0,r=this.__wrapped__,u=function(t){return He(t,n)};return!(t>1||this.__actions__.length)&&r instanceof Be&&ai(e)?((r=r.slice(e,+e+(t?1:0))).__actions__.push({func:ta,args:[u],thisArg:void 0}),new Ne(r,this.__chain__).thru((function(n){return t&&!n.length&&n.push(void 0),n}))):this.thru(u)}));var ra=mu((function(n,t,e){Cn.call(n,e)?++n[e]:Ze(n,e,1)}));var ua=ku(Ni),ia=ku(Bi);function aa(n,t){return(Ba(n)?ct:nr)(n,Ju(t,3))}function oa(n,t){return(Ba(n)?lt:tr)(n,Ju(t,3))}var ca=mu((function(n,t,e){Cn.call(n,e)?n[e].push(t):Ze(n,e,[t])}));var la=Tr((function(n,t,e){var u=-1,i="function"==typeof t,a=Sa(n)?r(n.length):[];return nr(n,(function(n){a[++u]=i?at(t,n,e):_r(n,t,e)})),a})),fa=mu((function(n,t,e){Ze(n,e,t)}));function sa(n,t){return(Ba(n)?dt:xr)(n,Ju(t,3))}var va=mu((function(n,t,e){n[e?0:1].push(t)}),(function(){return[[],[]]}));var ha=Tr((function(n,t){if(null==n)return[];var e=t.length;return e>1&&oi(n,t[0],t[1])?t=[]:e>2&&oi(t[0],t[1],t[2])&&(t=[t[0]]),Br(n,ir(t,1),[])})),da=Qt||function(){return Hn.Date.now()};function pa(n,t,e){return t=e?void 0:t,Wu(n,128,void 0,void 0,void 0,void 0,t=n&&null==t?n.length:t)}function ga(n,t){var e;if("function"!=typeof t)throw new mn(i);return n=eo(n),function(){return--n>0&&(e=t.apply(this,arguments)),n<=1&&(t=void 0),e}}var Da=Tr((function(n,t,e){var r=1;if(e.length){var u=$t(e,Ku(Da));r|=32}return Wu(n,r,t,e,u)})),_a=Tr((function(n,t,e){var r=3;if(e.length){var u=$t(e,Ku(_a));r|=32}return Wu(t,r,n,e,u)}));function ma(n,t,e){var r,u,a,o,c,l,f=0,s=!1,v=!1,h=!0;if("function"!=typeof n)throw new mn(i);function d(t){var e=r,i=u;return r=u=void 0,f=t,o=n.apply(i,e)}function p(n){return f=n,c=mi(D,t),s?d(n):o}function g(n){var e=n-l;return void 0===l||e>=t||e<0||v&&n-f>=a}function D(){var n=da();if(g(n))return _(n);c=mi(D,function(n){var e=t-(n-l);return v?oe(e,a-(n-f)):e}(n))}function _(n){return c=void 0,h&&r?d(n):(r=u=void 0,o)}function m(){var n=da(),e=g(n);if(r=arguments,u=this,l=n,e){if(void 0===c)return p(l);if(v)return fu(c),c=mi(D,t),d(l)}return void 0===c&&(c=mi(D,t)),o}return t=uo(t)||0,Pa(e)&&(s=!!e.leading,a=(v="maxWait"in e)?ae(uo(e.maxWait)||0,t):a,h="trailing"in e?!!e.trailing:h),m.cancel=function(){void 0!==c&&fu(c),f=0,r=l=u=c=void 0},m.flush=function(){return void 0===c?o:_(da())},m}var ya=Tr((function(n,t){return Ye(n,1,t)})),ba=Tr((function(n,t,e){return Ye(n,uo(t)||0,e)}));function Ea(n,t){if("function"!=typeof n||null!=t&&"function"!=typeof t)throw new mn(i);var e=function(){var r=arguments,u=t?t.apply(this,r):r[0],i=e.cache;if(i.has(u))return i.get(u);var a=n.apply(this,r);return e.cache=i.set(u,a)||i,a};return e.cache=new(Ea.Cache||Le),e}function wa(n){if("function"!=typeof n)throw new mn(i);return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}Ea.Cache=Le;var Fa=cu((function(n,t){var e=(t=1==t.length&&Ba(t[0])?dt(t[0],Nt(Ju())):dt(ir(t,1),Nt(Ju()))).length;return Tr((function(r){for(var u=-1,i=oe(r.length,e);++u=t})),Na=mr(function(){return arguments}())?mr:function(n){return $a(n)&&Cn.call(n,"callee")&&!Kn.call(n,"callee")},Ba=r.isArray,Ia=nt?Nt(nt):function(n){return $a(n)&&hr(n)==w};function Sa(n){return null!=n&&Ua(n.length)&&!Wa(n)}function La(n){return $a(n)&&Sa(n)}var za=ee||ic,Ra=tt?Nt(tt):function(n){return $a(n)&&hr(n)==s};function Ta(n){if(!$a(n))return!1;var t=hr(n);return t==v||"[object DOMException]"==t||"string"==typeof n.message&&"string"==typeof n.name&&!Ga(n)}function Wa(n){if(!Pa(n))return!1;var t=hr(n);return t==h||t==d||"[object AsyncFunction]"==t||"[object Proxy]"==t}function Ma(n){return"number"==typeof n&&n==eo(n)}function Ua(n){return"number"==typeof n&&n>-1&&n%1==0&&n<=9007199254740991}function Pa(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function $a(n){return null!=n&&"object"==typeof n}var qa=et?Nt(et):function(n){return $a(n)&&ei(n)==p};function Va(n){return"number"==typeof n||$a(n)&&hr(n)==g}function Ga(n){if(!$a(n)||hr(n)!=D)return!1;var t=Gn(n);if(null===t)return!0;var e=Cn.call(t,"constructor")&&t.constructor;return"function"==typeof e&&e instanceof e&&Fn.call(e)==jn}var Za=rt?Nt(rt):function(n){return $a(n)&&hr(n)==_};var Ha=ut?Nt(ut):function(n){return $a(n)&&ei(n)==m};function Ka(n){return"string"==typeof n||!Ba(n)&&$a(n)&&hr(n)==y}function Ja(n){return"symbol"==typeof n||$a(n)&&hr(n)==b}var Qa=it?Nt(it):function(n){return $a(n)&&Ua(n.length)&&!!Un[hr(n)]};var Ya=Su(kr),Xa=Su((function(n,t){return n<=t}));function no(n){if(!n)return[];if(Sa(n))return Ka(n)?Zt(n):Du(n);if(Xn&&n[Xn])return function(n){for(var t,e=[];!(t=n.next()).done;)e.push(t.value);return e}(n[Xn]());var t=ei(n);return(t==p?Ut:t==m?qt:jo)(n)}function to(n){return n?(n=uo(n))===1/0||n===-1/0?17976931348623157e292*(n<0?-1:1):n==n?n:0:0===n?n:0}function eo(n){var t=to(n),e=t%1;return t==t?e?t-e:t:0}function ro(n){return n?Ke(eo(n),0,4294967295):0}function uo(n){if("number"==typeof n)return n;if(Ja(n))return NaN;if(Pa(n)){var t="function"==typeof n.valueOf?n.valueOf():n;n=Pa(t)?t+"":t}if("string"!=typeof n)return 0===n?n:+n;n=n.replace(H,"");var e=an.test(n);return e||cn.test(n)?Vn(n.slice(2),e?2:8):un.test(n)?NaN:+n}function io(n){return _u(n,bo(n))}function ao(n){return null==n?"":Qr(n)}var oo=yu((function(n,t){if(si(t)||Sa(t))_u(t,yo(t),n);else for(var e in t)Cn.call(t,e)&&$e(n,e,t[e])})),co=yu((function(n,t){_u(t,bo(t),n)})),lo=yu((function(n,t,e,r){_u(t,bo(t),n,r)})),fo=yu((function(n,t,e,r){_u(t,yo(t),n,r)})),so=qu(He);var vo=Tr((function(n,t){n=gn(n);var e=-1,r=t.length,u=r>2?t[2]:void 0;for(u&&oi(t[0],t[1],u)&&(r=1);++e1),t})),_u(n,Gu(n),e),r&&(e=Je(e,7,Pu));for(var u=t.length;u--;)Xr(e,t[u]);return e}));var Co=qu((function(n,t){return null==n?{}:function(n,t){return Ir(n,t,(function(t,e){return go(n,e)}))}(n,t)}));function ko(n,t){if(null==n)return{};var e=dt(Gu(n),(function(n){return[n]}));return t=Ju(t),Ir(n,e,(function(n,e){return t(n,e[0])}))}var xo=Tu(yo),Ao=Tu(bo);function jo(n){return null==n?[]:Bt(n,yo(n))}var Oo=Fu((function(n,t,e){return t=t.toLowerCase(),n+(e?No(t):t)}));function No(n){return Wo(ao(n).toLowerCase())}function Bo(n){return(n=ao(n))&&n.replace(fn,Rt).replace(Sn,"")}var Io=Fu((function(n,t,e){return n+(e?"-":"")+t.toLowerCase()})),So=Fu((function(n,t,e){return n+(e?" ":"")+t.toLowerCase()})),Lo=wu("toLowerCase");var zo=Fu((function(n,t,e){return n+(e?"_":"")+t.toLowerCase()}));var Ro=Fu((function(n,t,e){return n+(e?" ":"")+Wo(t)}));var To=Fu((function(n,t,e){return n+(e?" ":"")+t.toUpperCase()})),Wo=wu("toUpperCase");function Mo(n,t,e){return n=ao(n),void 0===(t=e?void 0:t)?function(n){return Tn.test(n)}(n)?function(n){return n.match(zn)||[]}(n):function(n){return n.match(nn)||[]}(n):n.match(t)||[]}var Uo=Tr((function(n,t){try{return at(n,void 0,t)}catch(e){return Ta(e)?e:new hn(e)}})),Po=qu((function(n,t){return ct(t,(function(t){t=Ci(t),Ze(n,t,Da(n[t],n))})),n}));function $o(n){return function(){return n}}var qo=xu(),Vo=xu(!0);function Go(n){return n}function Zo(n){return wr("function"==typeof n?n:Je(n,1))}var Ho=Tr((function(n,t){return function(e){return _r(e,n,t)}})),Ko=Tr((function(n,t){return function(e){return _r(n,e,t)}}));function Jo(n,t,e){var r=yo(t),u=fr(t,r);null!=e||Pa(t)&&(u.length||!r.length)||(e=t,t=n,n=this,u=fr(t,yo(t)));var i=!(Pa(e)&&"chain"in e&&!e.chain),a=Wa(n);return ct(u,(function(e){var r=t[e];n[e]=r,a&&(n.prototype[e]=function(){var t=this.__chain__;if(i||t){var e=n(this.__wrapped__),u=e.__actions__=Du(this.__actions__);return u.push({func:r,args:arguments,thisArg:n}),e.__chain__=t,e}return r.apply(n,pt([this.value()],arguments))})})),n}function Qo(){}var Yo=Nu(dt),Xo=Nu(ft),nc=Nu(_t);function tc(n){return ci(n)?kt(Ci(n)):function(n){return function(t){return sr(t,n)}}(n)}var ec=Iu(),rc=Iu(!0);function uc(){return[]}function ic(){return!1}var ac=Ou((function(n,t){return n+t}),0),oc=zu("ceil"),cc=Ou((function(n,t){return n/t}),1),lc=zu("floor");var fc,sc=Ou((function(n,t){return n*t}),1),vc=zu("round"),hc=Ou((function(n,t){return n-t}),0);return Ae.after=function(n,t){if("function"!=typeof t)throw new mn(i);return n=eo(n),function(){if(--n<1)return t.apply(this,arguments)}},Ae.ary=pa,Ae.assign=oo,Ae.assignIn=co,Ae.assignInWith=lo,Ae.assignWith=fo,Ae.at=so,Ae.before=ga,Ae.bind=Da,Ae.bindAll=Po,Ae.bindKey=_a,Ae.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return Ba(n)?n:[n]},Ae.chain=na,Ae.chunk=function(n,t,e){t=(e?oi(n,t,e):void 0===t)?1:ae(eo(t),0);var u=null==n?0:n.length;if(!u||t<1)return[];for(var i=0,a=0,o=r(Xt(u/t));iu?0:u+e),(r=void 0===r||r>u?u:eo(r))<0&&(r+=u),r=e>r?0:ro(r);e>>0)?(n=ao(n))&&("string"==typeof t||null!=t&&!Za(t))&&!(t=Qr(t))&&Mt(n)?lu(Zt(n),0,e):n.split(t,e):[]},Ae.spread=function(n,t){if("function"!=typeof n)throw new mn(i);return t=null==t?0:ae(eo(t),0),Tr((function(e){var r=e[t],u=lu(e,0,t);return r&&pt(u,r),at(n,this,u)}))},Ae.tail=function(n){var t=null==n?0:n.length;return t?Vr(n,1,t):[]},Ae.take=function(n,t,e){return n&&n.length?Vr(n,0,(t=e||void 0===t?1:eo(t))<0?0:t):[]},Ae.takeRight=function(n,t,e){var r=null==n?0:n.length;return r?Vr(n,(t=r-(t=e||void 0===t?1:eo(t)))<0?0:t,r):[]},Ae.takeRightWhile=function(n,t){return n&&n.length?tu(n,Ju(t,3),!1,!0):[]},Ae.takeWhile=function(n,t){return n&&n.length?tu(n,Ju(t,3)):[]},Ae.tap=function(n,t){return t(n),n},Ae.throttle=function(n,t,e){var r=!0,u=!0;if("function"!=typeof n)throw new mn(i);return Pa(e)&&(r="leading"in e?!!e.leading:r,u="trailing"in e?!!e.trailing:u),ma(n,t,{leading:r,maxWait:t,trailing:u})},Ae.thru=ta,Ae.toArray=no,Ae.toPairs=xo,Ae.toPairsIn=Ao,Ae.toPath=function(n){return Ba(n)?dt(n,Ci):Ja(n)?[n]:Du(Fi(ao(n)))},Ae.toPlainObject=io,Ae.transform=function(n,t,e){var r=Ba(n),u=r||za(n)||Qa(n);if(t=Ju(t,4),null==e){var i=n&&n.constructor;e=u?r?new i:[]:Pa(n)&&Wa(i)?je(Gn(n)):{}}return(u?ct:cr)(n,(function(n,r,u){return t(e,n,r,u)})),e},Ae.unary=function(n){return pa(n,1)},Ae.union=$i,Ae.unionBy=qi,Ae.unionWith=Vi,Ae.uniq=function(n){return n&&n.length?Yr(n):[]},Ae.uniqBy=function(n,t){return n&&n.length?Yr(n,Ju(t,2)):[]},Ae.uniqWith=function(n,t){return t="function"==typeof t?t:void 0,n&&n.length?Yr(n,void 0,t):[]},Ae.unset=function(n,t){return null==n||Xr(n,t)},Ae.unzip=Gi,Ae.unzipWith=Zi,Ae.update=function(n,t,e){return null==n?n:nu(n,t,au(e))},Ae.updateWith=function(n,t,e,r){return r="function"==typeof r?r:void 0,null==n?n:nu(n,t,au(e),r)},Ae.values=jo,Ae.valuesIn=function(n){return null==n?[]:Bt(n,bo(n))},Ae.without=Hi,Ae.words=Mo,Ae.wrap=function(n,t){return Ca(au(t),n)},Ae.xor=Ki,Ae.xorBy=Ji,Ae.xorWith=Qi,Ae.zip=Yi,Ae.zipObject=function(n,t){return uu(n||[],t||[],$e)},Ae.zipObjectDeep=function(n,t){return uu(n||[],t||[],Ur)},Ae.zipWith=Xi,Ae.entries=xo,Ae.entriesIn=Ao,Ae.extend=co,Ae.extendWith=lo,Jo(Ae,Ae),Ae.add=ac,Ae.attempt=Uo,Ae.camelCase=Oo,Ae.capitalize=No,Ae.ceil=oc,Ae.clamp=function(n,t,e){return void 0===e&&(e=t,t=void 0),void 0!==e&&(e=(e=uo(e))==e?e:0),void 0!==t&&(t=(t=uo(t))==t?t:0),Ke(uo(n),t,e)},Ae.clone=function(n){return Je(n,4)},Ae.cloneDeep=function(n){return Je(n,5)},Ae.cloneDeepWith=function(n,t){return Je(n,5,t="function"==typeof t?t:void 0)},Ae.cloneWith=function(n,t){return Je(n,4,t="function"==typeof t?t:void 0)},Ae.conformsTo=function(n,t){return null==t||Qe(n,t,yo(t))},Ae.deburr=Bo,Ae.defaultTo=function(n,t){return null==n||n!=n?t:n},Ae.divide=cc,Ae.endsWith=function(n,t,e){n=ao(n),t=Qr(t);var r=n.length,u=e=void 0===e?r:Ke(eo(e),0,r);return(e-=t.length)>=0&&n.slice(e,u)==t},Ae.eq=Aa,Ae.escape=function(n){return(n=ao(n))&&W.test(n)?n.replace(R,Tt):n},Ae.escapeRegExp=function(n){return(n=ao(n))&&Z.test(n)?n.replace(G,"\\$&"):n},Ae.every=function(n,t,e){var r=Ba(n)?ft:er;return e&&oi(n,t,e)&&(t=void 0),r(n,Ju(t,3))},Ae.find=ua,Ae.findIndex=Ni,Ae.findKey=function(n,t){return yt(n,Ju(t,3),cr)},Ae.findLast=ia,Ae.findLastIndex=Bi,Ae.findLastKey=function(n,t){return yt(n,Ju(t,3),lr)},Ae.floor=lc,Ae.forEach=aa,Ae.forEachRight=oa,Ae.forIn=function(n,t){return null==n?n:ar(n,Ju(t,3),bo)},Ae.forInRight=function(n,t){return null==n?n:or(n,Ju(t,3),bo)},Ae.forOwn=function(n,t){return n&&cr(n,Ju(t,3))},Ae.forOwnRight=function(n,t){return n&&lr(n,Ju(t,3))},Ae.get=po,Ae.gt=ja,Ae.gte=Oa,Ae.has=function(n,t){return null!=n&&ri(n,t,pr)},Ae.hasIn=go,Ae.head=Si,Ae.identity=Go,Ae.includes=function(n,t,e,r){n=Sa(n)?n:jo(n),e=e&&!r?eo(e):0;var u=n.length;return e<0&&(e=ae(u+e,0)),Ka(n)?e<=u&&n.indexOf(t,e)>-1:!!u&&Et(n,t,e)>-1},Ae.indexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=null==e?0:eo(e);return u<0&&(u=ae(r+u,0)),Et(n,t,u)},Ae.inRange=function(n,t,e){return t=to(t),void 0===e?(e=t,t=0):e=to(e),function(n,t,e){return n>=oe(t,e)&&n=-9007199254740991&&n<=9007199254740991},Ae.isSet=Ha,Ae.isString=Ka,Ae.isSymbol=Ja,Ae.isTypedArray=Qa,Ae.isUndefined=function(n){return void 0===n},Ae.isWeakMap=function(n){return $a(n)&&ei(n)==E},Ae.isWeakSet=function(n){return $a(n)&&"[object WeakSet]"==hr(n)},Ae.join=function(n,t){return null==n?"":ue.call(n,t)},Ae.kebabCase=Io,Ae.last=Ti,Ae.lastIndexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=r;return void 0!==e&&(u=(u=eo(e))<0?ae(r+u,0):oe(u,r-1)),t==t?function(n,t,e){for(var r=e+1;r--;)if(n[r]===t)return r;return r}(n,t,u):bt(n,Ft,u,!0)},Ae.lowerCase=So,Ae.lowerFirst=Lo,Ae.lt=Ya,Ae.lte=Xa,Ae.max=function(n){return n&&n.length?rr(n,Go,dr):void 0},Ae.maxBy=function(n,t){return n&&n.length?rr(n,Ju(t,2),dr):void 0},Ae.mean=function(n){return Ct(n,Go)},Ae.meanBy=function(n,t){return Ct(n,Ju(t,2))},Ae.min=function(n){return n&&n.length?rr(n,Go,kr):void 0},Ae.minBy=function(n,t){return n&&n.length?rr(n,Ju(t,2),kr):void 0},Ae.stubArray=uc,Ae.stubFalse=ic,Ae.stubObject=function(){return{}},Ae.stubString=function(){return""},Ae.stubTrue=function(){return!0},Ae.multiply=sc,Ae.nth=function(n,t){return n&&n.length?Nr(n,eo(t)):void 0},Ae.noConflict=function(){return Hn._===this&&(Hn._=On),this},Ae.noop=Qo,Ae.now=da,Ae.pad=function(n,t,e){n=ao(n);var r=(t=eo(t))?Gt(n):0;if(!t||r>=t)return n;var u=(t-r)/2;return Bu(ne(u),e)+n+Bu(Xt(u),e)},Ae.padEnd=function(n,t,e){n=ao(n);var r=(t=eo(t))?Gt(n):0;return t&&rt){var r=n;n=t,t=r}if(e||n%1||t%1){var u=fe();return oe(n+u*(t-n+qn("1e-"+((u+"").length-1))),t)}return zr(n,t)},Ae.reduce=function(n,t,e){var r=Ba(n)?gt:At,u=arguments.length<3;return r(n,Ju(t,4),e,u,nr)},Ae.reduceRight=function(n,t,e){var r=Ba(n)?Dt:At,u=arguments.length<3;return r(n,Ju(t,4),e,u,tr)},Ae.repeat=function(n,t,e){return t=(e?oi(n,t,e):void 0===t)?1:eo(t),Rr(ao(n),t)},Ae.replace=function(){var n=arguments,t=ao(n[0]);return n.length<3?t:t.replace(n[1],n[2])},Ae.result=function(n,t,e){var r=-1,u=(t=ou(t,n)).length;for(u||(u=1,n=void 0);++r9007199254740991)return[];var e=4294967295,r=oe(n,4294967295);n-=4294967295;for(var u=Ot(r,t=Ju(t));++e=i)return n;var o=e-Gt(r);if(o<1)return r;var c=a?lu(a,0,o).join(""):n.slice(0,o);if(void 0===u)return c+r;if(a&&(o+=c.length-o),Za(u)){if(n.slice(o).search(u)){var l,f=c;for(u.global||(u=Dn(u.source,ao(rn.exec(u))+"g")),u.lastIndex=0;l=u.exec(f);)var s=l.index;c=c.slice(0,void 0===s?o:s)}}else if(n.indexOf(Qr(u),o)!=o){var v=c.lastIndexOf(u);v>-1&&(c=c.slice(0,v))}return c+r},Ae.unescape=function(n){return(n=ao(n))&&T.test(n)?n.replace(z,Ht):n},Ae.uniqueId=function(n){var t=++kn;return ao(n)+t},Ae.upperCase=To,Ae.upperFirst=Wo,Ae.each=aa,Ae.eachRight=oa,Ae.first=Si,Jo(Ae,(fc={},cr(Ae,(function(n,t){Cn.call(Ae.prototype,t)||(fc[t]=n)})),fc),{chain:!1}),Ae.VERSION="4.17.15",ct(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(n){Ae[n].placeholder=Ae})),ct(["drop","take"],(function(n,t){Be.prototype[n]=function(e){e=void 0===e?1:ae(eo(e),0);var r=this.__filtered__&&!t?new Be(this):this.clone();return r.__filtered__?r.__takeCount__=oe(e,r.__takeCount__):r.__views__.push({size:oe(e,4294967295),type:n+(r.__dir__<0?"Right":"")}),r},Be.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}})),ct(["filter","map","takeWhile"],(function(n,t){var e=t+1,r=1==e||3==e;Be.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:Ju(n,3),type:e}),t.__filtered__=t.__filtered__||r,t}})),ct(["head","last"],(function(n,t){var e="take"+(t?"Right":"");Be.prototype[n]=function(){return this[e](1).value()[0]}})),ct(["initial","tail"],(function(n,t){var e="drop"+(t?"":"Right");Be.prototype[n]=function(){return this.__filtered__?new Be(this):this[e](1)}})),Be.prototype.compact=function(){return this.filter(Go)},Be.prototype.find=function(n){return this.filter(n).head()},Be.prototype.findLast=function(n){return this.reverse().find(n)},Be.prototype.invokeMap=Tr((function(n,t){return"function"==typeof n?new Be(this):this.map((function(e){return _r(e,n,t)}))})),Be.prototype.reject=function(n){return this.filter(wa(Ju(n)))},Be.prototype.slice=function(n,t){n=eo(n);var e=this;return e.__filtered__&&(n>0||t<0)?new Be(e):(n<0?e=e.takeRight(-n):n&&(e=e.drop(n)),void 0!==t&&(e=(t=eo(t))<0?e.dropRight(-t):e.take(t-n)),e)},Be.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Be.prototype.toArray=function(){return this.take(4294967295)},cr(Be.prototype,(function(n,t){var e=/^(?:filter|find|map|reject)|While$/.test(t),r=/^(?:head|last)$/.test(t),u=Ae[r?"take"+("last"==t?"Right":""):t],i=r||/^find/.test(t);u&&(Ae.prototype[t]=function(){var t=this.__wrapped__,a=r?[1]:arguments,o=t instanceof Be,c=a[0],l=o||Ba(t),f=function(n){var t=u.apply(Ae,pt([n],a));return r&&s?t[0]:t};l&&e&&"function"==typeof c&&1!=c.length&&(o=l=!1);var s=this.__chain__,v=!!this.__actions__.length,h=i&&!s,d=o&&!v;if(!i&&l){t=d?t:new Be(this);var p=n.apply(t,a);return p.__actions__.push({func:ta,args:[f],thisArg:void 0}),new Ne(p,s)}return h&&d?n.apply(this,a):(p=this.thru(f),h?r?p.value()[0]:p.value():p)})})),ct(["pop","push","shift","sort","splice","unshift"],(function(n){var t=yn[n],e=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",r=/^(?:pop|shift)$/.test(n);Ae.prototype[n]=function(){var n=arguments;if(r&&!this.__chain__){var u=this.value();return t.apply(Ba(u)?u:[],n)}return this[e]((function(e){return t.apply(Ba(e)?e:[],n)}))}})),cr(Be.prototype,(function(n,t){var e=Ae[t];if(e){var r=e.name+"";Cn.call(me,r)||(me[r]=[]),me[r].push({name:t,func:e})}})),me[Au(void 0,2).name]=[{name:"wrapper",func:void 0}],Be.prototype.clone=function(){var n=new Be(this.__wrapped__);return n.__actions__=Du(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Du(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Du(this.__views__),n},Be.prototype.reverse=function(){if(this.__filtered__){var n=new Be(this);n.__dir__=-1,n.__filtered__=!0}else(n=this.clone()).__dir__*=-1;return n},Be.prototype.value=function(){var n=this.__wrapped__.value(),t=this.__dir__,e=Ba(n),r=t<0,u=e?n.length:0,i=function(n,t,e){var r=-1,u=e.length;for(;++r=this.__values__.length;return{done:n,value:n?void 0:this.__values__[this.__index__++]}},Ae.prototype.plant=function(n){for(var t,e=this;e instanceof Oe;){var r=xi(e);r.__index__=0,r.__values__=void 0,t?u.__wrapped__=r:t=r;var u=r;e=e.__wrapped__}return u.__wrapped__=n,t},Ae.prototype.reverse=function(){var n=this.__wrapped__;if(n instanceof Be){var t=n;return this.__actions__.length&&(t=new Be(this)),(t=t.reverse()).__actions__.push({func:ta,args:[Pi],thisArg:void 0}),new Ne(t,this.__chain__)}return this.thru(Pi)},Ae.prototype.toJSON=Ae.prototype.valueOf=Ae.prototype.value=function(){return eu(this.__wrapped__,this.__actions__)},Ae.prototype.first=Ae.prototype.head,Xn&&(Ae.prototype[Xn]=function(){return this}),Ae}();Hn._=Kt,void 0===(u=function(){return Kt}.call(t,e,t,r))||(r.exports=u)}).call(this)}).call(this,e(76),e(496)(n))},494:function(n,t,e){"use strict";var r=e(0),u=Object(r.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=u},495:function(n,t,e){"use strict";e.d(t,"a",(function(){return i}));e(77),e(513),e(478),e(78);var r=e(515),u=e.n(r);function i(n,t){var e=new u.a;return n.map((function(n){var r=n;return"string"==typeof n&&(r={label:n,permalink:"/blog/tags/"+e.slug(n)}),function(n,t){var e=n.label.split(": ",2),r=e[0],u=e[1],i="primary";switch(t){case"blog":case"guides":i=function(n){switch(n){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(r)}return{category:r,count:n.count,label:n.label,permalink:n.permalink,style:i,value:u}}(r,t)}))}},496:function(n,t){n.exports=function(n){return n.webpackPolyfill||(n.deprecate=function(){},n.paths=[],n.children||(n.children=[]),Object.defineProperty(n,"loaded",{enumerable:!0,get:function(){return n.l}}),Object.defineProperty(n,"id",{enumerable:!0,get:function(){return n.i}}),n.webpackPolyfill=1),n}},505:function(n,t,e){var r=e(30),u=e(54),i=e(27),a=e(26),o=e(506);n.exports=function(n,t){var e=1==n,c=2==n,l=3==n,f=4==n,s=6==n,v=5==n||s,h=t||o;return function(t,o,d){for(var p,g,D=i(t),_=u(D),m=r(o,d,3),y=a(_.length),b=0,E=e?h(t,y):c?h(t,0):void 0;y>b;b++)if((v||b in _)&&(g=m(p=_[b],b,D),n))if(e)E[b]=g;else if(g)switch(n){case 3:return!0;case 5:return p;case 6:return b;case 2:E.push(p)}else if(f)return!1;return s?-1:l||f?f:E}}},506:function(n,t,e){var r=e(507);n.exports=function(n,t){return new(r(n))(t)}},507:function(n,t,e){var r=e(13),u=e(508),i=e(2)("species");n.exports=function(n){var t;return u(n)&&("function"!=typeof(t=n.constructor)||t!==Array&&!u(t.prototype)||(t=void 0),r(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},508:function(n,t,e){var r=e(23);n.exports=Array.isArray||function(n){return"Array"==r(n)}},514:function(n,t,e){"use strict";var r=e(0),u=e.n(r),i=e(470),a=e(463),o=e.n(a);t.a=function(n){var t=n.count,e=n.label,r=n.permalink,a=n.style,c=n.value,l=n.valueOnly;return u.a.createElement(i.a,{to:r+"/",className:o()("badge","badge--rounded","badge--"+a)},l?c:e,t&&u.a.createElement(u.a.Fragment,null," (",t,")"))}},515:function(n,t,e){var r=e(516);n.exports=o;var u=Object.hasOwnProperty,i=/\s/g,a=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function o(){if(!(this instanceof o))return new o;this.reset()}function c(n,t){return"string"!=typeof n?"":(t||(n=n.toLowerCase()),n.trim().replace(a,"").replace(r(),"").replace(i,"-"))}o.prototype.slug=function(n,t){for(var e=c(n,!0===t),r=e;u.call(this.occurrences,e);)this.occurrences[r]++,e=r+"-"+this.occurrences[r];return this.occurrences[e]=0,e},o.prototype.reset=function(){this.occurrences=Object.create(null)},o.slug=c},516:function(n,t){n.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},520:function(n,t,e){"use strict";var r=e(1),u=e(0),i=e.n(u),a=(e(470),e(514)),o=e(463),c=e.n(o),l=e(495),f=e(141),s=e.n(f);t.a=function(n){var t,e=n.block,u=n.colorProfile,o=n.tags,f=n.valuesOnly,v=Object(l.a)(o,u);return i.a.createElement("div",{className:c()(s.a.tags,(t={},t[s.a.tagsBlock]=e,t))},v.map((function(n,t){return i.a.createElement(a.a,Object(r.a)({key:t,valueOnly:f},n))})))}},556:function(n,t,e){"use strict";e(29),e(22),e(21),e(52);var r=e(0),u=e.n(r),i=(e(468),e(478),e(470)),a=e(484),o=e.n(a),c=e(520),l=e(495),f=e(476),s=e(485);e(142);var v=function(n){var t=n.frontMatter,e=n.metadata,r=(n.isGuidePage,Object(s.a)().isDarkTheme),a=e.categories,v=(e.description,e.permalink),h=(e.readingTime,e.seriesPosition),d=e.tags,p=(t.author_github,t.cover_label),g=(t.last_modified_on,t.title),D=Object(l.a)(d,"guides"),_=D.find((function(n){return"domain"==n.category})),m=_?_.value:"default",y=D.find((function(n){return"language"==n.category})),b=y?y.value:null,E=D.find((function(n){return"framework"==n.category})),w=E?E.value:null,F=D.find((function(n){return"technology"==n.category})),C=F?F.value:null,k=D.find((function(n){return"database"==n.category})),x=k?k.value:null,A=D.find((function(n){return"installation_guide"==n.category})),j=A?A.value:null,O=D.find((function(n){return"platform"==n.category})),N=O?O.value:null,B=D.find((function(n){return"source"==n.category})),I=B?B.value:null,S=D.find((function(n){return"sink"==n.category})),L=S?S.value:null,z=Object(f.a)().siteConfig.customFields.metadata,R=z.installation,T=z.sources,W=z.sinks,M=z.languages,U=z.frameworks,P=z.databases,$=z.technologies,q=z.installation_guides,V=R.platforms,G=N&&V[N],Z=I&&T[I],H=L&&W[L],K=b&&M.find((function(n){return n.name===b})),J=w&&U.find((function(n){return n.name===w})),Q=x&&P.find((function(n){return n.name===x})),Y=C&&$.find((function(n){return n.name===C})),X=j&&q.find((function(n){return n.name===j})),nn=null!==(G||Z),tn=null!=H,en=null;J?en=r?J.dark_logo_path:J.logo_path:Y?en=r?Y.dark_logo_path:Y.logo_path:Q?en=r?Q.dark_logo_path:Q.logo_path:X?en=r?X.dark_logo_path:X.logo_path:K?en=r?K.dark_logo_path:K.logo_path:G?en=G.logo_path:Z&&(en=Z.logo_path);var rn=null;return H&&(rn=H.logo_path),u.a.createElement(i.a,{to:v+"/",className:"guide-item"},u.a.createElement("article",null,u.a.createElement("div",{className:"domain-bg domain-bg--"+m+" domain-bg--hover"},u.a.createElement("header",null,u.a.createElement("div",{className:"category"},a[0].name),u.a.createElement("h2",{title:g},h&&h+". ",p||g)),u.a.createElement("footer",null,en&&u.a.createElement(o.a,{src:en,className:"logo"}),!en&&nn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),rn&&u.a.createElement(o.a,{src:rn,className:"logo"}),!rn&&tn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),!en&&!rn&&!nn&&!tn&&u.a.createElement(c.a,{colorProfile:"guides",tags:d}),u.a.createElement("div",{className:"action"},"read now")))))},h=e(490),d=e(491),p=e.n(d),g=e(463),D=e.n(g);e(143);function _(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered,a=p()(e).map((function(n){return n.content.metadata.categories[t-1]})).uniqBy("permalink").sortBy("title").keyBy("permalink").value(),o=p.a.groupBy(e,(function(n){return n.content.metadata.categories[t-1].permalink})),c=Object(h.a)("h"+(t+1));return Object.keys(a).map((function(n,t){var e=o[n],l=a[n];return u.a.createElement("section",{key:t},u.a.createElement(c,{id:n},l.title),l.description&&u.a.createElement("div",{className:"sub-title"},l.description),u.a.createElement(m,{items:e,large:r,staggered:i}))}))}function m(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered;if(t)return u.a.createElement(_,{groupLevel:t,items:e});var a,o=(a=e,p.a.sortBy(a,["content.metadata.seriesPosition",function(n){return n.content.metadata.coverLabel.toLowerCase()}]));return u.a.createElement("div",{className:"guides"},u.a.createElement("div",{className:D()("guide-items",{"guide-items--l":r,"guide-items--staggered":i})},o.map((function(n){var t=n.content;return u.a.createElement(v,{key:t.metadata.permalink,frontMatter:t.frontMatter,metadata:t.metadata,truncated:t.metadata.truncated},u.a.createElement(t,null))}))))}t.a=m}}]); \ No newline at end of file +/*! For license information please see 004ec9e5.a87d57ac.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{153:function(n,t,e){"use strict";e.r(t);e(468);var r=e(0),u=e.n(r),i=e(487),a=e(556),o=e(470);t.default=function(n){var t=n.metadata,e=n.items,r=t.allTagsPath,c=t.name,l=t.count;return u.a.createElement(i.a,{title:'Guides tagged "'+c+'"',description:'Guide | Tagged "'+c+'"'},u.a.createElement("header",{className:"hero hero--clean"},u.a.createElement("div",{className:"container"},u.a.createElement("h1",null,l," ",function(n,t){return n>1?t+"s":t}(l,"guide"),' tagged with "',c,'"'),u.a.createElement("div",{className:"hero--subtitle"},u.a.createElement(o.a,{href:r},"View All Tags")))),u.a.createElement("main",{className:"container container--s"},u.a.createElement(a.a,{items:e})))}},463:function(n,t,e){var r;!function(){"use strict";var e={}.hasOwnProperty;function u(){for(var n=[],t=0;t1?arguments[1]:void 0)}}),e(74)("find")},487:function(n,t,e){"use strict";e(497);var r=e(0),u=e.n(r),i=e(498),a=e(486),o=e(1),c=(e(488),e(489),e(499),e(470)),l=e(500),f=e(484),s=e.n(f),v=e(501),h=e.n(v),d=e(476),p=e(463),g=e.n(p),D=e(135),_=e.n(D),m=function(){return u.a.createElement("span",{className:g()(_.a.toggle,_.a.moon)})},y=function(){return u.a.createElement("span",{className:g()(_.a.toggle,_.a.sun)})},b=function(n){var t=Object(d.a)().isClient;return u.a.createElement(h.a,Object(o.a)({disabled:!t,icons:{checked:u.a.createElement(m,null),unchecked:u.a.createElement(y,null)}},n))};function E(){var n=Object(d.a)().siteConfig,t=(void 0===n?{}:n).customFields.metadata.latest_post,e=Date.parse(t.date),r=new Date,u=Math.abs(r-e),i=Math.ceil(u/864e5),a=null;return"undefined"!=typeof window&&(a=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!a||a0&&u.a.createElement("div",{className:"row footer__links"},u.a.createElement("div",{className:"col col--5 footer__col"},u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement(s.a,{className:"navbar__logo",src:h,alt:"Qovery",width:"150",height:"auto"})),u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),u.a.createElement("div",null,u.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},u.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},u.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},u.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),c.map((function(n,t){return u.a.createElement("div",{key:t,className:"col footer__col"},null!=n.title?u.a.createElement("h4",{className:"footer__title"},n.title):null,null!=n.items&&Array.isArray(n.items)&&n.items.length>0?u.a.createElement("ul",{className:"footer__items"},n.items.map((function(n,t){return n.html?u.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):u.a.createElement("li",{key:n.href||n.to,className:"footer__item"},u.a.createElement(z,n))}))):null)}))),(f||a)&&u.a.createElement("div",{className:"text--center"},f&&f.src&&u.a.createElement("div",{className:"margin-bottom--sm"},f.href?u.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:L.a.footerLogoLink},u.a.createElement(R,{alt:f.alt,url:v})):u.a.createElement(R,{alt:f.alt,url:v})),u.a.createElement("small",null,a),u.a.createElement("br",null))))},W=e(502),M=e(503),U=e(3);e(138);t.a=function(n){var t=Object(d.a)().siteConfig,e=void 0===t?{}:t,r=e.title,o=e.themeConfig.image,c=e.url,l=n.children,f=n.title,s=n.noFooter,v=n.description,h=n.image,p=n.keywords,g=n.version,D=f?f+" | "+r:r,_=h||o,m=c+Object(F.a)(_),y=Object(U.h)(),b=y?"https://docs.qovery.com"+(y.pathname.endsWith("/")?y.pathname:y.pathname+"/"):null;return u.a.createElement(M.a,null,u.a.createElement(W.a,null,u.a.createElement(a.a,null,u.a.createElement("html",{lang:"en"}),u.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),D&&u.a.createElement("title",null,D),D&&u.a.createElement("meta",{property:"og:title",content:D}),u.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),u.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),u.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),u.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),u.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),u.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),u.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),u.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),v&&u.a.createElement("meta",{name:"description",content:v}),v&&u.a.createElement("meta",{property:"og:description",content:v}),g&&u.a.createElement("meta",{name:"docsearch:version",content:g}),p&&p.length&&u.a.createElement("meta",{name:"keywords",content:p.join(",")}),_&&u.a.createElement("meta",{property:"og:image",content:m}),_&&u.a.createElement("meta",{property:"twitter:image",content:m}),_&&u.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+D}),b&&u.a.createElement("meta",{property:"og:url",content:b}),u.a.createElement("meta",{name:"twitter:card",content:"summary"}),b&&u.a.createElement("link",{rel:"canonical",href:b})),u.a.createElement(i.a,null),u.a.createElement(B,null),u.a.createElement("div",{className:"main-wrapper"},l),!s&&u.a.createElement(T,null)))}},490:function(n,t,e){"use strict";var r=e(9),u=e(0),i=e.n(u),a=e(463),o=e.n(a),c=e(476),l=(e(139),e(140)),f=e.n(l);t.a=function(n){return function(t){var e,u=t.id,a=Object(r.a)(t,["id"]),l=Object(c.a)().siteConfig,s=(l=void 0===l?{}:l).themeConfig,v=(s=void 0===s?{}:s).navbar,h=(v=void 0===v?{}:v).hideOnScroll,d=void 0!==h&&h;return u?i.a.createElement(n,a,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:o()("anchor",(e={},e[f.a.enhancedAnchor]=!d,e)),id:u}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+u,title:"Direct link to heading"},"#"),a.children):i.a.createElement(n,a)}}},491:function(n,t,e){(function(n,r){var u;(function(){var i="Expected a function",a="__lodash_placeholder__",o=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",f="[object Boolean]",s="[object Date]",v="[object Error]",h="[object Function]",d="[object GeneratorFunction]",p="[object Map]",g="[object Number]",D="[object Object]",_="[object RegExp]",m="[object Set]",y="[object String]",b="[object Symbol]",E="[object WeakMap]",w="[object ArrayBuffer]",F="[object DataView]",C="[object Float32Array]",k="[object Float64Array]",x="[object Int8Array]",A="[object Int16Array]",j="[object Int32Array]",O="[object Uint8Array]",N="[object Uint16Array]",B="[object Uint32Array]",I=/\b__p \+= '';/g,S=/\b(__p \+=) '' \+/g,L=/(__e\(.*?\)|\b__t\)) \+\n'';/g,z=/&(?:amp|lt|gt|quot|#39);/g,R=/[&<>"']/g,T=RegExp(z.source),W=RegExp(R.source),M=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,P=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,q=/^\w*$/,V=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,G=/[\\^$.*+?()[\]{}|]/g,Z=RegExp(G.source),H=/^\s+|\s+$/g,K=/^\s+/,J=/\s+$/,Q=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,nn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,tn=/\\(\\)?/g,en=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,rn=/\w*$/,un=/^[-+]0x[0-9a-f]+$/i,an=/^0b[01]+$/i,on=/^\[object .+?Constructor\]$/,cn=/^0o[0-7]+$/i,ln=/^(?:0|[1-9]\d*)$/,fn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,sn=/($^)/,vn=/['\n\r\u2028\u2029\\]/g,hn="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",dn="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",pn="[\\ud800-\\udfff]",gn="["+dn+"]",Dn="["+hn+"]",_n="\\d+",mn="[\\u2700-\\u27bf]",yn="[a-z\\xdf-\\xf6\\xf8-\\xff]",bn="[^\\ud800-\\udfff"+dn+_n+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",En="\\ud83c[\\udffb-\\udfff]",wn="[^\\ud800-\\udfff]",Fn="(?:\\ud83c[\\udde6-\\uddff]){2}",Cn="[\\ud800-\\udbff][\\udc00-\\udfff]",kn="[A-Z\\xc0-\\xd6\\xd8-\\xde]",xn="(?:"+yn+"|"+bn+")",An="(?:"+kn+"|"+bn+")",jn="(?:"+Dn+"|"+En+")"+"?",On="[\\ufe0e\\ufe0f]?"+jn+("(?:\\u200d(?:"+[wn,Fn,Cn].join("|")+")[\\ufe0e\\ufe0f]?"+jn+")*"),Nn="(?:"+[mn,Fn,Cn].join("|")+")"+On,Bn="(?:"+[wn+Dn+"?",Dn,Fn,Cn,pn].join("|")+")",In=RegExp("['\u2019]","g"),Sn=RegExp(Dn,"g"),Ln=RegExp(En+"(?="+En+")|"+Bn+On,"g"),zn=RegExp([kn+"?"+yn+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[gn,kn,"$"].join("|")+")",An+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[gn,kn+xn,"$"].join("|")+")",kn+"?"+xn+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",kn+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",_n,Nn].join("|"),"g"),Rn=RegExp("[\\u200d\\ud800-\\udfff"+hn+"\\ufe0e\\ufe0f]"),Tn=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Mn=-1,Un={};Un[C]=Un[k]=Un[x]=Un[A]=Un[j]=Un[O]=Un["[object Uint8ClampedArray]"]=Un[N]=Un[B]=!0,Un[c]=Un[l]=Un[w]=Un[f]=Un[F]=Un[s]=Un[v]=Un[h]=Un[p]=Un[g]=Un[D]=Un[_]=Un[m]=Un[y]=Un[E]=!1;var Pn={};Pn[c]=Pn[l]=Pn[w]=Pn[F]=Pn[f]=Pn[s]=Pn[C]=Pn[k]=Pn[x]=Pn[A]=Pn[j]=Pn[p]=Pn[g]=Pn[D]=Pn[_]=Pn[m]=Pn[y]=Pn[b]=Pn[O]=Pn["[object Uint8ClampedArray]"]=Pn[N]=Pn[B]=!0,Pn[v]=Pn[h]=Pn[E]=!1;var $n={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},qn=parseFloat,Vn=parseInt,Gn="object"==typeof n&&n&&n.Object===Object&&n,Zn="object"==typeof self&&self&&self.Object===Object&&self,Hn=Gn||Zn||Function("return this")(),Kn=t&&!t.nodeType&&t,Jn=Kn&&"object"==typeof r&&r&&!r.nodeType&&r,Qn=Jn&&Jn.exports===Kn,Yn=Qn&&Gn.process,Xn=function(){try{var n=Jn&&Jn.require&&Jn.require("util").types;return n||Yn&&Yn.binding&&Yn.binding("util")}catch(t){}}(),nt=Xn&&Xn.isArrayBuffer,tt=Xn&&Xn.isDate,et=Xn&&Xn.isMap,rt=Xn&&Xn.isRegExp,ut=Xn&&Xn.isSet,it=Xn&&Xn.isTypedArray;function at(n,t,e){switch(e.length){case 0:return n.call(t);case 1:return n.call(t,e[0]);case 2:return n.call(t,e[0],e[1]);case 3:return n.call(t,e[0],e[1],e[2])}return n.apply(t,e)}function ot(n,t,e,r){for(var u=-1,i=null==n?0:n.length;++u-1}function ht(n,t,e){for(var r=-1,u=null==n?0:n.length;++r-1;);return e}function Lt(n,t){for(var e=n.length;e--&&Et(t,n[e],0)>-1;);return e}function zt(n,t){for(var e=n.length,r=0;e--;)n[e]===t&&++r;return r}var Rt=xt({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Tt=xt({"&":"&","<":"<",">":">",'"':""","'":"'"});function Wt(n){return"\\"+$n[n]}function Mt(n){return Rn.test(n)}function Ut(n){var t=-1,e=Array(n.size);return n.forEach((function(n,r){e[++t]=[r,n]})),e}function Pt(n,t){return function(e){return n(t(e))}}function $t(n,t){for(var e=-1,r=n.length,u=0,i=[];++e",""":'"',"'":"'"});var Kt=function n(t){var e,r=(t=null==t?Hn:Kt.defaults(Hn.Object(),t,Kt.pick(Hn,Wn))).Array,u=t.Date,hn=t.Error,dn=t.Function,pn=t.Math,gn=t.Object,Dn=t.RegExp,_n=t.String,mn=t.TypeError,yn=r.prototype,bn=dn.prototype,En=gn.prototype,wn=t["__core-js_shared__"],Fn=bn.toString,Cn=En.hasOwnProperty,kn=0,xn=(e=/[^.]+$/.exec(wn&&wn.keys&&wn.keys.IE_PROTO||""))?"Symbol(src)_1."+e:"",An=En.toString,jn=Fn.call(gn),On=Hn._,Nn=Dn("^"+Fn.call(Cn).replace(G,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Bn=Qn?t.Buffer:void 0,Ln=t.Symbol,Rn=t.Uint8Array,$n=Bn?Bn.allocUnsafe:void 0,Gn=Pt(gn.getPrototypeOf,gn),Zn=gn.create,Kn=En.propertyIsEnumerable,Jn=yn.splice,Yn=Ln?Ln.isConcatSpreadable:void 0,Xn=Ln?Ln.iterator:void 0,mt=Ln?Ln.toStringTag:void 0,xt=function(){try{var n=Xu(gn,"defineProperty");return n({},"",{}),n}catch(t){}}(),Jt=t.clearTimeout!==Hn.clearTimeout&&t.clearTimeout,Qt=u&&u.now!==Hn.Date.now&&u.now,Yt=t.setTimeout!==Hn.setTimeout&&t.setTimeout,Xt=pn.ceil,ne=pn.floor,te=gn.getOwnPropertySymbols,ee=Bn?Bn.isBuffer:void 0,re=t.isFinite,ue=yn.join,ie=Pt(gn.keys,gn),ae=pn.max,oe=pn.min,ce=u.now,le=t.parseInt,fe=pn.random,se=yn.reverse,ve=Xu(t,"DataView"),he=Xu(t,"Map"),de=Xu(t,"Promise"),pe=Xu(t,"Set"),ge=Xu(t,"WeakMap"),De=Xu(gn,"create"),_e=ge&&new ge,me={},ye=ki(ve),be=ki(he),Ee=ki(de),we=ki(pe),Fe=ki(ge),Ce=Ln?Ln.prototype:void 0,ke=Ce?Ce.valueOf:void 0,xe=Ce?Ce.toString:void 0;function Ae(n){if($a(n)&&!Ba(n)&&!(n instanceof Be)){if(n instanceof Ne)return n;if(Cn.call(n,"__wrapped__"))return xi(n)}return new Ne(n)}var je=function(){function n(){}return function(t){if(!Pa(t))return{};if(Zn)return Zn(t);n.prototype=t;var e=new n;return n.prototype=void 0,e}}();function Oe(){}function Ne(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Be(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Ie(n){var t=-1,e=null==n?0:n.length;for(this.clear();++t=t?n:t)),n}function Je(n,t,e,r,u,i){var a,o=1&t,l=2&t,v=4&t;if(e&&(a=u?e(n,r,u,i):e(n)),void 0!==a)return a;if(!Pa(n))return n;var E=Ba(n);if(E){if(a=function(n){var t=n.length,e=new n.constructor(t);t&&"string"==typeof n[0]&&Cn.call(n,"index")&&(e.index=n.index,e.input=n.input);return e}(n),!o)return Du(n,a)}else{var I=ei(n),S=I==h||I==d;if(za(n))return su(n,o);if(I==D||I==c||S&&!u){if(a=l||S?{}:ui(n),!o)return l?function(n,t){return _u(n,ti(n),t)}(n,function(n,t){return n&&_u(t,bo(t),n)}(a,n)):function(n,t){return _u(n,ni(n),t)}(n,Ge(a,n))}else{if(!Pn[I])return u?n:{};a=function(n,t,e){var r=n.constructor;switch(t){case w:return vu(n);case f:case s:return new r(+n);case F:return function(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.byteLength)}(n,e);case C:case k:case x:case A:case j:case O:case"[object Uint8ClampedArray]":case N:case B:return hu(n,e);case p:return new r;case g:case y:return new r(n);case _:return function(n){var t=new n.constructor(n.source,rn.exec(n));return t.lastIndex=n.lastIndex,t}(n);case m:return new r;case b:return u=n,ke?gn(ke.call(u)):{}}var u}(n,I,o)}}i||(i=new Re);var L=i.get(n);if(L)return L;i.set(n,a),Ha(n)?n.forEach((function(r){a.add(Je(r,t,e,r,n,i))})):qa(n)&&n.forEach((function(r,u){a.set(u,Je(r,t,e,u,n,i))}));var z=E?void 0:(v?l?Gu:Vu:l?bo:yo)(n);return ct(z||n,(function(r,u){z&&(r=n[u=r]),$e(a,u,Je(r,t,e,u,n,i))})),a}function Qe(n,t,e){var r=e.length;if(null==n)return!r;for(n=gn(n);r--;){var u=e[r],i=t[u],a=n[u];if(void 0===a&&!(u in n)||!i(a))return!1}return!0}function Ye(n,t,e){if("function"!=typeof n)throw new mn(i);return mi((function(){n.apply(void 0,e)}),t)}function Xe(n,t,e,r){var u=-1,i=vt,a=!0,o=n.length,c=[],l=t.length;if(!o)return c;e&&(t=dt(t,Nt(e))),r?(i=ht,a=!1):t.length>=200&&(i=It,a=!1,t=new ze(t));n:for(;++u-1},Se.prototype.set=function(n,t){var e=this.__data__,r=qe(e,n);return r<0?(++this.size,e.push([n,t])):e[r][1]=t,this},Le.prototype.clear=function(){this.size=0,this.__data__={hash:new Ie,map:new(he||Se),string:new Ie}},Le.prototype.delete=function(n){var t=Qu(this,n).delete(n);return this.size-=t?1:0,t},Le.prototype.get=function(n){return Qu(this,n).get(n)},Le.prototype.has=function(n){return Qu(this,n).has(n)},Le.prototype.set=function(n,t){var e=Qu(this,n),r=e.size;return e.set(n,t),this.size+=e.size==r?0:1,this},ze.prototype.add=ze.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},ze.prototype.has=function(n){return this.__data__.has(n)},Re.prototype.clear=function(){this.__data__=new Se,this.size=0},Re.prototype.delete=function(n){var t=this.__data__,e=t.delete(n);return this.size=t.size,e},Re.prototype.get=function(n){return this.__data__.get(n)},Re.prototype.has=function(n){return this.__data__.has(n)},Re.prototype.set=function(n,t){var e=this.__data__;if(e instanceof Se){var r=e.__data__;if(!he||r.length<199)return r.push([n,t]),this.size=++e.size,this;e=this.__data__=new Le(r)}return e.set(n,t),this.size=e.size,this};var nr=bu(cr),tr=bu(lr,!0);function er(n,t){var e=!0;return nr(n,(function(n,r,u){return e=!!t(n,r,u)})),e}function rr(n,t,e){for(var r=-1,u=n.length;++r0&&e(o)?t>1?ir(o,t-1,e,r,u):pt(u,o):r||(u[u.length]=o)}return u}var ar=Eu(),or=Eu(!0);function cr(n,t){return n&&ar(n,t,yo)}function lr(n,t){return n&&or(n,t,yo)}function fr(n,t){return st(t,(function(t){return Wa(n[t])}))}function sr(n,t){for(var e=0,r=(t=ou(t,n)).length;null!=n&&et}function pr(n,t){return null!=n&&Cn.call(n,t)}function gr(n,t){return null!=n&&t in gn(n)}function Dr(n,t,e){for(var u=e?ht:vt,i=n[0].length,a=n.length,o=a,c=r(a),l=1/0,f=[];o--;){var s=n[o];o&&t&&(s=dt(s,Nt(t))),l=oe(s.length,l),c[o]=!e&&(t||i>=120&&s.length>=120)?new ze(o&&s):void 0}s=n[0];var v=-1,h=c[0];n:for(;++v=o)return c;var l=e[r];return c*("desc"==l?-1:1)}}return n.index-t.index}(n,t,e)}))}function Ir(n,t,e){for(var r=-1,u=t.length,i={};++r-1;)o!==n&&Jn.call(o,c,1),Jn.call(n,c,1);return n}function Lr(n,t){for(var e=n?t.length:0,r=e-1;e--;){var u=t[e];if(e==r||u!==i){var i=u;ai(u)?Jn.call(n,u,1):Xr(n,u)}}return n}function zr(n,t){return n+ne(fe()*(t-n+1))}function Rr(n,t){var e="";if(!n||t<1||t>9007199254740991)return e;do{t%2&&(e+=n),(t=ne(t/2))&&(n+=n)}while(t);return e}function Tr(n,t){return yi(di(n,t,Go),n+"")}function Wr(n){return We(jo(n))}function Mr(n,t){var e=jo(n);return wi(e,Ke(t,0,e.length))}function Ur(n,t,e,r){if(!Pa(n))return n;for(var u=-1,i=(t=ou(t,n)).length,a=i-1,o=n;null!=o&&++ui?0:i+t),(e=e>i?i:e)<0&&(e+=i),i=t>e?0:e-t>>>0,t>>>=0;for(var a=r(i);++u>>1,a=n[i];null!==a&&!Ja(a)&&(e?a<=t:a=200){var l=t?null:Ru(n);if(l)return qt(l);a=!1,u=It,c=new ze}else c=t?[]:o;n:for(;++r=r?n:Vr(n,t,e)}var fu=Jt||function(n){return Hn.clearTimeout(n)};function su(n,t){if(t)return n.slice();var e=n.length,r=$n?$n(e):new n.constructor(e);return n.copy(r),r}function vu(n){var t=new n.constructor(n.byteLength);return new Rn(t).set(new Rn(n)),t}function hu(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.length)}function du(n,t){if(n!==t){var e=void 0!==n,r=null===n,u=n==n,i=Ja(n),a=void 0!==t,o=null===t,c=t==t,l=Ja(t);if(!o&&!l&&!i&&n>t||i&&a&&c&&!o&&!l||r&&a&&c||!e&&c||!u)return 1;if(!r&&!i&&!l&&n1?e[u-1]:void 0,a=u>2?e[2]:void 0;for(i=n.length>3&&"function"==typeof i?(u--,i):void 0,a&&oi(e[0],e[1],a)&&(i=u<3?void 0:i,u=1),t=gn(t);++r-1?u[i?t[a]:a]:void 0}}function xu(n){return qu((function(t){var e=t.length,r=e,u=Ne.prototype.thru;for(n&&t.reverse();r--;){var a=t[r];if("function"!=typeof a)throw new mn(i);if(u&&!o&&"wrapper"==Hu(a))var o=new Ne([],!0)}for(r=o?r:e;++r1&&m.reverse(),s&&l<_&&(m.length=l),this&&this!==Hn&&this instanceof D&&(C=g||Cu(C)),C.apply(F,m)}}function ju(n,t){return function(e,r){return function(n,t,e,r){return cr(n,(function(n,u,i){t(r,e(n),u,i)})),r}(e,n,t(r),{})}}function Ou(n,t){return function(e,r){var u;if(void 0===e&&void 0===r)return t;if(void 0!==e&&(u=e),void 0!==r){if(void 0===u)return r;"string"==typeof e||"string"==typeof r?(e=Qr(e),r=Qr(r)):(e=Jr(e),r=Jr(r)),u=n(e,r)}return u}}function Nu(n){return qu((function(t){return t=dt(t,Nt(Ju())),Tr((function(e){var r=this;return n(t,(function(n){return at(n,r,e)}))}))}))}function Bu(n,t){var e=(t=void 0===t?" ":Qr(t)).length;if(e<2)return e?Rr(t,n):t;var r=Rr(t,Xt(n/Gt(t)));return Mt(t)?lu(Zt(r),0,n).join(""):r.slice(0,n)}function Iu(n){return function(t,e,u){return u&&"number"!=typeof u&&oi(t,e,u)&&(e=u=void 0),t=to(t),void 0===e?(e=t,t=0):e=to(e),function(n,t,e,u){for(var i=-1,a=ae(Xt((t-n)/(e||1)),0),o=r(a);a--;)o[u?a:++i]=n,n+=e;return o}(t,e,u=void 0===u?to))return!1;var l=i.get(n);if(l&&i.get(t))return l==t;var f=-1,s=!0,v=2&e?new ze:void 0;for(i.set(n,t),i.set(t,n);++f-1&&n%1==0&&n1?"& ":"")+t[r],t=t.join(e>2?", ":" "),n.replace(Q,"{\n/* [wrapped with "+t+"] */\n")}(r,function(n,t){return ct(o,(function(e){var r="_."+e[0];t&e[1]&&!vt(n,r)&&n.push(r)})),n.sort()}(function(n){var t=n.match(Y);return t?t[1].split(X):[]}(r),e)))}function Ei(n){var t=0,e=0;return function(){var r=ce(),u=16-(r-e);if(e=r,u>0){if(++t>=800)return arguments[0]}else t=0;return n.apply(void 0,arguments)}}function wi(n,t){var e=-1,r=n.length,u=r-1;for(t=void 0===t?r:t;++e1?n[t-1]:void 0;return e="function"==typeof e?(n.pop(),e):void 0,Zi(n,e)}));function na(n){var t=Ae(n);return t.__chain__=!0,t}function ta(n,t){return t(n)}var ea=qu((function(n){var t=n.length,e=t?n[0]:0,r=this.__wrapped__,u=function(t){return He(t,n)};return!(t>1||this.__actions__.length)&&r instanceof Be&&ai(e)?((r=r.slice(e,+e+(t?1:0))).__actions__.push({func:ta,args:[u],thisArg:void 0}),new Ne(r,this.__chain__).thru((function(n){return t&&!n.length&&n.push(void 0),n}))):this.thru(u)}));var ra=mu((function(n,t,e){Cn.call(n,e)?++n[e]:Ze(n,e,1)}));var ua=ku(Ni),ia=ku(Bi);function aa(n,t){return(Ba(n)?ct:nr)(n,Ju(t,3))}function oa(n,t){return(Ba(n)?lt:tr)(n,Ju(t,3))}var ca=mu((function(n,t,e){Cn.call(n,e)?n[e].push(t):Ze(n,e,[t])}));var la=Tr((function(n,t,e){var u=-1,i="function"==typeof t,a=Sa(n)?r(n.length):[];return nr(n,(function(n){a[++u]=i?at(t,n,e):_r(n,t,e)})),a})),fa=mu((function(n,t,e){Ze(n,e,t)}));function sa(n,t){return(Ba(n)?dt:xr)(n,Ju(t,3))}var va=mu((function(n,t,e){n[e?0:1].push(t)}),(function(){return[[],[]]}));var ha=Tr((function(n,t){if(null==n)return[];var e=t.length;return e>1&&oi(n,t[0],t[1])?t=[]:e>2&&oi(t[0],t[1],t[2])&&(t=[t[0]]),Br(n,ir(t,1),[])})),da=Qt||function(){return Hn.Date.now()};function pa(n,t,e){return t=e?void 0:t,Wu(n,128,void 0,void 0,void 0,void 0,t=n&&null==t?n.length:t)}function ga(n,t){var e;if("function"!=typeof t)throw new mn(i);return n=eo(n),function(){return--n>0&&(e=t.apply(this,arguments)),n<=1&&(t=void 0),e}}var Da=Tr((function(n,t,e){var r=1;if(e.length){var u=$t(e,Ku(Da));r|=32}return Wu(n,r,t,e,u)})),_a=Tr((function(n,t,e){var r=3;if(e.length){var u=$t(e,Ku(_a));r|=32}return Wu(t,r,n,e,u)}));function ma(n,t,e){var r,u,a,o,c,l,f=0,s=!1,v=!1,h=!0;if("function"!=typeof n)throw new mn(i);function d(t){var e=r,i=u;return r=u=void 0,f=t,o=n.apply(i,e)}function p(n){return f=n,c=mi(D,t),s?d(n):o}function g(n){var e=n-l;return void 0===l||e>=t||e<0||v&&n-f>=a}function D(){var n=da();if(g(n))return _(n);c=mi(D,function(n){var e=t-(n-l);return v?oe(e,a-(n-f)):e}(n))}function _(n){return c=void 0,h&&r?d(n):(r=u=void 0,o)}function m(){var n=da(),e=g(n);if(r=arguments,u=this,l=n,e){if(void 0===c)return p(l);if(v)return fu(c),c=mi(D,t),d(l)}return void 0===c&&(c=mi(D,t)),o}return t=uo(t)||0,Pa(e)&&(s=!!e.leading,a=(v="maxWait"in e)?ae(uo(e.maxWait)||0,t):a,h="trailing"in e?!!e.trailing:h),m.cancel=function(){void 0!==c&&fu(c),f=0,r=l=u=c=void 0},m.flush=function(){return void 0===c?o:_(da())},m}var ya=Tr((function(n,t){return Ye(n,1,t)})),ba=Tr((function(n,t,e){return Ye(n,uo(t)||0,e)}));function Ea(n,t){if("function"!=typeof n||null!=t&&"function"!=typeof t)throw new mn(i);var e=function(){var r=arguments,u=t?t.apply(this,r):r[0],i=e.cache;if(i.has(u))return i.get(u);var a=n.apply(this,r);return e.cache=i.set(u,a)||i,a};return e.cache=new(Ea.Cache||Le),e}function wa(n){if("function"!=typeof n)throw new mn(i);return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}Ea.Cache=Le;var Fa=cu((function(n,t){var e=(t=1==t.length&&Ba(t[0])?dt(t[0],Nt(Ju())):dt(ir(t,1),Nt(Ju()))).length;return Tr((function(r){for(var u=-1,i=oe(r.length,e);++u=t})),Na=mr(function(){return arguments}())?mr:function(n){return $a(n)&&Cn.call(n,"callee")&&!Kn.call(n,"callee")},Ba=r.isArray,Ia=nt?Nt(nt):function(n){return $a(n)&&hr(n)==w};function Sa(n){return null!=n&&Ua(n.length)&&!Wa(n)}function La(n){return $a(n)&&Sa(n)}var za=ee||ic,Ra=tt?Nt(tt):function(n){return $a(n)&&hr(n)==s};function Ta(n){if(!$a(n))return!1;var t=hr(n);return t==v||"[object DOMException]"==t||"string"==typeof n.message&&"string"==typeof n.name&&!Ga(n)}function Wa(n){if(!Pa(n))return!1;var t=hr(n);return t==h||t==d||"[object AsyncFunction]"==t||"[object Proxy]"==t}function Ma(n){return"number"==typeof n&&n==eo(n)}function Ua(n){return"number"==typeof n&&n>-1&&n%1==0&&n<=9007199254740991}function Pa(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function $a(n){return null!=n&&"object"==typeof n}var qa=et?Nt(et):function(n){return $a(n)&&ei(n)==p};function Va(n){return"number"==typeof n||$a(n)&&hr(n)==g}function Ga(n){if(!$a(n)||hr(n)!=D)return!1;var t=Gn(n);if(null===t)return!0;var e=Cn.call(t,"constructor")&&t.constructor;return"function"==typeof e&&e instanceof e&&Fn.call(e)==jn}var Za=rt?Nt(rt):function(n){return $a(n)&&hr(n)==_};var Ha=ut?Nt(ut):function(n){return $a(n)&&ei(n)==m};function Ka(n){return"string"==typeof n||!Ba(n)&&$a(n)&&hr(n)==y}function Ja(n){return"symbol"==typeof n||$a(n)&&hr(n)==b}var Qa=it?Nt(it):function(n){return $a(n)&&Ua(n.length)&&!!Un[hr(n)]};var Ya=Su(kr),Xa=Su((function(n,t){return n<=t}));function no(n){if(!n)return[];if(Sa(n))return Ka(n)?Zt(n):Du(n);if(Xn&&n[Xn])return function(n){for(var t,e=[];!(t=n.next()).done;)e.push(t.value);return e}(n[Xn]());var t=ei(n);return(t==p?Ut:t==m?qt:jo)(n)}function to(n){return n?(n=uo(n))===1/0||n===-1/0?17976931348623157e292*(n<0?-1:1):n==n?n:0:0===n?n:0}function eo(n){var t=to(n),e=t%1;return t==t?e?t-e:t:0}function ro(n){return n?Ke(eo(n),0,4294967295):0}function uo(n){if("number"==typeof n)return n;if(Ja(n))return NaN;if(Pa(n)){var t="function"==typeof n.valueOf?n.valueOf():n;n=Pa(t)?t+"":t}if("string"!=typeof n)return 0===n?n:+n;n=n.replace(H,"");var e=an.test(n);return e||cn.test(n)?Vn(n.slice(2),e?2:8):un.test(n)?NaN:+n}function io(n){return _u(n,bo(n))}function ao(n){return null==n?"":Qr(n)}var oo=yu((function(n,t){if(si(t)||Sa(t))_u(t,yo(t),n);else for(var e in t)Cn.call(t,e)&&$e(n,e,t[e])})),co=yu((function(n,t){_u(t,bo(t),n)})),lo=yu((function(n,t,e,r){_u(t,bo(t),n,r)})),fo=yu((function(n,t,e,r){_u(t,yo(t),n,r)})),so=qu(He);var vo=Tr((function(n,t){n=gn(n);var e=-1,r=t.length,u=r>2?t[2]:void 0;for(u&&oi(t[0],t[1],u)&&(r=1);++e1),t})),_u(n,Gu(n),e),r&&(e=Je(e,7,Pu));for(var u=t.length;u--;)Xr(e,t[u]);return e}));var Co=qu((function(n,t){return null==n?{}:function(n,t){return Ir(n,t,(function(t,e){return go(n,e)}))}(n,t)}));function ko(n,t){if(null==n)return{};var e=dt(Gu(n),(function(n){return[n]}));return t=Ju(t),Ir(n,e,(function(n,e){return t(n,e[0])}))}var xo=Tu(yo),Ao=Tu(bo);function jo(n){return null==n?[]:Bt(n,yo(n))}var Oo=Fu((function(n,t,e){return t=t.toLowerCase(),n+(e?No(t):t)}));function No(n){return Wo(ao(n).toLowerCase())}function Bo(n){return(n=ao(n))&&n.replace(fn,Rt).replace(Sn,"")}var Io=Fu((function(n,t,e){return n+(e?"-":"")+t.toLowerCase()})),So=Fu((function(n,t,e){return n+(e?" ":"")+t.toLowerCase()})),Lo=wu("toLowerCase");var zo=Fu((function(n,t,e){return n+(e?"_":"")+t.toLowerCase()}));var Ro=Fu((function(n,t,e){return n+(e?" ":"")+Wo(t)}));var To=Fu((function(n,t,e){return n+(e?" ":"")+t.toUpperCase()})),Wo=wu("toUpperCase");function Mo(n,t,e){return n=ao(n),void 0===(t=e?void 0:t)?function(n){return Tn.test(n)}(n)?function(n){return n.match(zn)||[]}(n):function(n){return n.match(nn)||[]}(n):n.match(t)||[]}var Uo=Tr((function(n,t){try{return at(n,void 0,t)}catch(e){return Ta(e)?e:new hn(e)}})),Po=qu((function(n,t){return ct(t,(function(t){t=Ci(t),Ze(n,t,Da(n[t],n))})),n}));function $o(n){return function(){return n}}var qo=xu(),Vo=xu(!0);function Go(n){return n}function Zo(n){return wr("function"==typeof n?n:Je(n,1))}var Ho=Tr((function(n,t){return function(e){return _r(e,n,t)}})),Ko=Tr((function(n,t){return function(e){return _r(n,e,t)}}));function Jo(n,t,e){var r=yo(t),u=fr(t,r);null!=e||Pa(t)&&(u.length||!r.length)||(e=t,t=n,n=this,u=fr(t,yo(t)));var i=!(Pa(e)&&"chain"in e&&!e.chain),a=Wa(n);return ct(u,(function(e){var r=t[e];n[e]=r,a&&(n.prototype[e]=function(){var t=this.__chain__;if(i||t){var e=n(this.__wrapped__),u=e.__actions__=Du(this.__actions__);return u.push({func:r,args:arguments,thisArg:n}),e.__chain__=t,e}return r.apply(n,pt([this.value()],arguments))})})),n}function Qo(){}var Yo=Nu(dt),Xo=Nu(ft),nc=Nu(_t);function tc(n){return ci(n)?kt(Ci(n)):function(n){return function(t){return sr(t,n)}}(n)}var ec=Iu(),rc=Iu(!0);function uc(){return[]}function ic(){return!1}var ac=Ou((function(n,t){return n+t}),0),oc=zu("ceil"),cc=Ou((function(n,t){return n/t}),1),lc=zu("floor");var fc,sc=Ou((function(n,t){return n*t}),1),vc=zu("round"),hc=Ou((function(n,t){return n-t}),0);return Ae.after=function(n,t){if("function"!=typeof t)throw new mn(i);return n=eo(n),function(){if(--n<1)return t.apply(this,arguments)}},Ae.ary=pa,Ae.assign=oo,Ae.assignIn=co,Ae.assignInWith=lo,Ae.assignWith=fo,Ae.at=so,Ae.before=ga,Ae.bind=Da,Ae.bindAll=Po,Ae.bindKey=_a,Ae.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return Ba(n)?n:[n]},Ae.chain=na,Ae.chunk=function(n,t,e){t=(e?oi(n,t,e):void 0===t)?1:ae(eo(t),0);var u=null==n?0:n.length;if(!u||t<1)return[];for(var i=0,a=0,o=r(Xt(u/t));iu?0:u+e),(r=void 0===r||r>u?u:eo(r))<0&&(r+=u),r=e>r?0:ro(r);e>>0)?(n=ao(n))&&("string"==typeof t||null!=t&&!Za(t))&&!(t=Qr(t))&&Mt(n)?lu(Zt(n),0,e):n.split(t,e):[]},Ae.spread=function(n,t){if("function"!=typeof n)throw new mn(i);return t=null==t?0:ae(eo(t),0),Tr((function(e){var r=e[t],u=lu(e,0,t);return r&&pt(u,r),at(n,this,u)}))},Ae.tail=function(n){var t=null==n?0:n.length;return t?Vr(n,1,t):[]},Ae.take=function(n,t,e){return n&&n.length?Vr(n,0,(t=e||void 0===t?1:eo(t))<0?0:t):[]},Ae.takeRight=function(n,t,e){var r=null==n?0:n.length;return r?Vr(n,(t=r-(t=e||void 0===t?1:eo(t)))<0?0:t,r):[]},Ae.takeRightWhile=function(n,t){return n&&n.length?tu(n,Ju(t,3),!1,!0):[]},Ae.takeWhile=function(n,t){return n&&n.length?tu(n,Ju(t,3)):[]},Ae.tap=function(n,t){return t(n),n},Ae.throttle=function(n,t,e){var r=!0,u=!0;if("function"!=typeof n)throw new mn(i);return Pa(e)&&(r="leading"in e?!!e.leading:r,u="trailing"in e?!!e.trailing:u),ma(n,t,{leading:r,maxWait:t,trailing:u})},Ae.thru=ta,Ae.toArray=no,Ae.toPairs=xo,Ae.toPairsIn=Ao,Ae.toPath=function(n){return Ba(n)?dt(n,Ci):Ja(n)?[n]:Du(Fi(ao(n)))},Ae.toPlainObject=io,Ae.transform=function(n,t,e){var r=Ba(n),u=r||za(n)||Qa(n);if(t=Ju(t,4),null==e){var i=n&&n.constructor;e=u?r?new i:[]:Pa(n)&&Wa(i)?je(Gn(n)):{}}return(u?ct:cr)(n,(function(n,r,u){return t(e,n,r,u)})),e},Ae.unary=function(n){return pa(n,1)},Ae.union=$i,Ae.unionBy=qi,Ae.unionWith=Vi,Ae.uniq=function(n){return n&&n.length?Yr(n):[]},Ae.uniqBy=function(n,t){return n&&n.length?Yr(n,Ju(t,2)):[]},Ae.uniqWith=function(n,t){return t="function"==typeof t?t:void 0,n&&n.length?Yr(n,void 0,t):[]},Ae.unset=function(n,t){return null==n||Xr(n,t)},Ae.unzip=Gi,Ae.unzipWith=Zi,Ae.update=function(n,t,e){return null==n?n:nu(n,t,au(e))},Ae.updateWith=function(n,t,e,r){return r="function"==typeof r?r:void 0,null==n?n:nu(n,t,au(e),r)},Ae.values=jo,Ae.valuesIn=function(n){return null==n?[]:Bt(n,bo(n))},Ae.without=Hi,Ae.words=Mo,Ae.wrap=function(n,t){return Ca(au(t),n)},Ae.xor=Ki,Ae.xorBy=Ji,Ae.xorWith=Qi,Ae.zip=Yi,Ae.zipObject=function(n,t){return uu(n||[],t||[],$e)},Ae.zipObjectDeep=function(n,t){return uu(n||[],t||[],Ur)},Ae.zipWith=Xi,Ae.entries=xo,Ae.entriesIn=Ao,Ae.extend=co,Ae.extendWith=lo,Jo(Ae,Ae),Ae.add=ac,Ae.attempt=Uo,Ae.camelCase=Oo,Ae.capitalize=No,Ae.ceil=oc,Ae.clamp=function(n,t,e){return void 0===e&&(e=t,t=void 0),void 0!==e&&(e=(e=uo(e))==e?e:0),void 0!==t&&(t=(t=uo(t))==t?t:0),Ke(uo(n),t,e)},Ae.clone=function(n){return Je(n,4)},Ae.cloneDeep=function(n){return Je(n,5)},Ae.cloneDeepWith=function(n,t){return Je(n,5,t="function"==typeof t?t:void 0)},Ae.cloneWith=function(n,t){return Je(n,4,t="function"==typeof t?t:void 0)},Ae.conformsTo=function(n,t){return null==t||Qe(n,t,yo(t))},Ae.deburr=Bo,Ae.defaultTo=function(n,t){return null==n||n!=n?t:n},Ae.divide=cc,Ae.endsWith=function(n,t,e){n=ao(n),t=Qr(t);var r=n.length,u=e=void 0===e?r:Ke(eo(e),0,r);return(e-=t.length)>=0&&n.slice(e,u)==t},Ae.eq=Aa,Ae.escape=function(n){return(n=ao(n))&&W.test(n)?n.replace(R,Tt):n},Ae.escapeRegExp=function(n){return(n=ao(n))&&Z.test(n)?n.replace(G,"\\$&"):n},Ae.every=function(n,t,e){var r=Ba(n)?ft:er;return e&&oi(n,t,e)&&(t=void 0),r(n,Ju(t,3))},Ae.find=ua,Ae.findIndex=Ni,Ae.findKey=function(n,t){return yt(n,Ju(t,3),cr)},Ae.findLast=ia,Ae.findLastIndex=Bi,Ae.findLastKey=function(n,t){return yt(n,Ju(t,3),lr)},Ae.floor=lc,Ae.forEach=aa,Ae.forEachRight=oa,Ae.forIn=function(n,t){return null==n?n:ar(n,Ju(t,3),bo)},Ae.forInRight=function(n,t){return null==n?n:or(n,Ju(t,3),bo)},Ae.forOwn=function(n,t){return n&&cr(n,Ju(t,3))},Ae.forOwnRight=function(n,t){return n&&lr(n,Ju(t,3))},Ae.get=po,Ae.gt=ja,Ae.gte=Oa,Ae.has=function(n,t){return null!=n&&ri(n,t,pr)},Ae.hasIn=go,Ae.head=Si,Ae.identity=Go,Ae.includes=function(n,t,e,r){n=Sa(n)?n:jo(n),e=e&&!r?eo(e):0;var u=n.length;return e<0&&(e=ae(u+e,0)),Ka(n)?e<=u&&n.indexOf(t,e)>-1:!!u&&Et(n,t,e)>-1},Ae.indexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=null==e?0:eo(e);return u<0&&(u=ae(r+u,0)),Et(n,t,u)},Ae.inRange=function(n,t,e){return t=to(t),void 0===e?(e=t,t=0):e=to(e),function(n,t,e){return n>=oe(t,e)&&n=-9007199254740991&&n<=9007199254740991},Ae.isSet=Ha,Ae.isString=Ka,Ae.isSymbol=Ja,Ae.isTypedArray=Qa,Ae.isUndefined=function(n){return void 0===n},Ae.isWeakMap=function(n){return $a(n)&&ei(n)==E},Ae.isWeakSet=function(n){return $a(n)&&"[object WeakSet]"==hr(n)},Ae.join=function(n,t){return null==n?"":ue.call(n,t)},Ae.kebabCase=Io,Ae.last=Ti,Ae.lastIndexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=r;return void 0!==e&&(u=(u=eo(e))<0?ae(r+u,0):oe(u,r-1)),t==t?function(n,t,e){for(var r=e+1;r--;)if(n[r]===t)return r;return r}(n,t,u):bt(n,Ft,u,!0)},Ae.lowerCase=So,Ae.lowerFirst=Lo,Ae.lt=Ya,Ae.lte=Xa,Ae.max=function(n){return n&&n.length?rr(n,Go,dr):void 0},Ae.maxBy=function(n,t){return n&&n.length?rr(n,Ju(t,2),dr):void 0},Ae.mean=function(n){return Ct(n,Go)},Ae.meanBy=function(n,t){return Ct(n,Ju(t,2))},Ae.min=function(n){return n&&n.length?rr(n,Go,kr):void 0},Ae.minBy=function(n,t){return n&&n.length?rr(n,Ju(t,2),kr):void 0},Ae.stubArray=uc,Ae.stubFalse=ic,Ae.stubObject=function(){return{}},Ae.stubString=function(){return""},Ae.stubTrue=function(){return!0},Ae.multiply=sc,Ae.nth=function(n,t){return n&&n.length?Nr(n,eo(t)):void 0},Ae.noConflict=function(){return Hn._===this&&(Hn._=On),this},Ae.noop=Qo,Ae.now=da,Ae.pad=function(n,t,e){n=ao(n);var r=(t=eo(t))?Gt(n):0;if(!t||r>=t)return n;var u=(t-r)/2;return Bu(ne(u),e)+n+Bu(Xt(u),e)},Ae.padEnd=function(n,t,e){n=ao(n);var r=(t=eo(t))?Gt(n):0;return t&&rt){var r=n;n=t,t=r}if(e||n%1||t%1){var u=fe();return oe(n+u*(t-n+qn("1e-"+((u+"").length-1))),t)}return zr(n,t)},Ae.reduce=function(n,t,e){var r=Ba(n)?gt:At,u=arguments.length<3;return r(n,Ju(t,4),e,u,nr)},Ae.reduceRight=function(n,t,e){var r=Ba(n)?Dt:At,u=arguments.length<3;return r(n,Ju(t,4),e,u,tr)},Ae.repeat=function(n,t,e){return t=(e?oi(n,t,e):void 0===t)?1:eo(t),Rr(ao(n),t)},Ae.replace=function(){var n=arguments,t=ao(n[0]);return n.length<3?t:t.replace(n[1],n[2])},Ae.result=function(n,t,e){var r=-1,u=(t=ou(t,n)).length;for(u||(u=1,n=void 0);++r9007199254740991)return[];var e=4294967295,r=oe(n,4294967295);n-=4294967295;for(var u=Ot(r,t=Ju(t));++e=i)return n;var o=e-Gt(r);if(o<1)return r;var c=a?lu(a,0,o).join(""):n.slice(0,o);if(void 0===u)return c+r;if(a&&(o+=c.length-o),Za(u)){if(n.slice(o).search(u)){var l,f=c;for(u.global||(u=Dn(u.source,ao(rn.exec(u))+"g")),u.lastIndex=0;l=u.exec(f);)var s=l.index;c=c.slice(0,void 0===s?o:s)}}else if(n.indexOf(Qr(u),o)!=o){var v=c.lastIndexOf(u);v>-1&&(c=c.slice(0,v))}return c+r},Ae.unescape=function(n){return(n=ao(n))&&T.test(n)?n.replace(z,Ht):n},Ae.uniqueId=function(n){var t=++kn;return ao(n)+t},Ae.upperCase=To,Ae.upperFirst=Wo,Ae.each=aa,Ae.eachRight=oa,Ae.first=Si,Jo(Ae,(fc={},cr(Ae,(function(n,t){Cn.call(Ae.prototype,t)||(fc[t]=n)})),fc),{chain:!1}),Ae.VERSION="4.17.15",ct(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(n){Ae[n].placeholder=Ae})),ct(["drop","take"],(function(n,t){Be.prototype[n]=function(e){e=void 0===e?1:ae(eo(e),0);var r=this.__filtered__&&!t?new Be(this):this.clone();return r.__filtered__?r.__takeCount__=oe(e,r.__takeCount__):r.__views__.push({size:oe(e,4294967295),type:n+(r.__dir__<0?"Right":"")}),r},Be.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}})),ct(["filter","map","takeWhile"],(function(n,t){var e=t+1,r=1==e||3==e;Be.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:Ju(n,3),type:e}),t.__filtered__=t.__filtered__||r,t}})),ct(["head","last"],(function(n,t){var e="take"+(t?"Right":"");Be.prototype[n]=function(){return this[e](1).value()[0]}})),ct(["initial","tail"],(function(n,t){var e="drop"+(t?"":"Right");Be.prototype[n]=function(){return this.__filtered__?new Be(this):this[e](1)}})),Be.prototype.compact=function(){return this.filter(Go)},Be.prototype.find=function(n){return this.filter(n).head()},Be.prototype.findLast=function(n){return this.reverse().find(n)},Be.prototype.invokeMap=Tr((function(n,t){return"function"==typeof n?new Be(this):this.map((function(e){return _r(e,n,t)}))})),Be.prototype.reject=function(n){return this.filter(wa(Ju(n)))},Be.prototype.slice=function(n,t){n=eo(n);var e=this;return e.__filtered__&&(n>0||t<0)?new Be(e):(n<0?e=e.takeRight(-n):n&&(e=e.drop(n)),void 0!==t&&(e=(t=eo(t))<0?e.dropRight(-t):e.take(t-n)),e)},Be.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Be.prototype.toArray=function(){return this.take(4294967295)},cr(Be.prototype,(function(n,t){var e=/^(?:filter|find|map|reject)|While$/.test(t),r=/^(?:head|last)$/.test(t),u=Ae[r?"take"+("last"==t?"Right":""):t],i=r||/^find/.test(t);u&&(Ae.prototype[t]=function(){var t=this.__wrapped__,a=r?[1]:arguments,o=t instanceof Be,c=a[0],l=o||Ba(t),f=function(n){var t=u.apply(Ae,pt([n],a));return r&&s?t[0]:t};l&&e&&"function"==typeof c&&1!=c.length&&(o=l=!1);var s=this.__chain__,v=!!this.__actions__.length,h=i&&!s,d=o&&!v;if(!i&&l){t=d?t:new Be(this);var p=n.apply(t,a);return p.__actions__.push({func:ta,args:[f],thisArg:void 0}),new Ne(p,s)}return h&&d?n.apply(this,a):(p=this.thru(f),h?r?p.value()[0]:p.value():p)})})),ct(["pop","push","shift","sort","splice","unshift"],(function(n){var t=yn[n],e=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",r=/^(?:pop|shift)$/.test(n);Ae.prototype[n]=function(){var n=arguments;if(r&&!this.__chain__){var u=this.value();return t.apply(Ba(u)?u:[],n)}return this[e]((function(e){return t.apply(Ba(e)?e:[],n)}))}})),cr(Be.prototype,(function(n,t){var e=Ae[t];if(e){var r=e.name+"";Cn.call(me,r)||(me[r]=[]),me[r].push({name:t,func:e})}})),me[Au(void 0,2).name]=[{name:"wrapper",func:void 0}],Be.prototype.clone=function(){var n=new Be(this.__wrapped__);return n.__actions__=Du(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Du(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Du(this.__views__),n},Be.prototype.reverse=function(){if(this.__filtered__){var n=new Be(this);n.__dir__=-1,n.__filtered__=!0}else(n=this.clone()).__dir__*=-1;return n},Be.prototype.value=function(){var n=this.__wrapped__.value(),t=this.__dir__,e=Ba(n),r=t<0,u=e?n.length:0,i=function(n,t,e){var r=-1,u=e.length;for(;++r=this.__values__.length;return{done:n,value:n?void 0:this.__values__[this.__index__++]}},Ae.prototype.plant=function(n){for(var t,e=this;e instanceof Oe;){var r=xi(e);r.__index__=0,r.__values__=void 0,t?u.__wrapped__=r:t=r;var u=r;e=e.__wrapped__}return u.__wrapped__=n,t},Ae.prototype.reverse=function(){var n=this.__wrapped__;if(n instanceof Be){var t=n;return this.__actions__.length&&(t=new Be(this)),(t=t.reverse()).__actions__.push({func:ta,args:[Pi],thisArg:void 0}),new Ne(t,this.__chain__)}return this.thru(Pi)},Ae.prototype.toJSON=Ae.prototype.valueOf=Ae.prototype.value=function(){return eu(this.__wrapped__,this.__actions__)},Ae.prototype.first=Ae.prototype.head,Xn&&(Ae.prototype[Xn]=function(){return this}),Ae}();Hn._=Kt,void 0===(u=function(){return Kt}.call(t,e,t,r))||(r.exports=u)}).call(this)}).call(this,e(76),e(496)(n))},494:function(n,t,e){"use strict";var r=e(0),u=Object(r.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=u},495:function(n,t,e){"use strict";e.d(t,"a",(function(){return i}));e(77),e(513),e(479),e(78);var r=e(515),u=e.n(r);function i(n,t){var e=new u.a;return n.map((function(n){var r=n;return"string"==typeof n&&(r={label:n,permalink:"/blog/tags/"+e.slug(n)}),function(n,t){var e=n.label.split(": ",2),r=e[0],u=e[1],i="primary";switch(t){case"blog":case"guides":i=function(n){switch(n){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(r)}return{category:r,count:n.count,label:n.label,permalink:n.permalink,style:i,value:u}}(r,t)}))}},496:function(n,t){n.exports=function(n){return n.webpackPolyfill||(n.deprecate=function(){},n.paths=[],n.children||(n.children=[]),Object.defineProperty(n,"loaded",{enumerable:!0,get:function(){return n.l}}),Object.defineProperty(n,"id",{enumerable:!0,get:function(){return n.i}}),n.webpackPolyfill=1),n}},505:function(n,t,e){var r=e(30),u=e(54),i=e(27),a=e(26),o=e(506);n.exports=function(n,t){var e=1==n,c=2==n,l=3==n,f=4==n,s=6==n,v=5==n||s,h=t||o;return function(t,o,d){for(var p,g,D=i(t),_=u(D),m=r(o,d,3),y=a(_.length),b=0,E=e?h(t,y):c?h(t,0):void 0;y>b;b++)if((v||b in _)&&(g=m(p=_[b],b,D),n))if(e)E[b]=g;else if(g)switch(n){case 3:return!0;case 5:return p;case 6:return b;case 2:E.push(p)}else if(f)return!1;return s?-1:l||f?f:E}}},506:function(n,t,e){var r=e(507);n.exports=function(n,t){return new(r(n))(t)}},507:function(n,t,e){var r=e(13),u=e(508),i=e(2)("species");n.exports=function(n){var t;return u(n)&&("function"!=typeof(t=n.constructor)||t!==Array&&!u(t.prototype)||(t=void 0),r(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},508:function(n,t,e){var r=e(23);n.exports=Array.isArray||function(n){return"Array"==r(n)}},514:function(n,t,e){"use strict";var r=e(0),u=e.n(r),i=e(470),a=e(463),o=e.n(a);t.a=function(n){var t=n.count,e=n.label,r=n.permalink,a=n.style,c=n.value,l=n.valueOnly;return u.a.createElement(i.a,{to:r+"/",className:o()("badge","badge--rounded","badge--"+a)},l?c:e,t&&u.a.createElement(u.a.Fragment,null," (",t,")"))}},515:function(n,t,e){var r=e(516);n.exports=o;var u=Object.hasOwnProperty,i=/\s/g,a=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function o(){if(!(this instanceof o))return new o;this.reset()}function c(n,t){return"string"!=typeof n?"":(t||(n=n.toLowerCase()),n.trim().replace(a,"").replace(r(),"").replace(i,"-"))}o.prototype.slug=function(n,t){for(var e=c(n,!0===t),r=e;u.call(this.occurrences,e);)this.occurrences[r]++,e=r+"-"+this.occurrences[r];return this.occurrences[e]=0,e},o.prototype.reset=function(){this.occurrences=Object.create(null)},o.slug=c},516:function(n,t){n.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},520:function(n,t,e){"use strict";var r=e(1),u=e(0),i=e.n(u),a=(e(470),e(514)),o=e(463),c=e.n(o),l=e(495),f=e(141),s=e.n(f);t.a=function(n){var t,e=n.block,u=n.colorProfile,o=n.tags,f=n.valuesOnly,v=Object(l.a)(o,u);return i.a.createElement("div",{className:c()(s.a.tags,(t={},t[s.a.tagsBlock]=e,t))},v.map((function(n,t){return i.a.createElement(a.a,Object(r.a)({key:t,valueOnly:f},n))})))}},556:function(n,t,e){"use strict";e(29),e(22),e(21),e(52);var r=e(0),u=e.n(r),i=(e(468),e(479),e(470)),a=e(484),o=e.n(a),c=e(520),l=e(495),f=e(476),s=e(485);e(142);var v=function(n){var t=n.frontMatter,e=n.metadata,r=(n.isGuidePage,Object(s.a)().isDarkTheme),a=e.categories,v=(e.description,e.permalink),h=(e.readingTime,e.seriesPosition),d=e.tags,p=(t.author_github,t.cover_label),g=(t.last_modified_on,t.title),D=Object(l.a)(d,"guides"),_=D.find((function(n){return"domain"==n.category})),m=_?_.value:"default",y=D.find((function(n){return"language"==n.category})),b=y?y.value:null,E=D.find((function(n){return"framework"==n.category})),w=E?E.value:null,F=D.find((function(n){return"technology"==n.category})),C=F?F.value:null,k=D.find((function(n){return"database"==n.category})),x=k?k.value:null,A=D.find((function(n){return"installation_guide"==n.category})),j=A?A.value:null,O=D.find((function(n){return"platform"==n.category})),N=O?O.value:null,B=D.find((function(n){return"source"==n.category})),I=B?B.value:null,S=D.find((function(n){return"sink"==n.category})),L=S?S.value:null,z=Object(f.a)().siteConfig.customFields.metadata,R=z.installation,T=z.sources,W=z.sinks,M=z.languages,U=z.frameworks,P=z.databases,$=z.technologies,q=z.installation_guides,V=R.platforms,G=N&&V[N],Z=I&&T[I],H=L&&W[L],K=b&&M.find((function(n){return n.name===b})),J=w&&U.find((function(n){return n.name===w})),Q=x&&P.find((function(n){return n.name===x})),Y=C&&$.find((function(n){return n.name===C})),X=j&&q.find((function(n){return n.name===j})),nn=null!==(G||Z),tn=null!=H,en=null;J?en=r?J.dark_logo_path:J.logo_path:Y?en=r?Y.dark_logo_path:Y.logo_path:Q?en=r?Q.dark_logo_path:Q.logo_path:X?en=r?X.dark_logo_path:X.logo_path:K?en=r?K.dark_logo_path:K.logo_path:G?en=G.logo_path:Z&&(en=Z.logo_path);var rn=null;return H&&(rn=H.logo_path),u.a.createElement(i.a,{to:v+"/",className:"guide-item"},u.a.createElement("article",null,u.a.createElement("div",{className:"domain-bg domain-bg--"+m+" domain-bg--hover"},u.a.createElement("header",null,u.a.createElement("div",{className:"category"},a[0].name),u.a.createElement("h2",{title:g},h&&h+". ",p||g)),u.a.createElement("footer",null,en&&u.a.createElement(o.a,{src:en,className:"logo"}),!en&&nn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),rn&&u.a.createElement(o.a,{src:rn,className:"logo"}),!rn&&tn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),!en&&!rn&&!nn&&!tn&&u.a.createElement(c.a,{colorProfile:"guides",tags:d}),u.a.createElement("div",{className:"action"},"read now")))))},h=e(490),d=e(491),p=e.n(d),g=e(463),D=e.n(g);e(143);function _(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered,a=p()(e).map((function(n){return n.content.metadata.categories[t-1]})).uniqBy("permalink").sortBy("title").keyBy("permalink").value(),o=p.a.groupBy(e,(function(n){return n.content.metadata.categories[t-1].permalink})),c=Object(h.a)("h"+(t+1));return Object.keys(a).map((function(n,t){var e=o[n],l=a[n];return u.a.createElement("section",{key:t},u.a.createElement(c,{id:n},l.title),l.description&&u.a.createElement("div",{className:"sub-title"},l.description),u.a.createElement(m,{items:e,large:r,staggered:i}))}))}function m(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered;if(t)return u.a.createElement(_,{groupLevel:t,items:e});var a,o=(a=e,p.a.sortBy(a,["content.metadata.seriesPosition",function(n){return n.content.metadata.coverLabel.toLowerCase()}]));return u.a.createElement("div",{className:"guides"},u.a.createElement("div",{className:D()("guide-items",{"guide-items--l":r,"guide-items--staggered":i})},o.map((function(n){var t=n.content;return u.a.createElement(v,{key:t.metadata.permalink,frontMatter:t.frontMatter,metadata:t.metadata,truncated:t.metadata.truncated},u.a.createElement(t,null))}))))}t.a=m}}]); \ No newline at end of file diff --git a/004ec9e5.2db8f980.js.LICENSE.txt b/004ec9e5.a87d57ac.js.LICENSE.txt similarity index 100% rename from 004ec9e5.2db8f980.js.LICENSE.txt rename to 004ec9e5.a87d57ac.js.LICENSE.txt diff --git a/03dbc155.4bda667a.js b/03dbc155.7d4468a9.js similarity index 99% rename from 03dbc155.4bda667a.js rename to 03dbc155.7d4468a9.js index 80b6c97d48..1f8a765d64 100644 --- a/03dbc155.4bda667a.js +++ b/03dbc155.7d4468a9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{156:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return s})),a.d(t,"metadata",(function(){return u})),a.d(t,"rightToc",(function(){return p})),a.d(t,"default",(function(){return m}));var o=a(1),n=a(9),r=(a(0),a(465)),l=a(464),i=a(479),c=a(477),b=a(469),s={last_modified_on:"2024-09-18",$schema:"/.meta/.schemas/guides.json",title:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","installation_guide: aws"],hide_pagination:!0},u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",permalink:"/guides/tutorial/migrate-your-application-from-heroku-to-aws",readingTime:"12 min read",source:"@site/guides/tutorial/migrate-your-application-from-heroku-to-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"installation_guide: aws",permalink:"/guides/tags/installation-guide-aws"}],title:"Migrate your application from Heroku to AWS",truncated:!1,prevItem:{title:"Microservices",permalink:"/guides/advanced/microservices"},nextItem:{title:"Migration",permalink:"/guides/advanced/migration"}},p=[{value:"Migration Steps",id:"migration-steps",children:[]},{value:"1. Create your Dockerfile",id:"1-create-your-dockerfile",children:[{value:"Test your Dockerfile",id:"test-your-dockerfile",children:[]},{value:"Environment variables at the build time",id:"environment-variables-at-the-build-time",children:[]},{value:"Add your Dockerfile to Git",id:"add-your-dockerfile-to-git",children:[]},{value:"Loop",id:"loop",children:[]}]},{value:"2. Create resources on Qovery",id:"2-create-resources-on-qovery",children:[{value:"Application",id:"application",children:[]},{value:"Database",id:"database",children:[]}]},{value:"3. Configure your Environment Variables and Secrets",id:"3-configure-your-environment-variables-and-secrets",children:[{value:"Connect your frontend app to your backend app",id:"connect-your-frontend-app-to-your-backend-app",children:[]},{value:"Connect your backend app to your database",id:"connect-your-backend-app-to-your-database",children:[]}]},{value:"4. Copy data from your Heroku databases to your AWS databases",id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases",children:[]},{value:"5. Deploy your apps!",id:"5-deploy-your-apps",children:[]},{value:"FAQ by Heroku users",id:"faq-by-heroku-users",children:[{value:"How to create a custom domain?",id:"how-to-create-a-custom-domain",children:[]},{value:"How to monitor my apps?",id:"how-to-monitor-my-apps",children:[]},{value:"Do you have Heroku "Review App" equivalent?",id:"do-you-have-heroku-review-app-equivalent",children:[]},{value:"How to rollback?",id:"how-to-rollback",children:[]},{value:"How auto-scaling works?",id:"how-auto-scaling-works",children:[]},{value:"How to manage database migration?",id:"how-to-manage-database-migration",children:[]},{value:"Is it possible to get a shell / connect to my app?",id:"is-it-possible-to-get-a-shell--connect-to-my-app",children:[]},{value:"Can I use Terraform and Infrastructure as Code?",id:"can-i-use-terraform-and-infrastructure-as-code",children:[]},{value:"How can I connect my app to MongoDB Atlas?",id:"how-can-i-connect-my-app-to-mongodb-atlas",children:[]},{value:"How can I connect my app to an AWS service not managed by Qovery?",id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],d={rightToc:p};function m(e){var t=e.components,a=Object(n.a)(e,["components"]);return Object(r.b)("wrapper",Object(o.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"This guide also work for migrating your application from Heroku to GCP, Azure, Scaleway and ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/"}),"all cloud provider")," supported by Qovery.")),Object(r.b)("p",null,"This guide describes how to migrate your application running on Heroku to AWS with Qovery. It covers all required steps you need to take to deploy your application on AWS and transfer your data from Heroku Postgres to the database managed by AWS via Qovery."),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"We have created a new AI agent capable of migrating from Heroku to AWS, GCP, Scaleway or Azure in a few clicks. Check our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://www.qovery.com/blog/open-source-devops-ai-agent--effortless-migration-from-heroku-to-aws/?utm_campaign=migration-ai-agent-email"}),"announcement here"),".")),Object(r.b)(b.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You are familiar with Heroku basics, have a Heroku account and access to Heroku CLI"),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/guides/installation-guide/guide-amazon-web-services/"}),"set up your AWS account")," with Qovery"))),Object(r.b)("h2",{id:"migration-steps"},"Migration Steps"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#1-create-your-dockerfile"}),"Create your Dockerfile")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#2-create-resources-on-qovery"}),"Create resources on Qovery")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#3-configure-your-environment-variables-and-secrets"}),"Configure Environment Variables and Secrets")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#4-copy-data-from-your-heroku-databases-to-your-aws-databases"}),"Copy data from your Heroku databases to your AWS databases")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#5-deploy-your-apps-"}),"Deploy your apps")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#faq-by-heroku-users"}),"FAQ by Heroku users"))),Object(r.b)("h2",{id:"1-create-your-dockerfile"},"1. Create your Dockerfile"),Object(r.b)("p",null,"Qovery supports two ways to build and run your application coming from Heroku:"),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Are you familiar with Dockerfile? If not, I do recommend reading ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),".")),Object(r.b)("p",null,"Here we will create our Dockerfiles to build and run our applications. Qovery will handle the build and the run of your applications, but need to have at least a Dockerfile to do it."),Object(r.b)("h4",{id:"find-dockerfile-template"},"Find Dockerfile template"),Object(r.b)("p",null,"Pick one Dockerfile template according to the programming language or framework you are using for your app:"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Your framework or language is missing? Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum"),", and we will provide you one.")),Object(r.b)(c.a,{centered:!1,className:"square",defaultValue:"rails",select:!1,size:null,values:[{group:"Files",label:"Rails",value:"rails"},{group:"Files",label:"NodeJS",value:"nodejs"},{group:"Files",label:"React",value:"react"},{group:"Files",label:"VueJS",value:"vuejs"},{group:"Files",label:"NextJS",value:"nextjs"},{group:"Files",label:"Golang",value:"golang"},{group:"Files",label:"Flask",value:"flask"},{group:"Files",label:"Django",value:"django"},{group:"Files",label:"Laravel",value:"laravel"},{group:"Files",label:"Symfony",value:"symfony"},{group:"Files",label:"Spring",value:"spring"},{group:"Files",label:"Rust",value:"rust"}],mdxType:"Tabs"},Object(r.b)(i.a,{value:"rails",mdxType:"TabItem"},Object(r.b)("p",null,"Here is the Dockerfile for your Rails application listening on the PORT 3000"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nEXPOSE 3000\n\n# Configure the main process to run when running the image\nCMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"]\n')),Object(r.b)("details",null,Object(r.b)("summary",null,"Dockerfile for Sidekiq"),Object(r.b)("p",null,"Here is the Dockerfile for your Rails app running as a worker mode with Sidekiq."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"There is no listening port since it is consuming resources from a queuing system (E.g. Redis)")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile for Sidekiq"',title:'"Dockerfile',for:!0,'Sidekiq"':!0}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client # add mysql client if you need to\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nCMD ["bundle", "exec", "sidekiq"]\n')))),Object(r.b)(i.a,{value:"nodejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"react",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"vuejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"nextjs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"golang",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"flask",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"django",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"laravel",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"symfony",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"spring",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"rust",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n")))),Object(r.b)("h4",{id:"copy-template"},"Copy template"),Object(r.b)("p",null,"Copy your Dockerfile at the root of your project. By convention, you can name your file ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile"),". If you already have a Dockerfile, feel free to name it ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery"),". If you are using multiple Dockerfile for Qovery, feel free to give a name like ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Read ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/904"}),"this forum post")," to know how to use the same Dockerfile with different CMD parameters.")),Object(r.b)("p",null,"For our example of migrating a Rails app and a Rails Sidekiq app, I will have at the root of my project a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery")," and a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)("h3",{id:"test-your-dockerfile"},"Test your Dockerfile"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("p",null,"You need to ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://docs.docker.com/get-docker/"}),"install Docker")," to test your Dockerfile")),Object(r.b)("p",null,"To test your Dockerfile we will locally our container. You just need to run the following commands:"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Don't forget the ",Object(r.b)("inlineCode",{parentName:"p"},".")," (dot) at the end of the ",Object(r.b)("inlineCode",{parentName:"p"},"docker build")," command.")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker build -f Dockerfile.qovery .\n")),Object(r.b)("p",null,"If everything goes well you should get the finale image ID at the end of the output."),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"[+] Building 19.0s (16/16) FINISHED\n => [internal] load build definition from Dockerfile 0.0s\n => => transferring dockerfile: 37B 0.0s\n => [internal] load .dockerignore 0.0s\n ...\n => [7/7] COPY . . 0.2s\n => exporting to image 0.0s\n => exporting layers 0.4s\n => writing image sha256:a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055 0.0s\n")),Object(r.b)("p",null,"To run your image you can run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker run a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055\n")),Object(r.b)("p",null,"If your app required a database to starts, then it can be normal that it fails to start. Otherwise, if your app is supposed to start and does not, then you will need to fix the issue and rebuild your app with ",Object(r.b)("inlineCode",{parentName:"p"},"docker build -f Dockerfile.qovery .")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"This step is one of the most complex, but once you successfully build your application with Docker, your app will run anywhere (not only on AWS with Qovery).")),Object(r.b)("p",null,"Any error while building your container image? 2 solutions:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Read the error message and try to understand from where the problem is coming from. You can "Google" the error if it is not related to your code.'),Object(r.b)("li",{parentName:"ol"},"Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://discuss.qovery.com/"}),"our forum")," if you don't find the answer there, we will be happy to assist you.")),Object(r.b)("h3",{id:"environment-variables-at-the-build-time"},"Environment variables at the build time"),Object(r.b)("p",null,"Does your app use some environment variables at the build time? Then you will need to modify your Dockerfile to includes the environment variables. Let's imagine your app uses the environment variable ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY"),", then you will need to add the following instructions in your Dockerfile:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile with environment variables"',title:'"Dockerfile',with:!0,environment:!0,'variables"':!0}),"...\nARG CONTENT_API_KEY\nENV CONTENT_API_KEY $CONTENT_API_KEY\n...\n")),Object(r.b)("p",null,"The value of the ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY")," environment variable will be taken from the specified environment variables in Qovery."),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery injects Environment Variables and Secrets at the build and run time of your app.")),Object(r.b)("h3",{id:"add-your-dockerfile-to-git"},"Add your Dockerfile to Git"),Object(r.b)("p",null,"Now, add your new Dockerfile to git with the following commands:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),'git add Dockerfile.qovery\ngit commit -m "Add Qovery Dockerfile"\ngit push origin\n')),Object(r.b)("h3",{id:"loop"},"Loop"),Object(r.b)("p",null,"If you have multiple applications to deploy, create a Dockerfile for each of them."),Object(r.b)("h2",{id:"2-create-resources-on-qovery"},"2. Create resources on Qovery"),Object(r.b)("h3",{id:"application"},"Application"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/deploy-your-first-application/"}),"this tutorial")," to learn how to deploy your first app.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/9246ae68c68f42debc3d5183d2b4f7f8",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to the ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"Qovery console"),"."),Object(r.b)("li",{parentName:"ol"},"Create your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/organization/"}),"Organization")," and your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/project/"}),"Project"),"."),Object(r.b)("li",{parentName:"ol"},"Create an environment with the name ",Object(r.b)("inlineCode",{parentName:"li"},"production")," (it can be changed after)."),Object(r.b)("li",{parentName:"ol"},"Create an application and give it a name (you can give the name of your repo if you have no idea)"),Object(r.b)("li",{parentName:"ol"},"Select your app repository from your GitHub, GitLab or Bitbucket."),Object(r.b)("li",{parentName:"ol"},"Select the branch you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Specify the local listening port of your application."),Object(r.b)("li",{parentName:"ol"},'Click on "create"')),Object(r.b)("p",null,"Congrats! Your application is created \ud83c\udf89"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,'Your application is created but not deployed yet! You can configure the vCPU, Memory, Environment Variables... before deploying it. If you want to deploy it before finishing the configuration you can click on "Actions" > "Deploy".')),Object(r.b)("p",null,"If you deploy an app from a mono-repository, we have a must-read guide for you ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/advanced/monorepository/"}),"here"),"."),Object(r.b)("h3",{id:"database"},"Database"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"this tutorial")," to learn how to deploy your database.")),Object(r.b)("p",null,"Here are the steps to deploy your database:"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have created an application before"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/d7e10be0e5964f6799b158dc631bbbd1",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your ",Object(r.b)("inlineCode",{parentName:"li"},"production")," environment."),Object(r.b)("li",{parentName:"ol"},'Add your database by clicking on "Add" > "Database".'),Object(r.b)("li",{parentName:"ol"},"Select the database (PostgreSQL, MySQL, MongoDB, Redis..) and the version you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/database/#general"}),"Managed or Container mode")," for your database."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("inlineCode",{parentName:"li"},"Public")," accessibility (set ",Object(r.b)("inlineCode",{parentName:"li"},"Private")," if you don't want to restore your data from an existing Heroku database).")),Object(r.b)("p",null,"Congrats! Your database is created as well \ud83c\udf89"),Object(r.b)("p",null,"If you use MongoDB Atlas, or an existing database on AWS that you want to connect to your application deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing database."),Object(r.b)("h2",{id:"3-configure-your-environment-variables-and-secrets"},"3. Configure your Environment Variables and Secrets"),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery supports Doppler integration - it's the easiest way to migrate your Environment Variables and Secrets from Heroku to Qovery. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/secret-manager/doppler/"}),"More info here"),".")),Object(r.b)("p",null,"Qovery makes the difference between an environment variable and a secret. Basically, a Secret is similar to an Environment Variable but the value is encrypted and can't be revealed. Both are injected as environment variables during the build and the run of your applications. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"More info here")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"I recommend reading our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"Getting Started with Environment Variables")," guide.")),Object(r.b)("p",null,"To extract your environment variables from Heroku, we recommend using the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/heroku-cli"}),"Heroku CLI")," and exporting all the environment variables and secrets in an .env (dot env) file. Qovery supports the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/"}),"import of a dot env file")," via the Qovery web interface and the Qovery CLI."),Object(r.b)("p",null,Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/config-vars#view-current-config-var-values"}),"Export your environment variable via the Heroku CLI")," with the command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"# To install Heroku CLI: https://devcenter.heroku.com/articles/heroku-cli\nheroku config\n\nGREETINGS: hello world\nSTRIPE_API_KEY: xxx-yyy-zzz\nIS_PRODUCTION: true\n")),Object(r.b)("p",null,"Then you can create your environment variables via the web interface (watch the video below)"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/50899d7fa3d84a418f0db69f54f970d3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Or via the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Import Heroku environment variables with the Qovery CLI"',title:'"Import',Heroku:!0,environment:!0,variables:!0,with:!0,the:!0,Qovery:!0,'CLI"':!0}),"# auth yourself\nqovery auth\n\n# selection the app where you want to import your environment variables\nqovery context set\n\n# import your Heroku environment variables\nheroku config --app --json | \\\n qovery env parse --heroku-json > heroku.env && \\\n qovery env import heroku.env && \\\n rm heroku.env\n\nQovery: dot env file to import: 'heroku.env'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] GREETINGS=hello world\n [ ] STRIPE_API_KEY=xxx-yyy-zzz\n> [x] IS_PRODUCTION=true\n\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Import sensitive data (E.g. API keys, credentials...) as ",Object(r.b)("inlineCode",{parentName:"p"},"Secret")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"Environment Variable"),".")),Object(r.b)("h3",{id:"connect-your-frontend-app-to-your-backend-app"},"Connect your frontend app to your backend app"),Object(r.b)("p",null,"To connect your frontend app your backend app we will create an ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#alias-environment-variable"}),"environment variable alias"),"."),Object(r.b)("p",null,"Here is how to create a frontend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/bafbbda93bd64d04afb3189bf4a1a201",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"And now how to connect your frontend app with your backend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/f820925f2175465f9271b97ef414bb42",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"You can also take a look at ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/918"}),"this forum reply")," to learn how to do it."),Object(r.b)("h3",{id:"connect-your-backend-app-to-your-database"},"Connect your backend app to your database"),Object(r.b)("p",null,"Same as connecting your frontend app to your backend app, you can create an environment variable alias ",Object(r.b)("inlineCode",{parentName:"p"},"DATABASE_URL")," for the ",Object(r.b)("em",{parentName:"p"},"built-in")," secret finishing with ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL"),"."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Create an alias on ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/59f8368eb3c14796a807c7e39e9c0ab0",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases"},"4. Copy data from your Heroku databases to your AWS databases"),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"Coming soon with ",Object(r.b)("a",Object(o.a)({parentName:"em"},{href:"https://www.replibyte.com"}),"Replibyte"))),Object(r.b)("h2",{id:"5-deploy-your-apps"},"5. Deploy your apps!"),Object(r.b)("p",null,"We are finally ready to deploy my applications on AWS!"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/0589d2f2aa4149edb605dc23f4efd23d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Watch the final result \ud83d\ude0e"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/da31c21f9c104eae9270e4c4db59055e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"faq-by-heroku-users"},"FAQ by Heroku users"),Object(r.b)("h3",{id:"how-to-create-a-custom-domain"},"How to create a custom domain?"),Object(r.b)("p",null,"Check out the documentation on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"how to configure your custom domain"),"."),Object(r.b)("h3",{id:"how-to-monitor-my-apps"},"How to monitor my apps?"),Object(r.b)("p",null,"We do recommend using ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://www.datadoghq.com"}),"Datadog")," or any other monitoring products for monitoring your apps deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/"}),"our tutorial on how to install Datadog"),"."),Object(r.b)("h3",{id:"do-you-have-heroku-review-app-equivalent"},'Do you have Heroku "Review App" equivalent?'),Object(r.b)("p",null,"Yes, it's what we call ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#preview-environment"}),"Preview Environment")),Object(r.b)("h3",{id:"how-to-rollback"},"How to rollback?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/deployment-actions/#deploy-other-version"}),"app rollback documentation")),Object(r.b)("h3",{id:"how-auto-scaling-works"},"How auto-scaling works?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application/#auto-scaling"}),"app auto-scaling documentation")),Object(r.b)("h3",{id:"how-to-manage-database-migration"},"How to manage database migration?"),Object(r.b)("p",null,"Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/951"}),"our forum reply")),Object(r.b)("h3",{id:"is-it-possible-to-get-a-shell--connect-to-my-app"},"Is it possible to get a shell / connect to my app?"),Object(r.b)("p",null,"Absolutely, you can connect directly to your application with a shell by clicking on the Qovery cloud shell button (1):"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/qovery_cloud_shell.png",alt:"Qovery Cloud Shell"})),Object(r.b)("p",null,"Then you just have to select the pod (2) and the container (3)."),Object(r.b)("p",null,"You can also check out our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/#shell"}),"CLI")," and the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery shell")," command."),Object(r.b)("h3",{id:"can-i-use-terraform-and-infrastructure-as-code"},"Can I use Terraform and Infrastructure as Code?"),Object(r.b)("p",null,"Absolutely, we have a ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/terraform-provider/"}),"Qovery Terraform provider")," available."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-mongodb-atlas"},"How can I connect my app to MongoDB Atlas?"),Object(r.b)("p",null,"If you use MongoDB Atlas check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing MongoDB Atlas database."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery"},"How can I connect my app to an AWS service not managed by Qovery?"),Object(r.b)("p",null,"If you want to connect your app to an AWS service not managed by Qovery, check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to this AWS service."),Object(r.b)("hr",null),Object(r.b)("p",null,"If you have a common question about Qovery, we have a more general ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/useful-resources/faq/"}),"FAQ section")," available."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congrats! You have migrated from Heroku to AWS. Feel free to check out our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question."))}m.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var o=a(0),n=a.n(o),r=a(463),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,o=e.fill,r=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return n.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":o,"alert--icon":!1!==r}),role:"alert"},!1!==r&&n.a.createElement("i",{className:l()("feather","icon-"+(r||c))}),t)}},468:function(e,t,a){var o=a(28).f,n=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in n||a(10)&&o(n,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var o=a(0),n=a.n(o),r=a(464);t.a=function(e){var t=e.children,a=e.name;return n.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},n.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},477:function(e,t,a){"use strict";var o=a(1),n=(a(481),a(478),a(52),a(29),a(22),a(21),a(0)),r=a.n(n),l=a(483),i=a(463),c=a.n(i),b=a(471),s=a.n(b),u=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,o=e.changeSelectedValue,n=e.className,l=e.handleKeydown,i=e.style,b=e.values,s=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",n,{"tabs--block":t}),style:i},b.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return l(u,e.target,e)},onFocus:function(){return o(t)},onClick:function(){return o(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,o=e.changeSelectedValue,n=e.size,i=e.values,c=i;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+n,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return o(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,b=e.select,y=e.size,f=(e.style,e.values),O=e.urlKey,j=Object(u.a)(),g=j.tabGroupChoices,v=j.setTabGroupChoices,w=Object(n.useState)(a),k=w[0],N=w[1];if(null!=l){var C=g[l];null!=C&&C!==k&&N(C)}var T=function(e){N(e),null!=l&&v(l,e)},A=[],D=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(n.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=s.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&r.a.createElement("div",{className:"margin-vert--sm"},i),f.length>1&&(b?r.a.createElement(h,Object(o.a)({changeSelectedValue:T,handleKeydown:D,placeholder:c,selectedValue:k,size:y,tabRefs:A},e)):r.a.createElement(m,Object(o.a)({changeSelectedValue:T,handleKeydown:D,selectedValue:k,tabRefs:A},e)))),n.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},479:function(e,t,a){"use strict";var o=a(0),n=a.n(o);t.a=function(e){return n.a.createElement(n.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{156:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return s})),a.d(t,"metadata",(function(){return u})),a.d(t,"rightToc",(function(){return p})),a.d(t,"default",(function(){return m}));var o=a(1),n=a(9),r=(a(0),a(465)),l=a(464),i=a(478),c=a(477),b=a(469),s={last_modified_on:"2024-09-18",$schema:"/.meta/.schemas/guides.json",title:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","installation_guide: aws"],hide_pagination:!0},u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",permalink:"/guides/tutorial/migrate-your-application-from-heroku-to-aws",readingTime:"12 min read",source:"@site/guides/tutorial/migrate-your-application-from-heroku-to-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"installation_guide: aws",permalink:"/guides/tags/installation-guide-aws"}],title:"Migrate your application from Heroku to AWS",truncated:!1,prevItem:{title:"Microservices",permalink:"/guides/advanced/microservices"},nextItem:{title:"Migration",permalink:"/guides/advanced/migration"}},p=[{value:"Migration Steps",id:"migration-steps",children:[]},{value:"1. Create your Dockerfile",id:"1-create-your-dockerfile",children:[{value:"Test your Dockerfile",id:"test-your-dockerfile",children:[]},{value:"Environment variables at the build time",id:"environment-variables-at-the-build-time",children:[]},{value:"Add your Dockerfile to Git",id:"add-your-dockerfile-to-git",children:[]},{value:"Loop",id:"loop",children:[]}]},{value:"2. Create resources on Qovery",id:"2-create-resources-on-qovery",children:[{value:"Application",id:"application",children:[]},{value:"Database",id:"database",children:[]}]},{value:"3. Configure your Environment Variables and Secrets",id:"3-configure-your-environment-variables-and-secrets",children:[{value:"Connect your frontend app to your backend app",id:"connect-your-frontend-app-to-your-backend-app",children:[]},{value:"Connect your backend app to your database",id:"connect-your-backend-app-to-your-database",children:[]}]},{value:"4. Copy data from your Heroku databases to your AWS databases",id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases",children:[]},{value:"5. Deploy your apps!",id:"5-deploy-your-apps",children:[]},{value:"FAQ by Heroku users",id:"faq-by-heroku-users",children:[{value:"How to create a custom domain?",id:"how-to-create-a-custom-domain",children:[]},{value:"How to monitor my apps?",id:"how-to-monitor-my-apps",children:[]},{value:"Do you have Heroku "Review App" equivalent?",id:"do-you-have-heroku-review-app-equivalent",children:[]},{value:"How to rollback?",id:"how-to-rollback",children:[]},{value:"How auto-scaling works?",id:"how-auto-scaling-works",children:[]},{value:"How to manage database migration?",id:"how-to-manage-database-migration",children:[]},{value:"Is it possible to get a shell / connect to my app?",id:"is-it-possible-to-get-a-shell--connect-to-my-app",children:[]},{value:"Can I use Terraform and Infrastructure as Code?",id:"can-i-use-terraform-and-infrastructure-as-code",children:[]},{value:"How can I connect my app to MongoDB Atlas?",id:"how-can-i-connect-my-app-to-mongodb-atlas",children:[]},{value:"How can I connect my app to an AWS service not managed by Qovery?",id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],d={rightToc:p};function m(e){var t=e.components,a=Object(n.a)(e,["components"]);return Object(r.b)("wrapper",Object(o.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"This guide also work for migrating your application from Heroku to GCP, Azure, Scaleway and ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/"}),"all cloud provider")," supported by Qovery.")),Object(r.b)("p",null,"This guide describes how to migrate your application running on Heroku to AWS with Qovery. It covers all required steps you need to take to deploy your application on AWS and transfer your data from Heroku Postgres to the database managed by AWS via Qovery."),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"We have created a new AI agent capable of migrating from Heroku to AWS, GCP, Scaleway or Azure in a few clicks. Check our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://www.qovery.com/blog/open-source-devops-ai-agent--effortless-migration-from-heroku-to-aws/?utm_campaign=migration-ai-agent-email"}),"announcement here"),".")),Object(r.b)(b.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You are familiar with Heroku basics, have a Heroku account and access to Heroku CLI"),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/guides/installation-guide/guide-amazon-web-services/"}),"set up your AWS account")," with Qovery"))),Object(r.b)("h2",{id:"migration-steps"},"Migration Steps"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#1-create-your-dockerfile"}),"Create your Dockerfile")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#2-create-resources-on-qovery"}),"Create resources on Qovery")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#3-configure-your-environment-variables-and-secrets"}),"Configure Environment Variables and Secrets")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#4-copy-data-from-your-heroku-databases-to-your-aws-databases"}),"Copy data from your Heroku databases to your AWS databases")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#5-deploy-your-apps-"}),"Deploy your apps")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#faq-by-heroku-users"}),"FAQ by Heroku users"))),Object(r.b)("h2",{id:"1-create-your-dockerfile"},"1. Create your Dockerfile"),Object(r.b)("p",null,"Qovery supports two ways to build and run your application coming from Heroku:"),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Are you familiar with Dockerfile? If not, I do recommend reading ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),".")),Object(r.b)("p",null,"Here we will create our Dockerfiles to build and run our applications. Qovery will handle the build and the run of your applications, but need to have at least a Dockerfile to do it."),Object(r.b)("h4",{id:"find-dockerfile-template"},"Find Dockerfile template"),Object(r.b)("p",null,"Pick one Dockerfile template according to the programming language or framework you are using for your app:"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Your framework or language is missing? Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum"),", and we will provide you one.")),Object(r.b)(c.a,{centered:!1,className:"square",defaultValue:"rails",select:!1,size:null,values:[{group:"Files",label:"Rails",value:"rails"},{group:"Files",label:"NodeJS",value:"nodejs"},{group:"Files",label:"React",value:"react"},{group:"Files",label:"VueJS",value:"vuejs"},{group:"Files",label:"NextJS",value:"nextjs"},{group:"Files",label:"Golang",value:"golang"},{group:"Files",label:"Flask",value:"flask"},{group:"Files",label:"Django",value:"django"},{group:"Files",label:"Laravel",value:"laravel"},{group:"Files",label:"Symfony",value:"symfony"},{group:"Files",label:"Spring",value:"spring"},{group:"Files",label:"Rust",value:"rust"}],mdxType:"Tabs"},Object(r.b)(i.a,{value:"rails",mdxType:"TabItem"},Object(r.b)("p",null,"Here is the Dockerfile for your Rails application listening on the PORT 3000"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nEXPOSE 3000\n\n# Configure the main process to run when running the image\nCMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"]\n')),Object(r.b)("details",null,Object(r.b)("summary",null,"Dockerfile for Sidekiq"),Object(r.b)("p",null,"Here is the Dockerfile for your Rails app running as a worker mode with Sidekiq."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"There is no listening port since it is consuming resources from a queuing system (E.g. Redis)")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile for Sidekiq"',title:'"Dockerfile',for:!0,'Sidekiq"':!0}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client # add mysql client if you need to\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nCMD ["bundle", "exec", "sidekiq"]\n')))),Object(r.b)(i.a,{value:"nodejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"react",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"vuejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"nextjs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"golang",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"flask",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"django",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"laravel",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"symfony",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"spring",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"rust",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n")))),Object(r.b)("h4",{id:"copy-template"},"Copy template"),Object(r.b)("p",null,"Copy your Dockerfile at the root of your project. By convention, you can name your file ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile"),". If you already have a Dockerfile, feel free to name it ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery"),". If you are using multiple Dockerfile for Qovery, feel free to give a name like ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Read ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/904"}),"this forum post")," to know how to use the same Dockerfile with different CMD parameters.")),Object(r.b)("p",null,"For our example of migrating a Rails app and a Rails Sidekiq app, I will have at the root of my project a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery")," and a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)("h3",{id:"test-your-dockerfile"},"Test your Dockerfile"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("p",null,"You need to ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://docs.docker.com/get-docker/"}),"install Docker")," to test your Dockerfile")),Object(r.b)("p",null,"To test your Dockerfile we will locally our container. You just need to run the following commands:"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Don't forget the ",Object(r.b)("inlineCode",{parentName:"p"},".")," (dot) at the end of the ",Object(r.b)("inlineCode",{parentName:"p"},"docker build")," command.")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker build -f Dockerfile.qovery .\n")),Object(r.b)("p",null,"If everything goes well you should get the finale image ID at the end of the output."),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"[+] Building 19.0s (16/16) FINISHED\n => [internal] load build definition from Dockerfile 0.0s\n => => transferring dockerfile: 37B 0.0s\n => [internal] load .dockerignore 0.0s\n ...\n => [7/7] COPY . . 0.2s\n => exporting to image 0.0s\n => exporting layers 0.4s\n => writing image sha256:a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055 0.0s\n")),Object(r.b)("p",null,"To run your image you can run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker run a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055\n")),Object(r.b)("p",null,"If your app required a database to starts, then it can be normal that it fails to start. Otherwise, if your app is supposed to start and does not, then you will need to fix the issue and rebuild your app with ",Object(r.b)("inlineCode",{parentName:"p"},"docker build -f Dockerfile.qovery .")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"This step is one of the most complex, but once you successfully build your application with Docker, your app will run anywhere (not only on AWS with Qovery).")),Object(r.b)("p",null,"Any error while building your container image? 2 solutions:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Read the error message and try to understand from where the problem is coming from. You can "Google" the error if it is not related to your code.'),Object(r.b)("li",{parentName:"ol"},"Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://discuss.qovery.com/"}),"our forum")," if you don't find the answer there, we will be happy to assist you.")),Object(r.b)("h3",{id:"environment-variables-at-the-build-time"},"Environment variables at the build time"),Object(r.b)("p",null,"Does your app use some environment variables at the build time? Then you will need to modify your Dockerfile to includes the environment variables. Let's imagine your app uses the environment variable ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY"),", then you will need to add the following instructions in your Dockerfile:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile with environment variables"',title:'"Dockerfile',with:!0,environment:!0,'variables"':!0}),"...\nARG CONTENT_API_KEY\nENV CONTENT_API_KEY $CONTENT_API_KEY\n...\n")),Object(r.b)("p",null,"The value of the ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY")," environment variable will be taken from the specified environment variables in Qovery."),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery injects Environment Variables and Secrets at the build and run time of your app.")),Object(r.b)("h3",{id:"add-your-dockerfile-to-git"},"Add your Dockerfile to Git"),Object(r.b)("p",null,"Now, add your new Dockerfile to git with the following commands:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),'git add Dockerfile.qovery\ngit commit -m "Add Qovery Dockerfile"\ngit push origin\n')),Object(r.b)("h3",{id:"loop"},"Loop"),Object(r.b)("p",null,"If you have multiple applications to deploy, create a Dockerfile for each of them."),Object(r.b)("h2",{id:"2-create-resources-on-qovery"},"2. Create resources on Qovery"),Object(r.b)("h3",{id:"application"},"Application"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/deploy-your-first-application/"}),"this tutorial")," to learn how to deploy your first app.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/9246ae68c68f42debc3d5183d2b4f7f8",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to the ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"Qovery console"),"."),Object(r.b)("li",{parentName:"ol"},"Create your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/organization/"}),"Organization")," and your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/project/"}),"Project"),"."),Object(r.b)("li",{parentName:"ol"},"Create an environment with the name ",Object(r.b)("inlineCode",{parentName:"li"},"production")," (it can be changed after)."),Object(r.b)("li",{parentName:"ol"},"Create an application and give it a name (you can give the name of your repo if you have no idea)"),Object(r.b)("li",{parentName:"ol"},"Select your app repository from your GitHub, GitLab or Bitbucket."),Object(r.b)("li",{parentName:"ol"},"Select the branch you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Specify the local listening port of your application."),Object(r.b)("li",{parentName:"ol"},'Click on "create"')),Object(r.b)("p",null,"Congrats! Your application is created \ud83c\udf89"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,'Your application is created but not deployed yet! You can configure the vCPU, Memory, Environment Variables... before deploying it. If you want to deploy it before finishing the configuration you can click on "Actions" > "Deploy".')),Object(r.b)("p",null,"If you deploy an app from a mono-repository, we have a must-read guide for you ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/advanced/monorepository/"}),"here"),"."),Object(r.b)("h3",{id:"database"},"Database"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"this tutorial")," to learn how to deploy your database.")),Object(r.b)("p",null,"Here are the steps to deploy your database:"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have created an application before"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/d7e10be0e5964f6799b158dc631bbbd1",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your ",Object(r.b)("inlineCode",{parentName:"li"},"production")," environment."),Object(r.b)("li",{parentName:"ol"},'Add your database by clicking on "Add" > "Database".'),Object(r.b)("li",{parentName:"ol"},"Select the database (PostgreSQL, MySQL, MongoDB, Redis..) and the version you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/database/#general"}),"Managed or Container mode")," for your database."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("inlineCode",{parentName:"li"},"Public")," accessibility (set ",Object(r.b)("inlineCode",{parentName:"li"},"Private")," if you don't want to restore your data from an existing Heroku database).")),Object(r.b)("p",null,"Congrats! Your database is created as well \ud83c\udf89"),Object(r.b)("p",null,"If you use MongoDB Atlas, or an existing database on AWS that you want to connect to your application deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing database."),Object(r.b)("h2",{id:"3-configure-your-environment-variables-and-secrets"},"3. Configure your Environment Variables and Secrets"),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery supports Doppler integration - it's the easiest way to migrate your Environment Variables and Secrets from Heroku to Qovery. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/secret-manager/doppler/"}),"More info here"),".")),Object(r.b)("p",null,"Qovery makes the difference between an environment variable and a secret. Basically, a Secret is similar to an Environment Variable but the value is encrypted and can't be revealed. Both are injected as environment variables during the build and the run of your applications. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"More info here")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"I recommend reading our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"Getting Started with Environment Variables")," guide.")),Object(r.b)("p",null,"To extract your environment variables from Heroku, we recommend using the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/heroku-cli"}),"Heroku CLI")," and exporting all the environment variables and secrets in an .env (dot env) file. Qovery supports the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/"}),"import of a dot env file")," via the Qovery web interface and the Qovery CLI."),Object(r.b)("p",null,Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/config-vars#view-current-config-var-values"}),"Export your environment variable via the Heroku CLI")," with the command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"# To install Heroku CLI: https://devcenter.heroku.com/articles/heroku-cli\nheroku config\n\nGREETINGS: hello world\nSTRIPE_API_KEY: xxx-yyy-zzz\nIS_PRODUCTION: true\n")),Object(r.b)("p",null,"Then you can create your environment variables via the web interface (watch the video below)"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/50899d7fa3d84a418f0db69f54f970d3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Or via the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Import Heroku environment variables with the Qovery CLI"',title:'"Import',Heroku:!0,environment:!0,variables:!0,with:!0,the:!0,Qovery:!0,'CLI"':!0}),"# auth yourself\nqovery auth\n\n# selection the app where you want to import your environment variables\nqovery context set\n\n# import your Heroku environment variables\nheroku config --app --json | \\\n qovery env parse --heroku-json > heroku.env && \\\n qovery env import heroku.env && \\\n rm heroku.env\n\nQovery: dot env file to import: 'heroku.env'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] GREETINGS=hello world\n [ ] STRIPE_API_KEY=xxx-yyy-zzz\n> [x] IS_PRODUCTION=true\n\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Import sensitive data (E.g. API keys, credentials...) as ",Object(r.b)("inlineCode",{parentName:"p"},"Secret")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"Environment Variable"),".")),Object(r.b)("h3",{id:"connect-your-frontend-app-to-your-backend-app"},"Connect your frontend app to your backend app"),Object(r.b)("p",null,"To connect your frontend app your backend app we will create an ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#alias-environment-variable"}),"environment variable alias"),"."),Object(r.b)("p",null,"Here is how to create a frontend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/bafbbda93bd64d04afb3189bf4a1a201",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"And now how to connect your frontend app with your backend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/f820925f2175465f9271b97ef414bb42",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"You can also take a look at ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/918"}),"this forum reply")," to learn how to do it."),Object(r.b)("h3",{id:"connect-your-backend-app-to-your-database"},"Connect your backend app to your database"),Object(r.b)("p",null,"Same as connecting your frontend app to your backend app, you can create an environment variable alias ",Object(r.b)("inlineCode",{parentName:"p"},"DATABASE_URL")," for the ",Object(r.b)("em",{parentName:"p"},"built-in")," secret finishing with ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL"),"."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Create an alias on ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/59f8368eb3c14796a807c7e39e9c0ab0",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases"},"4. Copy data from your Heroku databases to your AWS databases"),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"Coming soon with ",Object(r.b)("a",Object(o.a)({parentName:"em"},{href:"https://www.replibyte.com"}),"Replibyte"))),Object(r.b)("h2",{id:"5-deploy-your-apps"},"5. Deploy your apps!"),Object(r.b)("p",null,"We are finally ready to deploy my applications on AWS!"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/0589d2f2aa4149edb605dc23f4efd23d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Watch the final result \ud83d\ude0e"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/da31c21f9c104eae9270e4c4db59055e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"faq-by-heroku-users"},"FAQ by Heroku users"),Object(r.b)("h3",{id:"how-to-create-a-custom-domain"},"How to create a custom domain?"),Object(r.b)("p",null,"Check out the documentation on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"how to configure your custom domain"),"."),Object(r.b)("h3",{id:"how-to-monitor-my-apps"},"How to monitor my apps?"),Object(r.b)("p",null,"We do recommend using ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://www.datadoghq.com"}),"Datadog")," or any other monitoring products for monitoring your apps deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/"}),"our tutorial on how to install Datadog"),"."),Object(r.b)("h3",{id:"do-you-have-heroku-review-app-equivalent"},'Do you have Heroku "Review App" equivalent?'),Object(r.b)("p",null,"Yes, it's what we call ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#preview-environment"}),"Preview Environment")),Object(r.b)("h3",{id:"how-to-rollback"},"How to rollback?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/deployment-actions/#deploy-other-version"}),"app rollback documentation")),Object(r.b)("h3",{id:"how-auto-scaling-works"},"How auto-scaling works?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application/#auto-scaling"}),"app auto-scaling documentation")),Object(r.b)("h3",{id:"how-to-manage-database-migration"},"How to manage database migration?"),Object(r.b)("p",null,"Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/951"}),"our forum reply")),Object(r.b)("h3",{id:"is-it-possible-to-get-a-shell--connect-to-my-app"},"Is it possible to get a shell / connect to my app?"),Object(r.b)("p",null,"Absolutely, you can connect directly to your application with a shell by clicking on the Qovery cloud shell button (1):"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/qovery_cloud_shell.png",alt:"Qovery Cloud Shell"})),Object(r.b)("p",null,"Then you just have to select the pod (2) and the container (3)."),Object(r.b)("p",null,"You can also check out our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/#shell"}),"CLI")," and the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery shell")," command."),Object(r.b)("h3",{id:"can-i-use-terraform-and-infrastructure-as-code"},"Can I use Terraform and Infrastructure as Code?"),Object(r.b)("p",null,"Absolutely, we have a ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/terraform-provider/"}),"Qovery Terraform provider")," available."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-mongodb-atlas"},"How can I connect my app to MongoDB Atlas?"),Object(r.b)("p",null,"If you use MongoDB Atlas check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing MongoDB Atlas database."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery"},"How can I connect my app to an AWS service not managed by Qovery?"),Object(r.b)("p",null,"If you want to connect your app to an AWS service not managed by Qovery, check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to this AWS service."),Object(r.b)("hr",null),Object(r.b)("p",null,"If you have a common question about Qovery, we have a more general ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/useful-resources/faq/"}),"FAQ section")," available."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congrats! You have migrated from Heroku to AWS. Feel free to check out our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question."))}m.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var o=a(0),n=a.n(o),r=a(463),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,o=e.fill,r=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return n.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":o,"alert--icon":!1!==r}),role:"alert"},!1!==r&&n.a.createElement("i",{className:l()("feather","icon-"+(r||c))}),t)}},468:function(e,t,a){var o=a(28).f,n=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in n||a(10)&&o(n,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var o=a(0),n=a.n(o),r=a(464);t.a=function(e){var t=e.children,a=e.name;return n.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},n.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},477:function(e,t,a){"use strict";var o=a(1),n=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),r=a.n(n),l=a(483),i=a(463),c=a.n(i),b=a(471),s=a.n(b),u=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,o=e.changeSelectedValue,n=e.className,l=e.handleKeydown,i=e.style,b=e.values,s=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",n,{"tabs--block":t}),style:i},b.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return l(u,e.target,e)},onFocus:function(){return o(t)},onClick:function(){return o(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,o=e.changeSelectedValue,n=e.size,i=e.values,c=i;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+n,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return o(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,b=e.select,y=e.size,f=(e.style,e.values),O=e.urlKey,j=Object(u.a)(),g=j.tabGroupChoices,v=j.setTabGroupChoices,w=Object(n.useState)(a),k=w[0],N=w[1];if(null!=l){var C=g[l];null!=C&&C!==k&&N(C)}var T=function(e){N(e),null!=l&&v(l,e)},A=[],D=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(n.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=s.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&r.a.createElement("div",{className:"margin-vert--sm"},i),f.length>1&&(b?r.a.createElement(h,Object(o.a)({changeSelectedValue:T,handleKeydown:D,placeholder:c,selectedValue:k,size:y,tabRefs:A},e)):r.a.createElement(m,Object(o.a)({changeSelectedValue:T,handleKeydown:D,selectedValue:k,tabRefs:A},e)))),n.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},478:function(e,t,a){"use strict";var o=a(0),n=a.n(o);t.a=function(e){return n.a.createElement(n.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/1.d9e14521.js b/1.033cef57.js similarity index 99% rename from 1.d9e14521.js rename to 1.033cef57.js index f8fc46386d..a3ad1a68e1 100644 --- a/1.d9e14521.js +++ b/1.033cef57.js @@ -1,2 +1,2 @@ -/*! For license information please see 1.d9e14521.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{463:function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),c=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a({},t,{},e)),n},p=function(e){var t=c(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=Object(r.forwardRef)((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,u=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=c(n),d=r,h=p["".concat(u,".").concat(d)]||p[d]||f[d]||i;return n?o.a.createElement(h,a({ref:t},l,{components:n})):o.a.createElement(h,a({ref:t},l))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,u=new Array(i);u[0]=d;var a={};for(var s in t)hasOwnProperty.call(t,s)&&(a[s]=t[s]);a.originalType=e,a.mdxType="string"==typeof e?e:r,u[1]=a;for(var l=2;l1?arguments[1]:void 0,n),s=u>2?arguments[2]:void 0,l=void 0===s?n:o(s,n);l>a;)t[a++]=e;return t}},471:function(e,t,n){"use strict";var r=n(475),o=n(51);function i(e,t){return t.encode?t.strict?r(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var n=function(e){var t;switch(e.arrayFormat){case"index":return function(e,n,r){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===r[e]&&(r[e]={}),r[e][t[1]]=n):r[e]=n};case"bracket":return function(e,n,r){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==r[e]?r[e]=[].concat(r[e],n):r[e]=[n]:r[e]=n};default:return function(e,t,n){void 0!==n[e]?n[e]=[].concat(n[e],t):n[e]=t}}}(t=o({arrayFormat:"none"},t)),r=Object.create(null);return"string"!=typeof e?r:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),o=t.shift(),i=t.length>0?t.join("="):void 0;i=void 0===i?null:decodeURIComponent(i),n(decodeURIComponent(o),i,r)})),Object.keys(r).sort().reduce((function(e,t){var n=r[t];return Boolean(n)&&"object"==typeof n&&!Array.isArray(n)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(n):e[t]=n,e}),Object.create(null))):r},t.stringify=function(e,t){var n=function(e){switch(e.arrayFormat){case"index":return function(t,n,r){return null===n?[i(t,e),"[",r,"]"].join(""):[i(t,e),"[",i(r,e),"]=",i(n,e)].join("")};case"bracket":return function(t,n){return null===n?i(t,e):[i(t,e),"[]=",i(n,e)].join("")};default:return function(t,n){return null===n?i(t,e):[i(t,e),"=",i(n,e)].join("")}}}(t=o({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(r){var o=e[r];if(void 0===o)return"";if(null===o)return i(r,t);if(Array.isArray(o)){var u=[];return o.slice().forEach((function(e){void 0!==e&&u.push(n(r,e,u.length))})),u.join("&")}return i(r,t)+"="+i(o,t)})).filter((function(e){return e.length>0})).join("&"):""}},475:function(e,t,n){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}},478:function(e,t,n){"use strict";var r=n(12),o=n(505)(5),i=!0;"find"in[]&&Array(1).find((function(){i=!1})),r(r.P+r.F*i,"Array",{find:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),n(74)("find")},481:function(e,t,n){"use strict";var r=n(8),o=n(526),i=n(55);n(56)("search",1,(function(e,t,n,u){return[function(n){var r=e(this),o=null==n?void 0:n[t];return void 0!==o?o.call(n,r):new RegExp(n)[t](String(r))},function(e){var t=u(n,e,this);if(t.done)return t.value;var a=r(e),s=String(this),l=a.lastIndex;o(l,0)||(a.lastIndex=0);var c=i(a,s);return o(a.lastIndex,l)||(a.lastIndex=l),null===c?-1:c.index}]}))},482:function(e,t,n){"use strict";var r=n(0),o=n(494);t.a=function(){return Object(r.useContext)(o.a)}},483:function(e,t,n){"use strict";var r=n(0),o=n.n(r);function i(e,t){if(e.length!==t.length)return!1;for(var n=0;nr&&(r=(t=t.trim()).charCodeAt(0)),r){case 38:return t.replace(m,"$1"+e.trim());case 58:return e.trim()+t.replace(m,"$1"+e.trim());default:if(0<1*n&&0s.charCodeAt(8))break;case 115:u=u.replace(s,"-webkit-"+s)+";"+u;break;case 207:case 102:u=u.replace(s,"-webkit-"+(102a.charCodeAt(0)&&(a=a.trim()),a=[a],0d)&&(N=(U=U.replace(" ",":")).length),0=4;++r,o-=4)t=1540483477*(65535&(t=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+(59797*(t>>>16)<<16),n=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&n)+(59797*(n>>>16)<<16);switch(o){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+(59797*(n>>>16)<<16)}return(((n=1540483477*(65535&(n^=n>>>13))+(59797*(n>>>16)<<16))^n>>>15)>>>0).toString(36)},b={animationIterationCount:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1};var E=/[A-Z]|^ms/g,y=/_EMO_([^_]+?)_([^]*?)_EMO_/g,C=function(e){return 45===e.charCodeAt(1)},O=function(e){return null!=e&&"boolean"!=typeof e},A=function(e){var t={};return function(n){return void 0===t[n]&&(t[n]=e(n)),t[n]}}((function(e){return C(e)?e:e.replace(E,"-$&").toLowerCase()})),w=function(e,t){switch(e){case"animation":case"animationName":if("string"==typeof t)return t.replace(y,(function(e,t,n){return x={name:t,styles:n,next:x},t}))}return 1===b[e]||C(e)||"number"!=typeof t||0===t?t:t+"px"};function F(e,t,n,r){if(null==n)return"";if(void 0!==n.__emotion_styles)return n;switch(typeof n){case"boolean":return"";case"object":if(1===n.anim)return x={name:n.name,styles:n.styles,next:x},n.name;if(void 0!==n.styles){var o=n.next;if(void 0!==o)for(;void 0!==o;)x={name:o.name,styles:o.styles,next:x},o=o.next;return n.styles+";"}return function(e,t,n){var r="";if(Array.isArray(n))for(var o=0;o-1}function J(e){return K(e)?window.pageYOffset:e.scrollTop}function q(e,t){K(e)?window.scrollTo(0,t):e.scrollTop=t}function Z(e,t,n,r){void 0===n&&(n=200),void 0===r&&(r=G);var o=J(e),i=t-o,u=0;!function t(){var a,s=i*((a=(a=u+=10)/n-1)*a*a+1)+o;q(e,s),u=d)return{placement:"bottom",maxHeight:t};if(A>=d&&!u)return i&&Z(s,w,160),{placement:"bottom",maxHeight:t};if(!u&&A>=r||u&&C>=r)return i&&Z(s,w,160),{placement:"bottom",maxHeight:u?C-b:A-b};if("auto"===o||u){var x=t,S=u?y:O;return S>=r&&(x=Math.min(S-b-a.controlHeight,t)),{placement:"top",maxHeight:x}}if("bottom"===o)return q(s,w),{placement:"bottom",maxHeight:t};break;case"top":if(y>=d)return{placement:"top",maxHeight:t};if(O>=d&&!u)return i&&Z(s,F,160),{placement:"top",maxHeight:t};if(!u&&O>=r||u&&y>=r){var D=t;return(!u&&O>=r||u&&y>=r)&&(D=u?y-E:O-E),i&&Z(s,F,160),{placement:"top",maxHeight:D}}return{placement:"bottom",maxHeight:t};default:throw new Error('Invalid placement provided "'+o+'".')}return l}var ie=function(e){return"auto"===e?"bottom":e},ue=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o=0||(o[n]=e[n]);return o}(e,["size"]);return B("svg",Ee({height:t,width:t,viewBox:"0 0 20 20","aria-hidden":"true",focusable:"false",css:ye},n))},Oe=function(e){return B(Ce,Ee({size:20},e),B("path",{d:"M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z"}))},Ae=function(e){return B(Ce,Ee({size:20},e),B("path",{d:"M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"}))},we=function(e){var t=e.isFocused,n=e.theme,r=n.spacing.baseUnit,o=n.colors;return{label:"indicatorContainer",color:t?o.neutral60:o.neutral20,display:"flex",padding:2*r,transition:"color 150ms",":hover":{color:t?o.neutral80:o.neutral40}}},Fe=we,xe=we,Se=function(){var e=k.apply(void 0,arguments),t="animation-"+e.name;return{name:t,styles:"@keyframes "+t+"{"+e.styles+"}",anim:1,toString:function(){return"_EMO_"+this.name+"_"+this.styles+"_EMO_"}}}(be()),De=function(e){var t=e.delay,n=e.offset;return B("span",{css:k({animation:Se+" 1s ease-in-out "+t+"ms infinite;",backgroundColor:"currentColor",borderRadius:"1em",display:"inline-block",marginLeft:n?"1em":null,height:"1em",verticalAlign:"top",width:"1em"},"")})},ke=function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.innerProps,i=e.isRtl;return B("div",Ee({},o,{css:r("loadingIndicator",e),className:n({indicator:!0,"loading-indicator":!0},t)}),B(De,{delay:0,offset:i}),B(De,{delay:160,offset:!0}),B(De,{delay:320,offset:!i}))};function Ie(){return(Ie=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,["className","cx","getStyles","theme","selectProps"]));return B("div",Me({css:r("groupHeading",Me({theme:o},i)),className:n({"group-heading":!0},t)},i))},IndicatorsContainer:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles;return B("div",{css:o("indicatorsContainer",e),className:r({indicators:!0},n)},t)},IndicatorSeparator:function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.innerProps;return B("span",Ee({},o,{css:r("indicatorSeparator",e),className:n({"indicator-separator":!0},t)}))},Input:function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.innerRef,i=e.isHidden,u=e.isDisabled,a=e.theme,s=(e.selectProps,function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,["className","cx","getStyles","innerRef","isHidden","isDisabled","theme","selectProps"]));return B("div",{css:r("input",Pe({theme:a},s))},B(te.a,Pe({className:n({input:!0},t),inputRef:o,inputStyle:Le(i),disabled:u},s)))},LoadingIndicator:ke,Menu:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.innerRef,u=e.innerProps;return B("div",ne({css:o("menu",e),className:r({menu:!0},n)},u,{ref:i}),t)},MenuList:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.isMulti,u=e.innerRef;return B("div",{css:o("menuList",e),className:r({"menu-list":!0,"menu-list--is-multi":i},n),ref:u},t)},MenuPortal:fe,LoadingMessage:pe,NoOptionsMessage:ce,MultiValue:Be,MultiValueContainer:Re,MultiValueLabel:je,MultiValueRemove:function(e){var t=e.children,n=e.innerProps;return B("div",n,t||B(Oe,{size:14}))},Option:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.isDisabled,u=e.isFocused,a=e.isSelected,s=e.innerRef,l=e.innerProps;return B("div",Ne({css:o("option",e),className:r({option:!0,"option--is-disabled":i,"option--is-focused":u,"option--is-selected":a},n),ref:s},l),t)},Placeholder:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.innerProps;return B("div",He({css:o("placeholder",e),className:r({placeholder:!0},n)},i),t)},SelectContainer:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.innerProps,u=e.isDisabled,a=e.isRtl;return B("div",ge({css:o("container",e),className:r({"--is-disabled":u,"--is-rtl":a},n)},i),t)},SingleValue:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.isDisabled,u=e.innerProps;return B("div",_e({css:o("singleValue",e),className:r({"single-value":!0,"single-value--is-disabled":i},n)},u),t)},ValueContainer:function(e){var t=e.children,n=e.className,r=e.cx,o=e.isMulti,i=e.getStyles,u=e.hasValue;return B("div",{css:i("valueContainer",e),className:r({"value-container":!0,"value-container--is-multi":o,"value-container--has-value":u},n)},t)}},We=[{base:"A",letters:/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},{base:"AA",letters:/[\uA732]/g},{base:"AE",letters:/[\u00C6\u01FC\u01E2]/g},{base:"AO",letters:/[\uA734]/g},{base:"AU",letters:/[\uA736]/g},{base:"AV",letters:/[\uA738\uA73A]/g},{base:"AY",letters:/[\uA73C]/g},{base:"B",letters:/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g},{base:"C",letters:/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g},{base:"D",letters:/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g},{base:"DZ",letters:/[\u01F1\u01C4]/g},{base:"Dz",letters:/[\u01F2\u01C5]/g},{base:"E",letters:/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g},{base:"F",letters:/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g},{base:"G",letters:/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g},{base:"H",letters:/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g},{base:"I",letters:/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g},{base:"J",letters:/[\u004A\u24BF\uFF2A\u0134\u0248]/g},{base:"K",letters:/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g},{base:"L",letters:/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g},{base:"LJ",letters:/[\u01C7]/g},{base:"Lj",letters:/[\u01C8]/g},{base:"M",letters:/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g},{base:"N",letters:/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g},{base:"NJ",letters:/[\u01CA]/g},{base:"Nj",letters:/[\u01CB]/g},{base:"O",letters:/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g},{base:"OI",letters:/[\u01A2]/g},{base:"OO",letters:/[\uA74E]/g},{base:"OU",letters:/[\u0222]/g},{base:"P",letters:/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g},{base:"Q",letters:/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g},{base:"R",letters:/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g},{base:"S",letters:/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g},{base:"T",letters:/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g},{base:"TZ",letters:/[\uA728]/g},{base:"U",letters:/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g},{base:"V",letters:/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g},{base:"VY",letters:/[\uA760]/g},{base:"W",letters:/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g},{base:"X",letters:/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g},{base:"Y",letters:/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g},{base:"Z",letters:/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g},{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}],Ge=function(e){for(var t=0;t=0||(o[n]=e[n]);return o}(e,["in","out","onExited","appear","enter","exit","innerRef","emotion"]));return B("input",Ze({ref:t},n,{css:k({label:"dummyInput",background:0,border:0,fontSize:"inherit",outline:0,padding:0,width:1,color:"transparent",left:-100,opacity:0,position:"relative",transform:"scale(0)"},"")}))}var et=function(e){var t,n;function r(){return e.apply(this,arguments)||this}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var o=r.prototype;return o.componentDidMount=function(){this.props.innerRef(Object(U.findDOMNode)(this))},o.componentWillUnmount=function(){this.props.innerRef(null)},o.render=function(){return this.props.children},r}(r.Component),tt=["boxSizing","height","overflow","paddingRight","position"],nt={boxSizing:"border-box",overflow:"hidden",position:"relative",height:"100%"};function rt(e){e.preventDefault()}function ot(e){e.stopPropagation()}function it(){var e=this.scrollTop,t=this.scrollHeight,n=e+this.offsetHeight;0===e?this.scrollTop=1:n===t&&(this.scrollTop=e-1)}function ut(){return"ontouchstart"in window||navigator.maxTouchPoints}var at=!(!window.document||!window.document.createElement),st=0,lt=function(e){var t,n;function r(){for(var t,n=arguments.length,r=new Array(n),o=0;o0,h=c-p-l,m=!1;h>n&&t.isBottom&&(i&&i(e),t.isBottom=!1),d&&t.isTop&&(a&&a(e),t.isTop=!1),d&&n>h?(o&&!t.isBottom&&o(e),f.scrollTop=c,m=!0,t.isBottom=!0):!d&&-n>l&&(u&&!t.isTop&&u(e),f.scrollTop=0,m=!0,t.isTop=!0),m&&t.cancelScroll(e)},t.onWheel=function(e){t.handleEventDelta(e,e.deltaY)},t.onTouchStart=function(e){t.touchStart=e.changedTouches[0].clientY},t.onTouchMove=function(e){var n=t.touchStart-e.changedTouches[0].clientY;t.handleEventDelta(e,n)},t.getScrollTarget=function(e){t.scrollTarget=e},t}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var i=r.prototype;return i.componentDidMount=function(){this.startListening(this.scrollTarget)},i.componentWillUnmount=function(){this.stopListening(this.scrollTarget)},i.startListening=function(e){e&&("function"==typeof e.addEventListener&&e.addEventListener("wheel",this.onWheel,!1),"function"==typeof e.addEventListener&&e.addEventListener("touchstart",this.onTouchStart,!1),"function"==typeof e.addEventListener&&e.addEventListener("touchmove",this.onTouchMove,!1))},i.stopListening=function(e){"function"==typeof e.removeEventListener&&e.removeEventListener("wheel",this.onWheel,!1),"function"==typeof e.removeEventListener&&e.removeEventListener("touchstart",this.onTouchStart,!1),"function"==typeof e.removeEventListener&&e.removeEventListener("touchmove",this.onTouchMove,!1)},i.render=function(){return o.a.createElement(et,{innerRef:this.getScrollTarget},this.props.children)},r}(r.Component);function dt(e){var t=e.isEnabled,n=void 0===t||t,r=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,["isEnabled"]);return n?o.a.createElement(ft,r):r.children}var ht=function(e,t){void 0===t&&(t={});var n=t,r=n.isSearchable,o=n.isMulti,i=n.label,u=n.isDisabled;switch(e){case"menu":return"Use Up and Down to choose options"+(u?"":", press Enter to select the currently focused option")+", press Escape to exit the menu, press Tab to select the option and exit the menu.";case"input":return(i||"Select")+" is focused "+(r?",type to refine list":"")+", press Down to open the menu, "+(o?" press left to focus selected values":"");case"value":return"Use left and right to toggle between focused values, press Backspace to remove the currently focused value"}},mt=function(e,t){var n=t.value,r=t.isDisabled;if(n)switch(e){case"deselect-option":case"pop-value":case"remove-value":return"option "+n+", deselected.";case"select-option":return r?"option "+n+" is disabled. Select another option.":"option "+n+", selected."}},vt=function(e){return!!e.isDisabled};var gt={clearIndicator:xe,container:function(e){var t=e.isDisabled;return{label:"container",direction:e.isRtl?"rtl":null,pointerEvents:t?"none":null,position:"relative"}},control:function(e){var t=e.isDisabled,n=e.isFocused,r=e.theme,o=r.colors,i=r.borderRadius,u=r.spacing;return{label:"control",alignItems:"center",backgroundColor:t?o.neutral5:o.neutral0,borderColor:t?o.neutral10:n?o.primary:o.neutral20,borderRadius:i,borderStyle:"solid",borderWidth:1,boxShadow:n?"0 0 0 1px "+o.primary:null,cursor:"default",display:"flex",flexWrap:"wrap",justifyContent:"space-between",minHeight:u.controlHeight,outline:"0 !important",position:"relative",transition:"all 100ms","&:hover":{borderColor:n?o.primary:o.neutral30}}},dropdownIndicator:Fe,group:function(e){var t=e.theme.spacing;return{paddingBottom:2*t.baseUnit,paddingTop:2*t.baseUnit}},groupHeading:function(e){var t=e.theme.spacing;return{label:"group",color:"#999",cursor:"default",display:"block",fontSize:"75%",fontWeight:"500",marginBottom:"0.25em",paddingLeft:3*t.baseUnit,paddingRight:3*t.baseUnit,textTransform:"uppercase"}},indicatorsContainer:function(){return{alignItems:"center",alignSelf:"stretch",display:"flex",flexShrink:0}},indicatorSeparator:function(e){var t=e.isDisabled,n=e.theme,r=n.spacing.baseUnit,o=n.colors;return{label:"indicatorSeparator",alignSelf:"stretch",backgroundColor:t?o.neutral10:o.neutral20,marginBottom:2*r,marginTop:2*r,width:1}},input:function(e){var t=e.isDisabled,n=e.theme,r=n.spacing,o=n.colors;return{margin:r.baseUnit/2,paddingBottom:r.baseUnit/2,paddingTop:r.baseUnit/2,visibility:t?"hidden":"visible",color:o.neutral80}},loadingIndicator:function(e){var t=e.isFocused,n=e.size,r=e.theme,o=r.colors,i=r.spacing.baseUnit;return{label:"loadingIndicator",color:t?o.neutral60:o.neutral20,display:"flex",padding:2*i,transition:"color 150ms",alignSelf:"center",fontSize:n,lineHeight:1,marginRight:n,textAlign:"center",verticalAlign:"middle"}},loadingMessage:le,menu:function(e){var t,n=e.placement,r=e.theme,o=r.borderRadius,i=r.spacing,u=r.colors;return(t={label:"menu"})[function(e){return e?{bottom:"top",top:"bottom"}[e]:"bottom"}(n)]="100%",t.backgroundColor=u.neutral0,t.borderRadius=o,t.boxShadow="0 0 0 1px hsla(0, 0%, 0%, 0.1), 0 4px 11px hsla(0, 0%, 0%, 0.1)",t.marginBottom=i.menuGutter,t.marginTop=i.menuGutter,t.position="absolute",t.width="100%",t.zIndex=1,t},menuList:function(e){var t=e.maxHeight,n=e.theme.spacing.baseUnit;return{maxHeight:t,overflowY:"auto",paddingBottom:n,paddingTop:n,position:"relative",WebkitOverflowScrolling:"touch"}},menuPortal:function(e){var t=e.rect,n=e.offset,r=e.position;return{left:t.left,position:r,top:n,width:t.width,zIndex:1}},multiValue:function(e){var t=e.theme,n=t.spacing,r=t.borderRadius;return{label:"multiValue",backgroundColor:t.colors.neutral10,borderRadius:r/2,display:"flex",margin:n.baseUnit/2,minWidth:0}},multiValueLabel:function(e){var t=e.theme,n=t.borderRadius,r=t.colors,o=e.cropWithEllipsis;return{borderRadius:n/2,color:r.neutral80,fontSize:"85%",overflow:"hidden",padding:3,paddingLeft:6,textOverflow:o?"ellipsis":null,whiteSpace:"nowrap"}},multiValueRemove:function(e){var t=e.theme,n=t.spacing,r=t.borderRadius,o=t.colors;return{alignItems:"center",borderRadius:r/2,backgroundColor:e.isFocused&&o.dangerLight,display:"flex",paddingLeft:n.baseUnit,paddingRight:n.baseUnit,":hover":{backgroundColor:o.dangerLight,color:o.danger}}},noOptionsMessage:se,option:function(e){var t=e.isDisabled,n=e.isFocused,r=e.isSelected,o=e.theme,i=o.spacing,u=o.colors;return{label:"option",backgroundColor:r?u.primary:n?u.primary25:"transparent",color:t?u.neutral20:r?u.neutral0:"inherit",cursor:"default",display:"block",fontSize:"inherit",padding:2*i.baseUnit+"px "+3*i.baseUnit+"px",width:"100%",userSelect:"none",WebkitTapHighlightColor:"rgba(0, 0, 0, 0)",":active":{backgroundColor:!t&&(r?u.primary:u.primary50)}}},placeholder:function(e){var t=e.theme,n=t.spacing;return{label:"placeholder",color:t.colors.neutral50,marginLeft:n.baseUnit/2,marginRight:n.baseUnit/2,position:"absolute",top:"50%",transform:"translateY(-50%)"}},singleValue:function(e){var t=e.isDisabled,n=e.theme,r=n.spacing,o=n.colors;return{label:"singleValue",color:t?o.neutral40:o.neutral80,marginLeft:r.baseUnit/2,marginRight:r.baseUnit/2,maxWidth:"calc(100% - "+2*r.baseUnit+"px)",overflow:"hidden",position:"absolute",textOverflow:"ellipsis",whiteSpace:"nowrap",top:"50%",transform:"translateY(-50%)"}},valueContainer:function(e){var t=e.theme.spacing;return{alignItems:"center",display:"flex",flex:1,flexWrap:"wrap",padding:t.baseUnit/2+"px "+2*t.baseUnit+"px",WebkitOverflowScrolling:"touch",position:"relative",overflow:"hidden"}}};var bt={borderRadius:4,colors:{primary:"#2684FF",primary75:"#4C9AFF",primary50:"#B2D4FF",primary25:"#DEEBFF",danger:"#DE350B",dangerLight:"#FFBDAD",neutral0:"hsl(0, 0%, 100%)",neutral5:"hsl(0, 0%, 95%)",neutral10:"hsl(0, 0%, 90%)",neutral20:"hsl(0, 0%, 80%)",neutral30:"hsl(0, 0%, 70%)",neutral40:"hsl(0, 0%, 60%)",neutral50:"hsl(0, 0%, 50%)",neutral60:"hsl(0, 0%, 40%)",neutral70:"hsl(0, 0%, 30%)",neutral80:"hsl(0, 0%, 20%)",neutral90:"hsl(0, 0%, 10%)"},spacing:{baseUnit:4,controlHeight:38,menuGutter:8}};function Et(){return(Et=Object.assign||function(e){for(var t=1;t-1},formatGroupLabel:function(e){return e.label},getOptionLabel:function(e){return e.label},getOptionValue:function(e){return e.value},isDisabled:!1,isLoading:!1,isMulti:!1,isRtl:!1,isSearchable:!0,isOptionDisabled:vt,loadingMessage:function(){return"Loading..."},maxMenuHeight:300,minMenuHeight:140,menuIsOpen:!1,menuPlacement:"bottom",menuPosition:"absolute",menuShouldBlockScroll:!1,menuShouldScrollIntoView:!function(){try{return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}catch(e){return!1}}(),noOptionsMessage:function(){return"No options"},openMenuOnFocus:!1,openMenuOnClick:!0,options:[],pageSize:5,placeholder:"Select...",screenReaderStatus:function(e){var t=e.count;return t+" result"+(1!==t?"s":"")+" available"},styles:{},tabIndex:"0",tabSelectsValue:!0},At=1,wt=function(e){var t,n;function r(t){var n;(n=e.call(this,t)||this).state={ariaLiveSelection:"",ariaLiveContext:"",focusedOption:null,focusedValue:null,inputIsHidden:!1,isFocused:!1,menuOptions:{render:[],focusable:[]},selectValue:[]},n.blockOptionHover=!1,n.isComposing=!1,n.clearFocusValueOnUpdate=!1,n.commonProps=void 0,n.components=void 0,n.hasGroups=!1,n.initialTouchX=0,n.initialTouchY=0,n.inputIsHiddenAfterUpdate=void 0,n.instancePrefix="",n.openAfterFocus=!1,n.scrollToFocusedOptionOnUpdate=!1,n.userIsDragging=void 0,n.controlRef=null,n.getControlRef=function(e){n.controlRef=e},n.focusedOptionRef=null,n.getFocusedOptionRef=function(e){n.focusedOptionRef=e},n.menuListRef=null,n.getMenuListRef=function(e){n.menuListRef=e},n.inputRef=null,n.getInputRef=function(e){n.inputRef=e},n.cacheComponents=function(e){n.components=Ue({},ze,{components:e}.components)},n.focus=n.focusInput,n.blur=n.blurInput,n.onChange=function(e,t){var r=n.props;(0,r.onChange)(e,Et({},t,{name:r.name}))},n.setValue=function(e,t,r){void 0===t&&(t="set-value");var o=n.props,i=o.closeMenuOnSelect,u=o.isMulti;n.onInputChange("",{action:"set-value"}),i&&(n.inputIsHiddenAfterUpdate=!u,n.onMenuClose()),n.clearFocusValueOnUpdate=!0,n.onChange(e,{action:t,option:r})},n.selectOption=function(e){var t=n.props,r=t.blurInputOnSelect,o=t.isMulti,i=n.state.selectValue;if(o)if(n.isOptionSelected(e,i)){var u=n.getOptionValue(e);n.setValue(i.filter((function(e){return n.getOptionValue(e)!==u})),"deselect-option",e),n.announceAriaLiveSelection({event:"deselect-option",context:{value:n.getOptionLabel(e)}})}else n.isOptionDisabled(e,i)?n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e),isDisabled:!0}}):(n.setValue([].concat(i,[e]),"select-option",e),n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e)}}));else n.isOptionDisabled(e,i)?n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e),isDisabled:!0}}):(n.setValue(e,"select-option"),n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e)}}));r&&n.blurInput()},n.removeValue=function(e){var t=n.state.selectValue,r=n.getOptionValue(e),o=t.filter((function(e){return n.getOptionValue(e)!==r}));n.onChange(o.length?o:null,{action:"remove-value",removedValue:e}),n.announceAriaLiveSelection({event:"remove-value",context:{value:e?n.getOptionLabel(e):""}}),n.focusInput()},n.clearValue=function(){var e=n.props.isMulti;n.onChange(e?[]:null,{action:"clear"})},n.popValue=function(){var e=n.state.selectValue,t=e[e.length-1],r=e.slice(0,e.length-1);n.announceAriaLiveSelection({event:"pop-value",context:{value:t?n.getOptionLabel(t):""}}),n.onChange(r.length?r:null,{action:"pop-value",removedValue:t})},n.getOptionLabel=function(e){return n.props.getOptionLabel(e)},n.getOptionValue=function(e){return n.props.getOptionValue(e)},n.getStyles=function(e,t){var r=gt[e](t);r.boxSizing="border-box";var o=n.props.styles[e];return o?o(r,t):r},n.getElementId=function(e){return n.instancePrefix+"-"+e},n.getActiveDescendentId=function(){var e=n.props.menuIsOpen,t=n.state,r=t.menuOptions,o=t.focusedOption;if(o&&e){var i=r.focusable.indexOf(o),u=r.render[i];return u&&u.key}},n.announceAriaLiveSelection=function(e){var t=e.event,r=e.context;n.setState({ariaLiveSelection:mt(t,r)})},n.announceAriaLiveContext=function(e){var t=e.event,r=e.context;n.setState({ariaLiveContext:ht(t,Et({},r,{label:n.props["aria-label"]}))})},n.onMenuMouseDown=function(e){0===e.button&&(e.stopPropagation(),e.preventDefault(),n.focusInput())},n.onMenuMouseMove=function(e){n.blockOptionHover=!1},n.onControlMouseDown=function(e){var t=n.props.openMenuOnClick;n.state.isFocused?n.props.menuIsOpen?"INPUT"!==e.target.tagName&&"TEXTAREA"!==e.target.tagName&&n.onMenuClose():t&&n.openMenu("first"):(t&&(n.openAfterFocus=!0),n.focusInput()),"INPUT"!==e.target.tagName&&"TEXTAREA"!==e.target.tagName&&e.preventDefault()},n.onDropdownIndicatorMouseDown=function(e){if(!(e&&"mousedown"===e.type&&0!==e.button||n.props.isDisabled)){var t=n.props,r=t.isMulti,o=t.menuIsOpen;n.focusInput(),o?(n.inputIsHiddenAfterUpdate=!r,n.onMenuClose()):n.openMenu("first"),e.preventDefault(),e.stopPropagation()}},n.onClearIndicatorMouseDown=function(e){e&&"mousedown"===e.type&&0!==e.button||(n.clearValue(),e.stopPropagation(),n.openAfterFocus=!1,"touchend"===e.type?n.focusInput():setTimeout((function(){return n.focusInput()})))},n.onScroll=function(e){"boolean"==typeof n.props.closeMenuOnScroll?e.target instanceof HTMLElement&&K(e.target)&&n.props.onMenuClose():"function"==typeof n.props.closeMenuOnScroll&&n.props.closeMenuOnScroll(e)&&n.props.onMenuClose()},n.onCompositionStart=function(){n.isComposing=!0},n.onCompositionEnd=function(){n.isComposing=!1},n.onTouchStart=function(e){var t=e.touches.item(0);t&&(n.initialTouchX=t.clientX,n.initialTouchY=t.clientY,n.userIsDragging=!1)},n.onTouchMove=function(e){var t=e.touches.item(0);if(t){var r=Math.abs(t.clientX-n.initialTouchX),o=Math.abs(t.clientY-n.initialTouchY);n.userIsDragging=r>5||o>5}},n.onTouchEnd=function(e){n.userIsDragging||(n.controlRef&&!n.controlRef.contains(e.target)&&n.menuListRef&&!n.menuListRef.contains(e.target)&&n.blurInput(),n.initialTouchX=0,n.initialTouchY=0)},n.onControlTouchEnd=function(e){n.userIsDragging||n.onControlMouseDown(e)},n.onClearIndicatorTouchEnd=function(e){n.userIsDragging||n.onClearIndicatorMouseDown(e)},n.onDropdownIndicatorTouchEnd=function(e){n.userIsDragging||n.onDropdownIndicatorMouseDown(e)},n.handleInputChange=function(e){var t=e.currentTarget.value;n.inputIsHiddenAfterUpdate=!1,n.onInputChange(t,{action:"input-change"}),n.onMenuOpen()},n.onInputFocus=function(e){var t=n.props,r=t.isSearchable,o=t.isMulti;n.props.onFocus&&n.props.onFocus(e),n.inputIsHiddenAfterUpdate=!1,n.announceAriaLiveContext({event:"input",context:{isSearchable:r,isMulti:o}}),n.setState({isFocused:!0}),(n.openAfterFocus||n.props.openMenuOnFocus)&&n.openMenu("first"),n.openAfterFocus=!1},n.onInputBlur=function(e){n.menuListRef&&n.menuListRef.contains(document.activeElement)?n.inputRef.focus():(n.props.onBlur&&n.props.onBlur(e),n.onInputChange("",{action:"input-blur"}),n.onMenuClose(),n.setState({focusedValue:null,isFocused:!1}))},n.onOptionHover=function(e){n.blockOptionHover||n.state.focusedOption===e||n.setState({focusedOption:e})},n.shouldHideSelectedOptions=function(){var e=n.props,t=e.hideSelectedOptions,r=e.isMulti;return void 0===t?r:t},n.onKeyDown=function(e){var t=n.props,r=t.isMulti,o=t.backspaceRemovesValue,i=t.escapeClearsValue,u=t.inputValue,a=t.isClearable,s=t.isDisabled,l=t.menuIsOpen,c=t.onKeyDown,p=t.tabSelectsValue,f=t.openMenuOnFocus,d=n.state,h=d.focusedOption,m=d.focusedValue,v=d.selectValue;if(!(s||"function"==typeof c&&(c(e),e.defaultPrevented))){switch(n.blockOptionHover=!0,e.key){case"ArrowLeft":if(!r||u)return;n.focusValue("previous");break;case"ArrowRight":if(!r||u)return;n.focusValue("next");break;case"Delete":case"Backspace":if(u)return;if(m)n.removeValue(m);else{if(!o)return;r?n.popValue():a&&n.clearValue()}break;case"Tab":if(n.isComposing)return;if(e.shiftKey||!l||!p||!h||f&&n.isOptionSelected(h,v))return;n.selectOption(h);break;case"Enter":if(229===e.keyCode)break;if(l){if(!h)return;if(n.isComposing)return;n.selectOption(h);break}return;case"Escape":l?(n.inputIsHiddenAfterUpdate=!1,n.onInputChange("",{action:"menu-close"}),n.onMenuClose()):a&&i&&n.clearValue();break;case" ":if(u)return;if(!l){n.openMenu("first");break}if(!h)return;n.selectOption(h);break;case"ArrowUp":l?n.focusOption("up"):n.openMenu("last");break;case"ArrowDown":l?n.focusOption("down"):n.openMenu("first");break;case"PageUp":if(!l)return;n.focusOption("pageup");break;case"PageDown":if(!l)return;n.focusOption("pagedown");break;case"Home":if(!l)return;n.focusOption("first");break;case"End":if(!l)return;n.focusOption("last");break;default:return}e.preventDefault()}},n.buildMenuOptions=function(e,t){var r=e.inputValue,o=void 0===r?"":r,i=e.options,u=function(e,r){var i=n.isOptionDisabled(e,t),u=n.isOptionSelected(e,t),a=n.getOptionLabel(e),s=n.getOptionValue(e);if(!(n.shouldHideSelectedOptions()&&u||!n.filterOption({label:a,value:s,data:e},o))){var l=i?void 0:function(){return n.onOptionHover(e)},c=i?void 0:function(){return n.selectOption(e)},p=n.getElementId("option")+"-"+r;return{innerProps:{id:p,onClick:c,onMouseMove:l,onMouseOver:l,tabIndex:-1},data:e,isDisabled:i,isSelected:u,key:p,label:a,type:"option",value:s}}};return i.reduce((function(e,t,r){if(t.options){n.hasGroups||(n.hasGroups=!0);var o=t.options.map((function(t,n){var o=u(t,r+"-"+n);return o&&e.focusable.push(t),o})).filter(Boolean);if(o.length){var i=n.getElementId("group")+"-"+r;e.render.push({type:"group",key:i,data:t,options:o})}}else{var a=u(t,""+r);a&&(e.render.push(a),e.focusable.push(t))}return e}),{render:[],focusable:[]})};var r=t.value;n.cacheComponents=u(n.cacheComponents,ve).bind(yt(yt(n))),n.cacheComponents(t.components),n.instancePrefix="react-select-"+(n.props.instanceId||++At);var o=X(r);n.buildMenuOptions=u(n.buildMenuOptions,(function(e,t){var n=e,r=n[0],o=n[1],i=t,u=i[0];return ve(o,i[1])&&ve(r.inputValue,u.inputValue)&&ve(r.options,u.options)})).bind(yt(yt(n)));var i=t.menuIsOpen?n.buildMenuOptions(t,o):{render:[],focusable:[]};return n.state.menuOptions=i,n.state.selectValue=o,n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var i=r.prototype;return i.componentDidMount=function(){this.startListeningComposition(),this.startListeningToTouch(),this.props.closeMenuOnScroll&&document&&document.addEventListener&&document.addEventListener("scroll",this.onScroll,!0),this.props.autoFocus&&this.focusInput()},i.UNSAFE_componentWillReceiveProps=function(e){var t=this.props,n=t.options,r=t.value,o=t.menuIsOpen,i=t.inputValue;if(this.cacheComponents(e.components),e.value!==r||e.options!==n||e.menuIsOpen!==o||e.inputValue!==i){var u=X(e.value),a=e.menuIsOpen?this.buildMenuOptions(e,u):{render:[],focusable:[]},s=this.getNextFocusedValue(u),l=this.getNextFocusedOption(a.focusable);this.setState({menuOptions:a,selectValue:u,focusedOption:l,focusedValue:s})}null!=this.inputIsHiddenAfterUpdate&&(this.setState({inputIsHidden:this.inputIsHiddenAfterUpdate}),delete this.inputIsHiddenAfterUpdate)},i.componentDidUpdate=function(e){var t,n,r,o,i,u=this.props,a=u.isDisabled,s=u.menuIsOpen,l=this.state.isFocused;(l&&!a&&e.isDisabled||l&&s&&!e.menuIsOpen)&&this.focusInput(),this.menuListRef&&this.focusedOptionRef&&this.scrollToFocusedOptionOnUpdate&&(t=this.menuListRef,n=this.focusedOptionRef,r=t.getBoundingClientRect(),o=n.getBoundingClientRect(),i=n.offsetHeight/3,o.bottom+i>r.bottom?q(t,Math.min(n.offsetTop+n.clientHeight-t.offsetHeight+i,t.scrollHeight)):o.top-i-1&&(a=s)}this.scrollToFocusedOptionOnUpdate=!(o&&this.menuListRef),this.inputIsHiddenAfterUpdate=!1,this.setState({menuOptions:i,focusedValue:null,focusedOption:i.focusable[a]},(function(){t.onMenuOpen(),t.announceAriaLiveContext({event:"menu"})}))},i.focusValue=function(e){var t=this.props,n=t.isMulti,r=t.isSearchable,o=this.state,i=o.selectValue,u=o.focusedValue;if(n){this.setState({focusedOption:null});var a=i.indexOf(u);u||(a=-1,this.announceAriaLiveContext({event:"value"}));var s=i.length-1,l=-1;if(i.length){switch(e){case"previous":l=0===a?0:-1===a?s:a-1;break;case"next":a>-1&&a0?u-1:o.length-1:"down"===e?i=(u+1)%o.length:"pageup"===e?(i=u-t)<0&&(i=0):"pagedown"===e?(i=u+t)>o.length-1&&(i=o.length-1):"last"===e&&(i=o.length-1),this.scrollToFocusedOptionOnUpdate=!0,this.setState({focusedOption:o[i],focusedValue:null}),this.announceAriaLiveContext({event:"menu",context:{isDisabled:vt(o[i])}})}},i.getTheme=function(){return this.props.theme?"function"==typeof this.props.theme?this.props.theme(bt):Et({},bt,this.props.theme):bt},i.getCommonProps=function(){var e=this.clearValue,t=this.getStyles,n=this.setValue,r=this.selectOption,o=this.props,i=o.classNamePrefix,u=o.isMulti,a=o.isRtl,s=o.options,l=this.state.selectValue,c=this.hasValue();return{cx:Y.bind(null,i),clearValue:e,getStyles:t,getValue:function(){return l},hasValue:c,isMulti:u,isRtl:a,options:s,selectOption:r,setValue:n,selectProps:o,theme:this.getTheme()}},i.getNextFocusedValue=function(e){if(this.clearFocusValueOnUpdate)return this.clearFocusValueOnUpdate=!1,null;var t=this.state,n=t.focusedValue,r=t.selectValue.indexOf(n);if(r>-1){if(e.indexOf(n)>-1)return n;if(r-1?t:e[0]},i.hasValue=function(){return this.state.selectValue.length>0},i.hasOptions=function(){return!!this.state.menuOptions.render.length},i.countOptions=function(){return this.state.menuOptions.focusable.length},i.isClearable=function(){var e=this.props,t=e.isClearable,n=e.isMulti;return void 0===t?n:t},i.isOptionDisabled=function(e,t){return"function"==typeof this.props.isOptionDisabled&&this.props.isOptionDisabled(e,t)},i.isOptionSelected=function(e,t){var n=this;if(t.indexOf(e)>-1)return!0;if("function"==typeof this.props.isOptionSelected)return this.props.isOptionSelected(e,t);var r=this.getOptionValue(e);return t.some((function(e){return n.getOptionValue(e)===r}))},i.filterOption=function(e,t){return!this.props.filterOption||this.props.filterOption(e,t)},i.formatOptionLabel=function(e,t){if("function"==typeof this.props.formatOptionLabel){var n=this.props.inputValue,r=this.state.selectValue;return this.props.formatOptionLabel(e,{context:t,inputValue:n,selectValue:r})}return this.getOptionLabel(e)},i.formatGroupLabel=function(e){return this.props.formatGroupLabel(e)},i.startListeningComposition=function(){document&&document.addEventListener&&(document.addEventListener("compositionstart",this.onCompositionStart,!1),document.addEventListener("compositionend",this.onCompositionEnd,!1))},i.stopListeningComposition=function(){document&&document.removeEventListener&&(document.removeEventListener("compositionstart",this.onCompositionStart),document.removeEventListener("compositionend",this.onCompositionEnd))},i.startListeningToTouch=function(){document&&document.addEventListener&&(document.addEventListener("touchstart",this.onTouchStart,!1),document.addEventListener("touchmove",this.onTouchMove,!1),document.addEventListener("touchend",this.onTouchEnd,!1))},i.stopListeningToTouch=function(){document&&document.removeEventListener&&(document.removeEventListener("touchstart",this.onTouchStart),document.removeEventListener("touchmove",this.onTouchMove),document.removeEventListener("touchend",this.onTouchEnd))},i.constructAriaLiveMessage=function(){var e=this.state,t=e.ariaLiveContext,n=e.selectValue,r=e.focusedValue,o=e.focusedOption,i=this.props,u=i.options,a=i.menuIsOpen,s=i.inputValue,l=i.screenReaderStatus;return(r?function(e){var t=e.focusedValue,n=e.getOptionLabel,r=e.selectValue;return"value "+n(t)+" focused, "+(r.indexOf(t)+1)+" of "+r.length+"."}({focusedValue:r,getOptionLabel:this.getOptionLabel,selectValue:n}):"")+" "+(o&&a?function(e){var t=e.focusedOption,n=e.getOptionLabel,r=e.options;return"option "+n(t)+" focused"+(t.isDisabled?" disabled":"")+", "+(r.indexOf(t)+1)+" of "+r.length+"."}({focusedOption:o,getOptionLabel:this.getOptionLabel,options:u}):"")+" "+function(e){var t=e.inputValue;return e.screenReaderMessage+(t?" for search term "+t:"")+"."}({inputValue:s,screenReaderMessage:l({count:this.countOptions()})})+" "+t},i.renderInput=function(){var e=this.props,t=e.isDisabled,n=e.isSearchable,r=e.inputId,i=e.inputValue,u=e.tabIndex,a=this.components.Input,s=this.state.inputIsHidden,l=r||this.getElementId("input"),c={"aria-autocomplete":"list","aria-label":this.props["aria-label"],"aria-labelledby":this.props["aria-labelledby"]};if(!n)return o.a.createElement(Qe,Et({id:l,innerRef:this.getInputRef,onBlur:this.onInputBlur,onChange:G,onFocus:this.onInputFocus,readOnly:!0,disabled:t,tabIndex:u,value:""},c));var p=this.commonProps,f=p.cx,d=p.theme,h=p.selectProps;return o.a.createElement(a,Et({autoCapitalize:"none",autoComplete:"off",autoCorrect:"off",cx:f,getStyles:this.getStyles,id:l,innerRef:this.getInputRef,isDisabled:t,isHidden:s,onBlur:this.onInputBlur,onChange:this.handleInputChange,onFocus:this.onInputFocus,selectProps:h,spellCheck:"false",tabIndex:u,theme:d,type:"text",value:i},c))},i.renderPlaceholderOrValue=function(){var e=this,t=this.components,n=t.MultiValue,r=t.MultiValueContainer,i=t.MultiValueLabel,u=t.MultiValueRemove,a=t.SingleValue,s=t.Placeholder,l=this.commonProps,c=this.props,p=c.controlShouldRenderValue,f=c.isDisabled,d=c.isMulti,h=c.inputValue,m=c.placeholder,v=this.state,g=v.selectValue,b=v.focusedValue,E=v.isFocused;if(!this.hasValue()||!p)return h?null:o.a.createElement(s,Et({},l,{key:"placeholder",isDisabled:f,isFocused:E}),m);if(d)return g.map((function(t,a){var s=t===b;return o.a.createElement(n,Et({},l,{components:{Container:r,Label:i,Remove:u},isFocused:s,isDisabled:f,key:e.getOptionValue(t),index:a,removeProps:{onClick:function(){return e.removeValue(t)},onTouchEnd:function(){return e.removeValue(t)},onMouseDown:function(e){e.preventDefault(),e.stopPropagation()}},data:t}),e.formatOptionLabel(t,"value"))}));if(h)return null;var y=g[0];return o.a.createElement(a,Et({},l,{data:y,isDisabled:f}),this.formatOptionLabel(y,"value"))},i.renderClearIndicator=function(){var e=this.components.ClearIndicator,t=this.commonProps,n=this.props,r=n.isDisabled,i=n.isLoading,u=this.state.isFocused;if(!this.isClearable()||!e||r||!this.hasValue()||i)return null;var a={onMouseDown:this.onClearIndicatorMouseDown,onTouchEnd:this.onClearIndicatorTouchEnd,"aria-hidden":"true"};return o.a.createElement(e,Et({},t,{innerProps:a,isFocused:u}))},i.renderLoadingIndicator=function(){var e=this.components.LoadingIndicator,t=this.commonProps,n=this.props,r=n.isDisabled,i=n.isLoading,u=this.state.isFocused;if(!e||!i)return null;return o.a.createElement(e,Et({},t,{innerProps:{"aria-hidden":"true"},isDisabled:r,isFocused:u}))},i.renderIndicatorSeparator=function(){var e=this.components,t=e.DropdownIndicator,n=e.IndicatorSeparator;if(!t||!n)return null;var r=this.commonProps,i=this.props.isDisabled,u=this.state.isFocused;return o.a.createElement(n,Et({},r,{isDisabled:i,isFocused:u}))},i.renderDropdownIndicator=function(){var e=this.components.DropdownIndicator;if(!e)return null;var t=this.commonProps,n=this.props.isDisabled,r=this.state.isFocused,i={onMouseDown:this.onDropdownIndicatorMouseDown,onTouchEnd:this.onDropdownIndicatorTouchEnd,"aria-hidden":"true"};return o.a.createElement(e,Et({},t,{innerProps:i,isDisabled:n,isFocused:r}))},i.renderMenu=function(){var e=this,t=this.components,n=t.Group,r=t.GroupHeading,i=t.Menu,u=t.MenuList,a=t.MenuPortal,s=t.LoadingMessage,l=t.NoOptionsMessage,c=t.Option,p=this.commonProps,f=this.state,d=f.focusedOption,h=f.menuOptions,m=this.props,v=m.captureMenuScroll,g=m.inputValue,b=m.isLoading,E=m.loadingMessage,y=m.minMenuHeight,C=m.maxMenuHeight,O=m.menuIsOpen,A=m.menuPlacement,w=m.menuPosition,F=m.menuPortalTarget,x=m.menuShouldBlockScroll,S=m.menuShouldScrollIntoView,D=m.noOptionsMessage,k=m.onMenuScrollToTop,I=m.onMenuScrollToBottom;if(!O)return null;var M,P=function(t){var n=d===t.data;return t.innerRef=n?e.getFocusedOptionRef:void 0,o.a.createElement(c,Et({},p,t,{isFocused:n}),e.formatOptionLabel(t.data,"menu"))};if(this.hasOptions())M=h.render.map((function(t){if("group"===t.type){t.type;var i=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(t,["type"]),u=t.key+"-heading";return o.a.createElement(n,Et({},p,i,{Heading:r,headingProps:{id:u},label:e.formatGroupLabel(t.data)}),t.options.map((function(e){return P(e)})))}if("option"===t.type)return P(t)}));else if(b){var L=E({inputValue:g});if(null===L)return null;M=o.a.createElement(s,p,L)}else{var V=D({inputValue:g});if(null===V)return null;M=o.a.createElement(l,p,V)}var T={minMenuHeight:y,maxMenuHeight:C,menuPlacement:A,menuPosition:w,menuShouldScrollIntoView:S},R=o.a.createElement(ue,Et({},p,T),(function(t){var n=t.ref,r=t.placerProps,a=r.placement,s=r.maxHeight;return o.a.createElement(i,Et({},p,T,{innerRef:n,innerProps:{onMouseDown:e.onMenuMouseDown,onMouseMove:e.onMenuMouseMove},isLoading:b,placement:a}),o.a.createElement(dt,{isEnabled:v,onTopArrive:k,onBottomArrive:I},o.a.createElement(pt,{isEnabled:x},o.a.createElement(u,Et({},p,{innerRef:e.getMenuListRef,isLoading:b,maxHeight:s}),M))))}));return F||"fixed"===w?o.a.createElement(a,Et({},p,{appendTo:F,controlElement:this.controlRef,menuPlacement:A,menuPosition:w}),R):R},i.renderFormField=function(){var e=this,t=this.props,n=t.delimiter,r=t.isDisabled,i=t.isMulti,u=t.name,a=this.state.selectValue;if(u&&!r){if(i){if(n){var s=a.map((function(t){return e.getOptionValue(t)})).join(n);return o.a.createElement("input",{name:u,type:"hidden",value:s})}var l=a.length>0?a.map((function(t,n){return o.a.createElement("input",{key:"i-"+n,name:u,type:"hidden",value:e.getOptionValue(t)})})):o.a.createElement("input",{name:u,type:"hidden"});return o.a.createElement("div",null,l)}var c=a[0]?this.getOptionValue(a[0]):"";return o.a.createElement("input",{name:u,type:"hidden",value:c})}},i.renderLiveRegion=function(){return this.state.isFocused?o.a.createElement(qe,{"aria-live":"polite"},o.a.createElement("p",{id:"aria-selection-event"},"\xa0",this.state.ariaLiveSelection),o.a.createElement("p",{id:"aria-context"},"\xa0",this.constructAriaLiveMessage())):null},i.render=function(){var e=this.components,t=e.Control,n=e.IndicatorsContainer,r=e.SelectContainer,i=e.ValueContainer,u=this.props,a=u.className,s=u.id,l=u.isDisabled,c=u.menuIsOpen,p=this.state.isFocused,f=this.commonProps=this.getCommonProps();return o.a.createElement(r,Et({},f,{className:a,innerProps:{id:s,onKeyDown:this.onKeyDown},isDisabled:l,isFocused:p}),this.renderLiveRegion(),o.a.createElement(t,Et({},f,{innerRef:this.getControlRef,innerProps:{onMouseDown:this.onControlMouseDown,onTouchEnd:this.onControlTouchEnd},isDisabled:l,isFocused:p,menuIsOpen:c}),o.a.createElement(i,Et({},f,{isDisabled:l}),this.renderPlaceholderOrValue(),this.renderInput()),o.a.createElement(n,Et({},f,{isDisabled:l}),this.renderClearIndicator(),this.renderLoadingIndicator(),this.renderIndicatorSeparator(),this.renderDropdownIndicator())),this.renderMenu(),this.renderFormField())},r}(r.Component);function Ft(){return(Ft=Object.assign||function(e){for(var t=1;t1?n-1:0),o=1;o=0||(o[n]=e[n]);return o}(t,["defaultInputValue","defaultMenuIsOpen","defaultValue"]));return o.a.createElement(St,Ft({},n,{ref:function(t){e.select=t},inputValue:this.getProp("inputValue"),menuIsOpen:this.getProp("menuIsOpen"),onChange:this.onChange,onInputChange:this.onInputChange,onMenuClose:this.onMenuClose,onMenuOpen:this.onMenuOpen,value:this.getProp("value")}))},r}(r.Component),Dt.defaultProps=xt,kt);t.a=It},494:function(e,t,n){"use strict";var r=n(0),o=Object(r.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=o},505:function(e,t,n){var r=n(30),o=n(54),i=n(27),u=n(26),a=n(506);e.exports=function(e,t){var n=1==e,s=2==e,l=3==e,c=4==e,p=6==e,f=5==e||p,d=t||a;return function(t,a,h){for(var m,v,g=i(t),b=o(g),E=r(a,h,3),y=u(b.length),C=0,O=n?d(t,y):s?d(t,0):void 0;y>C;C++)if((f||C in b)&&(v=E(m=b[C],C,g),e))if(n)O[C]=v;else if(v)switch(e){case 3:return!0;case 5:return m;case 6:return C;case 2:O.push(m)}else if(c)return!1;return p?-1:l||c?c:O}}},506:function(e,t,n){var r=n(507);e.exports=function(e,t){return new(r(e))(t)}},507:function(e,t,n){var r=n(13),o=n(508),i=n(2)("species");e.exports=function(e){var t;return o(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!o(t.prototype)||(t=void 0),r(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},508:function(e,t,n){var r=n(23);e.exports=Array.isArray||function(e){return"Array"==r(e)}},526:function(e,t){e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},606:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(this.props,[]);return function(e){c.forEach((function(t){return delete e[t]}))}(o),o.className=this.props.inputClassName,o.id=this.state.inputId,o.style=n,u.default.createElement("div",{className:this.props.className,style:t},this.renderStyles(),u.default.createElement("input",r({},o,{ref:this.inputRef})),u.default.createElement("div",{ref:this.sizerRef,style:l},e),this.props.placeholder?u.default.createElement("div",{ref:this.placeHolderSizerRef,style:l},this.props.placeholder):null)}}]),t}(i.Component);h.propTypes={className:a.default.string,defaultValue:a.default.any,extraWidth:a.default.oneOfType([a.default.number,a.default.string]),id:a.default.string,injectStyles:a.default.bool,inputClassName:a.default.string,inputRef:a.default.func,inputStyle:a.default.object,minWidth:a.default.oneOfType([a.default.number,a.default.string]),onAutosize:a.default.func,onChange:a.default.func,placeholder:a.default.string,placeholderIsMinWidth:a.default.bool,style:a.default.object,value:a.default.any},h.defaultProps={minWidth:1,injectStyles:!0},t.default=h}}]); \ No newline at end of file +/*! For license information please see 1.033cef57.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{463:function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),c=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a({},t,{},e)),n},p=function(e){var t=c(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=Object(r.forwardRef)((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,u=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=c(n),d=r,h=p["".concat(u,".").concat(d)]||p[d]||f[d]||i;return n?o.a.createElement(h,a({ref:t},l,{components:n})):o.a.createElement(h,a({ref:t},l))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,u=new Array(i);u[0]=d;var a={};for(var s in t)hasOwnProperty.call(t,s)&&(a[s]=t[s]);a.originalType=e,a.mdxType="string"==typeof e?e:r,u[1]=a;for(var l=2;l1?arguments[1]:void 0,n),s=u>2?arguments[2]:void 0,l=void 0===s?n:o(s,n);l>a;)t[a++]=e;return t}},471:function(e,t,n){"use strict";var r=n(475),o=n(51);function i(e,t){return t.encode?t.strict?r(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var n=function(e){var t;switch(e.arrayFormat){case"index":return function(e,n,r){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===r[e]&&(r[e]={}),r[e][t[1]]=n):r[e]=n};case"bracket":return function(e,n,r){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==r[e]?r[e]=[].concat(r[e],n):r[e]=[n]:r[e]=n};default:return function(e,t,n){void 0!==n[e]?n[e]=[].concat(n[e],t):n[e]=t}}}(t=o({arrayFormat:"none"},t)),r=Object.create(null);return"string"!=typeof e?r:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),o=t.shift(),i=t.length>0?t.join("="):void 0;i=void 0===i?null:decodeURIComponent(i),n(decodeURIComponent(o),i,r)})),Object.keys(r).sort().reduce((function(e,t){var n=r[t];return Boolean(n)&&"object"==typeof n&&!Array.isArray(n)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(n):e[t]=n,e}),Object.create(null))):r},t.stringify=function(e,t){var n=function(e){switch(e.arrayFormat){case"index":return function(t,n,r){return null===n?[i(t,e),"[",r,"]"].join(""):[i(t,e),"[",i(r,e),"]=",i(n,e)].join("")};case"bracket":return function(t,n){return null===n?i(t,e):[i(t,e),"[]=",i(n,e)].join("")};default:return function(t,n){return null===n?i(t,e):[i(t,e),"=",i(n,e)].join("")}}}(t=o({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(r){var o=e[r];if(void 0===o)return"";if(null===o)return i(r,t);if(Array.isArray(o)){var u=[];return o.slice().forEach((function(e){void 0!==e&&u.push(n(r,e,u.length))})),u.join("&")}return i(r,t)+"="+i(o,t)})).filter((function(e){return e.length>0})).join("&"):""}},475:function(e,t,n){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}},479:function(e,t,n){"use strict";var r=n(12),o=n(505)(5),i=!0;"find"in[]&&Array(1).find((function(){i=!1})),r(r.P+r.F*i,"Array",{find:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),n(74)("find")},480:function(e,t,n){"use strict";var r=n(8),o=n(526),i=n(55);n(56)("search",1,(function(e,t,n,u){return[function(n){var r=e(this),o=null==n?void 0:n[t];return void 0!==o?o.call(n,r):new RegExp(n)[t](String(r))},function(e){var t=u(n,e,this);if(t.done)return t.value;var a=r(e),s=String(this),l=a.lastIndex;o(l,0)||(a.lastIndex=0);var c=i(a,s);return o(a.lastIndex,l)||(a.lastIndex=l),null===c?-1:c.index}]}))},482:function(e,t,n){"use strict";var r=n(0),o=n(494);t.a=function(){return Object(r.useContext)(o.a)}},483:function(e,t,n){"use strict";var r=n(0),o=n.n(r);function i(e,t){if(e.length!==t.length)return!1;for(var n=0;nr&&(r=(t=t.trim()).charCodeAt(0)),r){case 38:return t.replace(m,"$1"+e.trim());case 58:return e.trim()+t.replace(m,"$1"+e.trim());default:if(0<1*n&&0s.charCodeAt(8))break;case 115:u=u.replace(s,"-webkit-"+s)+";"+u;break;case 207:case 102:u=u.replace(s,"-webkit-"+(102a.charCodeAt(0)&&(a=a.trim()),a=[a],0d)&&(N=(U=U.replace(" ",":")).length),0=4;++r,o-=4)t=1540483477*(65535&(t=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+(59797*(t>>>16)<<16),n=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&n)+(59797*(n>>>16)<<16);switch(o){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+(59797*(n>>>16)<<16)}return(((n=1540483477*(65535&(n^=n>>>13))+(59797*(n>>>16)<<16))^n>>>15)>>>0).toString(36)},b={animationIterationCount:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1};var E=/[A-Z]|^ms/g,y=/_EMO_([^_]+?)_([^]*?)_EMO_/g,C=function(e){return 45===e.charCodeAt(1)},O=function(e){return null!=e&&"boolean"!=typeof e},A=function(e){var t={};return function(n){return void 0===t[n]&&(t[n]=e(n)),t[n]}}((function(e){return C(e)?e:e.replace(E,"-$&").toLowerCase()})),w=function(e,t){switch(e){case"animation":case"animationName":if("string"==typeof t)return t.replace(y,(function(e,t,n){return x={name:t,styles:n,next:x},t}))}return 1===b[e]||C(e)||"number"!=typeof t||0===t?t:t+"px"};function F(e,t,n,r){if(null==n)return"";if(void 0!==n.__emotion_styles)return n;switch(typeof n){case"boolean":return"";case"object":if(1===n.anim)return x={name:n.name,styles:n.styles,next:x},n.name;if(void 0!==n.styles){var o=n.next;if(void 0!==o)for(;void 0!==o;)x={name:o.name,styles:o.styles,next:x},o=o.next;return n.styles+";"}return function(e,t,n){var r="";if(Array.isArray(n))for(var o=0;o-1}function J(e){return K(e)?window.pageYOffset:e.scrollTop}function q(e,t){K(e)?window.scrollTo(0,t):e.scrollTop=t}function Z(e,t,n,r){void 0===n&&(n=200),void 0===r&&(r=G);var o=J(e),i=t-o,u=0;!function t(){var a,s=i*((a=(a=u+=10)/n-1)*a*a+1)+o;q(e,s),u=d)return{placement:"bottom",maxHeight:t};if(A>=d&&!u)return i&&Z(s,w,160),{placement:"bottom",maxHeight:t};if(!u&&A>=r||u&&C>=r)return i&&Z(s,w,160),{placement:"bottom",maxHeight:u?C-b:A-b};if("auto"===o||u){var x=t,S=u?y:O;return S>=r&&(x=Math.min(S-b-a.controlHeight,t)),{placement:"top",maxHeight:x}}if("bottom"===o)return q(s,w),{placement:"bottom",maxHeight:t};break;case"top":if(y>=d)return{placement:"top",maxHeight:t};if(O>=d&&!u)return i&&Z(s,F,160),{placement:"top",maxHeight:t};if(!u&&O>=r||u&&y>=r){var D=t;return(!u&&O>=r||u&&y>=r)&&(D=u?y-E:O-E),i&&Z(s,F,160),{placement:"top",maxHeight:D}}return{placement:"bottom",maxHeight:t};default:throw new Error('Invalid placement provided "'+o+'".')}return l}var ie=function(e){return"auto"===e?"bottom":e},ue=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o=0||(o[n]=e[n]);return o}(e,["size"]);return B("svg",Ee({height:t,width:t,viewBox:"0 0 20 20","aria-hidden":"true",focusable:"false",css:ye},n))},Oe=function(e){return B(Ce,Ee({size:20},e),B("path",{d:"M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z"}))},Ae=function(e){return B(Ce,Ee({size:20},e),B("path",{d:"M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"}))},we=function(e){var t=e.isFocused,n=e.theme,r=n.spacing.baseUnit,o=n.colors;return{label:"indicatorContainer",color:t?o.neutral60:o.neutral20,display:"flex",padding:2*r,transition:"color 150ms",":hover":{color:t?o.neutral80:o.neutral40}}},Fe=we,xe=we,Se=function(){var e=k.apply(void 0,arguments),t="animation-"+e.name;return{name:t,styles:"@keyframes "+t+"{"+e.styles+"}",anim:1,toString:function(){return"_EMO_"+this.name+"_"+this.styles+"_EMO_"}}}(be()),De=function(e){var t=e.delay,n=e.offset;return B("span",{css:k({animation:Se+" 1s ease-in-out "+t+"ms infinite;",backgroundColor:"currentColor",borderRadius:"1em",display:"inline-block",marginLeft:n?"1em":null,height:"1em",verticalAlign:"top",width:"1em"},"")})},ke=function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.innerProps,i=e.isRtl;return B("div",Ee({},o,{css:r("loadingIndicator",e),className:n({indicator:!0,"loading-indicator":!0},t)}),B(De,{delay:0,offset:i}),B(De,{delay:160,offset:!0}),B(De,{delay:320,offset:!i}))};function Ie(){return(Ie=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,["className","cx","getStyles","theme","selectProps"]));return B("div",Me({css:r("groupHeading",Me({theme:o},i)),className:n({"group-heading":!0},t)},i))},IndicatorsContainer:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles;return B("div",{css:o("indicatorsContainer",e),className:r({indicators:!0},n)},t)},IndicatorSeparator:function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.innerProps;return B("span",Ee({},o,{css:r("indicatorSeparator",e),className:n({"indicator-separator":!0},t)}))},Input:function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.innerRef,i=e.isHidden,u=e.isDisabled,a=e.theme,s=(e.selectProps,function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,["className","cx","getStyles","innerRef","isHidden","isDisabled","theme","selectProps"]));return B("div",{css:r("input",Pe({theme:a},s))},B(te.a,Pe({className:n({input:!0},t),inputRef:o,inputStyle:Le(i),disabled:u},s)))},LoadingIndicator:ke,Menu:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.innerRef,u=e.innerProps;return B("div",ne({css:o("menu",e),className:r({menu:!0},n)},u,{ref:i}),t)},MenuList:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.isMulti,u=e.innerRef;return B("div",{css:o("menuList",e),className:r({"menu-list":!0,"menu-list--is-multi":i},n),ref:u},t)},MenuPortal:fe,LoadingMessage:pe,NoOptionsMessage:ce,MultiValue:Be,MultiValueContainer:Re,MultiValueLabel:je,MultiValueRemove:function(e){var t=e.children,n=e.innerProps;return B("div",n,t||B(Oe,{size:14}))},Option:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.isDisabled,u=e.isFocused,a=e.isSelected,s=e.innerRef,l=e.innerProps;return B("div",Ne({css:o("option",e),className:r({option:!0,"option--is-disabled":i,"option--is-focused":u,"option--is-selected":a},n),ref:s},l),t)},Placeholder:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.innerProps;return B("div",He({css:o("placeholder",e),className:r({placeholder:!0},n)},i),t)},SelectContainer:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.innerProps,u=e.isDisabled,a=e.isRtl;return B("div",ge({css:o("container",e),className:r({"--is-disabled":u,"--is-rtl":a},n)},i),t)},SingleValue:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.isDisabled,u=e.innerProps;return B("div",_e({css:o("singleValue",e),className:r({"single-value":!0,"single-value--is-disabled":i},n)},u),t)},ValueContainer:function(e){var t=e.children,n=e.className,r=e.cx,o=e.isMulti,i=e.getStyles,u=e.hasValue;return B("div",{css:i("valueContainer",e),className:r({"value-container":!0,"value-container--is-multi":o,"value-container--has-value":u},n)},t)}},We=[{base:"A",letters:/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},{base:"AA",letters:/[\uA732]/g},{base:"AE",letters:/[\u00C6\u01FC\u01E2]/g},{base:"AO",letters:/[\uA734]/g},{base:"AU",letters:/[\uA736]/g},{base:"AV",letters:/[\uA738\uA73A]/g},{base:"AY",letters:/[\uA73C]/g},{base:"B",letters:/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g},{base:"C",letters:/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g},{base:"D",letters:/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g},{base:"DZ",letters:/[\u01F1\u01C4]/g},{base:"Dz",letters:/[\u01F2\u01C5]/g},{base:"E",letters:/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g},{base:"F",letters:/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g},{base:"G",letters:/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g},{base:"H",letters:/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g},{base:"I",letters:/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g},{base:"J",letters:/[\u004A\u24BF\uFF2A\u0134\u0248]/g},{base:"K",letters:/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g},{base:"L",letters:/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g},{base:"LJ",letters:/[\u01C7]/g},{base:"Lj",letters:/[\u01C8]/g},{base:"M",letters:/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g},{base:"N",letters:/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g},{base:"NJ",letters:/[\u01CA]/g},{base:"Nj",letters:/[\u01CB]/g},{base:"O",letters:/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g},{base:"OI",letters:/[\u01A2]/g},{base:"OO",letters:/[\uA74E]/g},{base:"OU",letters:/[\u0222]/g},{base:"P",letters:/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g},{base:"Q",letters:/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g},{base:"R",letters:/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g},{base:"S",letters:/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g},{base:"T",letters:/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g},{base:"TZ",letters:/[\uA728]/g},{base:"U",letters:/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g},{base:"V",letters:/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g},{base:"VY",letters:/[\uA760]/g},{base:"W",letters:/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g},{base:"X",letters:/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g},{base:"Y",letters:/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g},{base:"Z",letters:/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g},{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}],Ge=function(e){for(var t=0;t=0||(o[n]=e[n]);return o}(e,["in","out","onExited","appear","enter","exit","innerRef","emotion"]));return B("input",Ze({ref:t},n,{css:k({label:"dummyInput",background:0,border:0,fontSize:"inherit",outline:0,padding:0,width:1,color:"transparent",left:-100,opacity:0,position:"relative",transform:"scale(0)"},"")}))}var et=function(e){var t,n;function r(){return e.apply(this,arguments)||this}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var o=r.prototype;return o.componentDidMount=function(){this.props.innerRef(Object(U.findDOMNode)(this))},o.componentWillUnmount=function(){this.props.innerRef(null)},o.render=function(){return this.props.children},r}(r.Component),tt=["boxSizing","height","overflow","paddingRight","position"],nt={boxSizing:"border-box",overflow:"hidden",position:"relative",height:"100%"};function rt(e){e.preventDefault()}function ot(e){e.stopPropagation()}function it(){var e=this.scrollTop,t=this.scrollHeight,n=e+this.offsetHeight;0===e?this.scrollTop=1:n===t&&(this.scrollTop=e-1)}function ut(){return"ontouchstart"in window||navigator.maxTouchPoints}var at=!(!window.document||!window.document.createElement),st=0,lt=function(e){var t,n;function r(){for(var t,n=arguments.length,r=new Array(n),o=0;o0,h=c-p-l,m=!1;h>n&&t.isBottom&&(i&&i(e),t.isBottom=!1),d&&t.isTop&&(a&&a(e),t.isTop=!1),d&&n>h?(o&&!t.isBottom&&o(e),f.scrollTop=c,m=!0,t.isBottom=!0):!d&&-n>l&&(u&&!t.isTop&&u(e),f.scrollTop=0,m=!0,t.isTop=!0),m&&t.cancelScroll(e)},t.onWheel=function(e){t.handleEventDelta(e,e.deltaY)},t.onTouchStart=function(e){t.touchStart=e.changedTouches[0].clientY},t.onTouchMove=function(e){var n=t.touchStart-e.changedTouches[0].clientY;t.handleEventDelta(e,n)},t.getScrollTarget=function(e){t.scrollTarget=e},t}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var i=r.prototype;return i.componentDidMount=function(){this.startListening(this.scrollTarget)},i.componentWillUnmount=function(){this.stopListening(this.scrollTarget)},i.startListening=function(e){e&&("function"==typeof e.addEventListener&&e.addEventListener("wheel",this.onWheel,!1),"function"==typeof e.addEventListener&&e.addEventListener("touchstart",this.onTouchStart,!1),"function"==typeof e.addEventListener&&e.addEventListener("touchmove",this.onTouchMove,!1))},i.stopListening=function(e){"function"==typeof e.removeEventListener&&e.removeEventListener("wheel",this.onWheel,!1),"function"==typeof e.removeEventListener&&e.removeEventListener("touchstart",this.onTouchStart,!1),"function"==typeof e.removeEventListener&&e.removeEventListener("touchmove",this.onTouchMove,!1)},i.render=function(){return o.a.createElement(et,{innerRef:this.getScrollTarget},this.props.children)},r}(r.Component);function dt(e){var t=e.isEnabled,n=void 0===t||t,r=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,["isEnabled"]);return n?o.a.createElement(ft,r):r.children}var ht=function(e,t){void 0===t&&(t={});var n=t,r=n.isSearchable,o=n.isMulti,i=n.label,u=n.isDisabled;switch(e){case"menu":return"Use Up and Down to choose options"+(u?"":", press Enter to select the currently focused option")+", press Escape to exit the menu, press Tab to select the option and exit the menu.";case"input":return(i||"Select")+" is focused "+(r?",type to refine list":"")+", press Down to open the menu, "+(o?" press left to focus selected values":"");case"value":return"Use left and right to toggle between focused values, press Backspace to remove the currently focused value"}},mt=function(e,t){var n=t.value,r=t.isDisabled;if(n)switch(e){case"deselect-option":case"pop-value":case"remove-value":return"option "+n+", deselected.";case"select-option":return r?"option "+n+" is disabled. Select another option.":"option "+n+", selected."}},vt=function(e){return!!e.isDisabled};var gt={clearIndicator:xe,container:function(e){var t=e.isDisabled;return{label:"container",direction:e.isRtl?"rtl":null,pointerEvents:t?"none":null,position:"relative"}},control:function(e){var t=e.isDisabled,n=e.isFocused,r=e.theme,o=r.colors,i=r.borderRadius,u=r.spacing;return{label:"control",alignItems:"center",backgroundColor:t?o.neutral5:o.neutral0,borderColor:t?o.neutral10:n?o.primary:o.neutral20,borderRadius:i,borderStyle:"solid",borderWidth:1,boxShadow:n?"0 0 0 1px "+o.primary:null,cursor:"default",display:"flex",flexWrap:"wrap",justifyContent:"space-between",minHeight:u.controlHeight,outline:"0 !important",position:"relative",transition:"all 100ms","&:hover":{borderColor:n?o.primary:o.neutral30}}},dropdownIndicator:Fe,group:function(e){var t=e.theme.spacing;return{paddingBottom:2*t.baseUnit,paddingTop:2*t.baseUnit}},groupHeading:function(e){var t=e.theme.spacing;return{label:"group",color:"#999",cursor:"default",display:"block",fontSize:"75%",fontWeight:"500",marginBottom:"0.25em",paddingLeft:3*t.baseUnit,paddingRight:3*t.baseUnit,textTransform:"uppercase"}},indicatorsContainer:function(){return{alignItems:"center",alignSelf:"stretch",display:"flex",flexShrink:0}},indicatorSeparator:function(e){var t=e.isDisabled,n=e.theme,r=n.spacing.baseUnit,o=n.colors;return{label:"indicatorSeparator",alignSelf:"stretch",backgroundColor:t?o.neutral10:o.neutral20,marginBottom:2*r,marginTop:2*r,width:1}},input:function(e){var t=e.isDisabled,n=e.theme,r=n.spacing,o=n.colors;return{margin:r.baseUnit/2,paddingBottom:r.baseUnit/2,paddingTop:r.baseUnit/2,visibility:t?"hidden":"visible",color:o.neutral80}},loadingIndicator:function(e){var t=e.isFocused,n=e.size,r=e.theme,o=r.colors,i=r.spacing.baseUnit;return{label:"loadingIndicator",color:t?o.neutral60:o.neutral20,display:"flex",padding:2*i,transition:"color 150ms",alignSelf:"center",fontSize:n,lineHeight:1,marginRight:n,textAlign:"center",verticalAlign:"middle"}},loadingMessage:le,menu:function(e){var t,n=e.placement,r=e.theme,o=r.borderRadius,i=r.spacing,u=r.colors;return(t={label:"menu"})[function(e){return e?{bottom:"top",top:"bottom"}[e]:"bottom"}(n)]="100%",t.backgroundColor=u.neutral0,t.borderRadius=o,t.boxShadow="0 0 0 1px hsla(0, 0%, 0%, 0.1), 0 4px 11px hsla(0, 0%, 0%, 0.1)",t.marginBottom=i.menuGutter,t.marginTop=i.menuGutter,t.position="absolute",t.width="100%",t.zIndex=1,t},menuList:function(e){var t=e.maxHeight,n=e.theme.spacing.baseUnit;return{maxHeight:t,overflowY:"auto",paddingBottom:n,paddingTop:n,position:"relative",WebkitOverflowScrolling:"touch"}},menuPortal:function(e){var t=e.rect,n=e.offset,r=e.position;return{left:t.left,position:r,top:n,width:t.width,zIndex:1}},multiValue:function(e){var t=e.theme,n=t.spacing,r=t.borderRadius;return{label:"multiValue",backgroundColor:t.colors.neutral10,borderRadius:r/2,display:"flex",margin:n.baseUnit/2,minWidth:0}},multiValueLabel:function(e){var t=e.theme,n=t.borderRadius,r=t.colors,o=e.cropWithEllipsis;return{borderRadius:n/2,color:r.neutral80,fontSize:"85%",overflow:"hidden",padding:3,paddingLeft:6,textOverflow:o?"ellipsis":null,whiteSpace:"nowrap"}},multiValueRemove:function(e){var t=e.theme,n=t.spacing,r=t.borderRadius,o=t.colors;return{alignItems:"center",borderRadius:r/2,backgroundColor:e.isFocused&&o.dangerLight,display:"flex",paddingLeft:n.baseUnit,paddingRight:n.baseUnit,":hover":{backgroundColor:o.dangerLight,color:o.danger}}},noOptionsMessage:se,option:function(e){var t=e.isDisabled,n=e.isFocused,r=e.isSelected,o=e.theme,i=o.spacing,u=o.colors;return{label:"option",backgroundColor:r?u.primary:n?u.primary25:"transparent",color:t?u.neutral20:r?u.neutral0:"inherit",cursor:"default",display:"block",fontSize:"inherit",padding:2*i.baseUnit+"px "+3*i.baseUnit+"px",width:"100%",userSelect:"none",WebkitTapHighlightColor:"rgba(0, 0, 0, 0)",":active":{backgroundColor:!t&&(r?u.primary:u.primary50)}}},placeholder:function(e){var t=e.theme,n=t.spacing;return{label:"placeholder",color:t.colors.neutral50,marginLeft:n.baseUnit/2,marginRight:n.baseUnit/2,position:"absolute",top:"50%",transform:"translateY(-50%)"}},singleValue:function(e){var t=e.isDisabled,n=e.theme,r=n.spacing,o=n.colors;return{label:"singleValue",color:t?o.neutral40:o.neutral80,marginLeft:r.baseUnit/2,marginRight:r.baseUnit/2,maxWidth:"calc(100% - "+2*r.baseUnit+"px)",overflow:"hidden",position:"absolute",textOverflow:"ellipsis",whiteSpace:"nowrap",top:"50%",transform:"translateY(-50%)"}},valueContainer:function(e){var t=e.theme.spacing;return{alignItems:"center",display:"flex",flex:1,flexWrap:"wrap",padding:t.baseUnit/2+"px "+2*t.baseUnit+"px",WebkitOverflowScrolling:"touch",position:"relative",overflow:"hidden"}}};var bt={borderRadius:4,colors:{primary:"#2684FF",primary75:"#4C9AFF",primary50:"#B2D4FF",primary25:"#DEEBFF",danger:"#DE350B",dangerLight:"#FFBDAD",neutral0:"hsl(0, 0%, 100%)",neutral5:"hsl(0, 0%, 95%)",neutral10:"hsl(0, 0%, 90%)",neutral20:"hsl(0, 0%, 80%)",neutral30:"hsl(0, 0%, 70%)",neutral40:"hsl(0, 0%, 60%)",neutral50:"hsl(0, 0%, 50%)",neutral60:"hsl(0, 0%, 40%)",neutral70:"hsl(0, 0%, 30%)",neutral80:"hsl(0, 0%, 20%)",neutral90:"hsl(0, 0%, 10%)"},spacing:{baseUnit:4,controlHeight:38,menuGutter:8}};function Et(){return(Et=Object.assign||function(e){for(var t=1;t-1},formatGroupLabel:function(e){return e.label},getOptionLabel:function(e){return e.label},getOptionValue:function(e){return e.value},isDisabled:!1,isLoading:!1,isMulti:!1,isRtl:!1,isSearchable:!0,isOptionDisabled:vt,loadingMessage:function(){return"Loading..."},maxMenuHeight:300,minMenuHeight:140,menuIsOpen:!1,menuPlacement:"bottom",menuPosition:"absolute",menuShouldBlockScroll:!1,menuShouldScrollIntoView:!function(){try{return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}catch(e){return!1}}(),noOptionsMessage:function(){return"No options"},openMenuOnFocus:!1,openMenuOnClick:!0,options:[],pageSize:5,placeholder:"Select...",screenReaderStatus:function(e){var t=e.count;return t+" result"+(1!==t?"s":"")+" available"},styles:{},tabIndex:"0",tabSelectsValue:!0},At=1,wt=function(e){var t,n;function r(t){var n;(n=e.call(this,t)||this).state={ariaLiveSelection:"",ariaLiveContext:"",focusedOption:null,focusedValue:null,inputIsHidden:!1,isFocused:!1,menuOptions:{render:[],focusable:[]},selectValue:[]},n.blockOptionHover=!1,n.isComposing=!1,n.clearFocusValueOnUpdate=!1,n.commonProps=void 0,n.components=void 0,n.hasGroups=!1,n.initialTouchX=0,n.initialTouchY=0,n.inputIsHiddenAfterUpdate=void 0,n.instancePrefix="",n.openAfterFocus=!1,n.scrollToFocusedOptionOnUpdate=!1,n.userIsDragging=void 0,n.controlRef=null,n.getControlRef=function(e){n.controlRef=e},n.focusedOptionRef=null,n.getFocusedOptionRef=function(e){n.focusedOptionRef=e},n.menuListRef=null,n.getMenuListRef=function(e){n.menuListRef=e},n.inputRef=null,n.getInputRef=function(e){n.inputRef=e},n.cacheComponents=function(e){n.components=Ue({},ze,{components:e}.components)},n.focus=n.focusInput,n.blur=n.blurInput,n.onChange=function(e,t){var r=n.props;(0,r.onChange)(e,Et({},t,{name:r.name}))},n.setValue=function(e,t,r){void 0===t&&(t="set-value");var o=n.props,i=o.closeMenuOnSelect,u=o.isMulti;n.onInputChange("",{action:"set-value"}),i&&(n.inputIsHiddenAfterUpdate=!u,n.onMenuClose()),n.clearFocusValueOnUpdate=!0,n.onChange(e,{action:t,option:r})},n.selectOption=function(e){var t=n.props,r=t.blurInputOnSelect,o=t.isMulti,i=n.state.selectValue;if(o)if(n.isOptionSelected(e,i)){var u=n.getOptionValue(e);n.setValue(i.filter((function(e){return n.getOptionValue(e)!==u})),"deselect-option",e),n.announceAriaLiveSelection({event:"deselect-option",context:{value:n.getOptionLabel(e)}})}else n.isOptionDisabled(e,i)?n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e),isDisabled:!0}}):(n.setValue([].concat(i,[e]),"select-option",e),n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e)}}));else n.isOptionDisabled(e,i)?n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e),isDisabled:!0}}):(n.setValue(e,"select-option"),n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e)}}));r&&n.blurInput()},n.removeValue=function(e){var t=n.state.selectValue,r=n.getOptionValue(e),o=t.filter((function(e){return n.getOptionValue(e)!==r}));n.onChange(o.length?o:null,{action:"remove-value",removedValue:e}),n.announceAriaLiveSelection({event:"remove-value",context:{value:e?n.getOptionLabel(e):""}}),n.focusInput()},n.clearValue=function(){var e=n.props.isMulti;n.onChange(e?[]:null,{action:"clear"})},n.popValue=function(){var e=n.state.selectValue,t=e[e.length-1],r=e.slice(0,e.length-1);n.announceAriaLiveSelection({event:"pop-value",context:{value:t?n.getOptionLabel(t):""}}),n.onChange(r.length?r:null,{action:"pop-value",removedValue:t})},n.getOptionLabel=function(e){return n.props.getOptionLabel(e)},n.getOptionValue=function(e){return n.props.getOptionValue(e)},n.getStyles=function(e,t){var r=gt[e](t);r.boxSizing="border-box";var o=n.props.styles[e];return o?o(r,t):r},n.getElementId=function(e){return n.instancePrefix+"-"+e},n.getActiveDescendentId=function(){var e=n.props.menuIsOpen,t=n.state,r=t.menuOptions,o=t.focusedOption;if(o&&e){var i=r.focusable.indexOf(o),u=r.render[i];return u&&u.key}},n.announceAriaLiveSelection=function(e){var t=e.event,r=e.context;n.setState({ariaLiveSelection:mt(t,r)})},n.announceAriaLiveContext=function(e){var t=e.event,r=e.context;n.setState({ariaLiveContext:ht(t,Et({},r,{label:n.props["aria-label"]}))})},n.onMenuMouseDown=function(e){0===e.button&&(e.stopPropagation(),e.preventDefault(),n.focusInput())},n.onMenuMouseMove=function(e){n.blockOptionHover=!1},n.onControlMouseDown=function(e){var t=n.props.openMenuOnClick;n.state.isFocused?n.props.menuIsOpen?"INPUT"!==e.target.tagName&&"TEXTAREA"!==e.target.tagName&&n.onMenuClose():t&&n.openMenu("first"):(t&&(n.openAfterFocus=!0),n.focusInput()),"INPUT"!==e.target.tagName&&"TEXTAREA"!==e.target.tagName&&e.preventDefault()},n.onDropdownIndicatorMouseDown=function(e){if(!(e&&"mousedown"===e.type&&0!==e.button||n.props.isDisabled)){var t=n.props,r=t.isMulti,o=t.menuIsOpen;n.focusInput(),o?(n.inputIsHiddenAfterUpdate=!r,n.onMenuClose()):n.openMenu("first"),e.preventDefault(),e.stopPropagation()}},n.onClearIndicatorMouseDown=function(e){e&&"mousedown"===e.type&&0!==e.button||(n.clearValue(),e.stopPropagation(),n.openAfterFocus=!1,"touchend"===e.type?n.focusInput():setTimeout((function(){return n.focusInput()})))},n.onScroll=function(e){"boolean"==typeof n.props.closeMenuOnScroll?e.target instanceof HTMLElement&&K(e.target)&&n.props.onMenuClose():"function"==typeof n.props.closeMenuOnScroll&&n.props.closeMenuOnScroll(e)&&n.props.onMenuClose()},n.onCompositionStart=function(){n.isComposing=!0},n.onCompositionEnd=function(){n.isComposing=!1},n.onTouchStart=function(e){var t=e.touches.item(0);t&&(n.initialTouchX=t.clientX,n.initialTouchY=t.clientY,n.userIsDragging=!1)},n.onTouchMove=function(e){var t=e.touches.item(0);if(t){var r=Math.abs(t.clientX-n.initialTouchX),o=Math.abs(t.clientY-n.initialTouchY);n.userIsDragging=r>5||o>5}},n.onTouchEnd=function(e){n.userIsDragging||(n.controlRef&&!n.controlRef.contains(e.target)&&n.menuListRef&&!n.menuListRef.contains(e.target)&&n.blurInput(),n.initialTouchX=0,n.initialTouchY=0)},n.onControlTouchEnd=function(e){n.userIsDragging||n.onControlMouseDown(e)},n.onClearIndicatorTouchEnd=function(e){n.userIsDragging||n.onClearIndicatorMouseDown(e)},n.onDropdownIndicatorTouchEnd=function(e){n.userIsDragging||n.onDropdownIndicatorMouseDown(e)},n.handleInputChange=function(e){var t=e.currentTarget.value;n.inputIsHiddenAfterUpdate=!1,n.onInputChange(t,{action:"input-change"}),n.onMenuOpen()},n.onInputFocus=function(e){var t=n.props,r=t.isSearchable,o=t.isMulti;n.props.onFocus&&n.props.onFocus(e),n.inputIsHiddenAfterUpdate=!1,n.announceAriaLiveContext({event:"input",context:{isSearchable:r,isMulti:o}}),n.setState({isFocused:!0}),(n.openAfterFocus||n.props.openMenuOnFocus)&&n.openMenu("first"),n.openAfterFocus=!1},n.onInputBlur=function(e){n.menuListRef&&n.menuListRef.contains(document.activeElement)?n.inputRef.focus():(n.props.onBlur&&n.props.onBlur(e),n.onInputChange("",{action:"input-blur"}),n.onMenuClose(),n.setState({focusedValue:null,isFocused:!1}))},n.onOptionHover=function(e){n.blockOptionHover||n.state.focusedOption===e||n.setState({focusedOption:e})},n.shouldHideSelectedOptions=function(){var e=n.props,t=e.hideSelectedOptions,r=e.isMulti;return void 0===t?r:t},n.onKeyDown=function(e){var t=n.props,r=t.isMulti,o=t.backspaceRemovesValue,i=t.escapeClearsValue,u=t.inputValue,a=t.isClearable,s=t.isDisabled,l=t.menuIsOpen,c=t.onKeyDown,p=t.tabSelectsValue,f=t.openMenuOnFocus,d=n.state,h=d.focusedOption,m=d.focusedValue,v=d.selectValue;if(!(s||"function"==typeof c&&(c(e),e.defaultPrevented))){switch(n.blockOptionHover=!0,e.key){case"ArrowLeft":if(!r||u)return;n.focusValue("previous");break;case"ArrowRight":if(!r||u)return;n.focusValue("next");break;case"Delete":case"Backspace":if(u)return;if(m)n.removeValue(m);else{if(!o)return;r?n.popValue():a&&n.clearValue()}break;case"Tab":if(n.isComposing)return;if(e.shiftKey||!l||!p||!h||f&&n.isOptionSelected(h,v))return;n.selectOption(h);break;case"Enter":if(229===e.keyCode)break;if(l){if(!h)return;if(n.isComposing)return;n.selectOption(h);break}return;case"Escape":l?(n.inputIsHiddenAfterUpdate=!1,n.onInputChange("",{action:"menu-close"}),n.onMenuClose()):a&&i&&n.clearValue();break;case" ":if(u)return;if(!l){n.openMenu("first");break}if(!h)return;n.selectOption(h);break;case"ArrowUp":l?n.focusOption("up"):n.openMenu("last");break;case"ArrowDown":l?n.focusOption("down"):n.openMenu("first");break;case"PageUp":if(!l)return;n.focusOption("pageup");break;case"PageDown":if(!l)return;n.focusOption("pagedown");break;case"Home":if(!l)return;n.focusOption("first");break;case"End":if(!l)return;n.focusOption("last");break;default:return}e.preventDefault()}},n.buildMenuOptions=function(e,t){var r=e.inputValue,o=void 0===r?"":r,i=e.options,u=function(e,r){var i=n.isOptionDisabled(e,t),u=n.isOptionSelected(e,t),a=n.getOptionLabel(e),s=n.getOptionValue(e);if(!(n.shouldHideSelectedOptions()&&u||!n.filterOption({label:a,value:s,data:e},o))){var l=i?void 0:function(){return n.onOptionHover(e)},c=i?void 0:function(){return n.selectOption(e)},p=n.getElementId("option")+"-"+r;return{innerProps:{id:p,onClick:c,onMouseMove:l,onMouseOver:l,tabIndex:-1},data:e,isDisabled:i,isSelected:u,key:p,label:a,type:"option",value:s}}};return i.reduce((function(e,t,r){if(t.options){n.hasGroups||(n.hasGroups=!0);var o=t.options.map((function(t,n){var o=u(t,r+"-"+n);return o&&e.focusable.push(t),o})).filter(Boolean);if(o.length){var i=n.getElementId("group")+"-"+r;e.render.push({type:"group",key:i,data:t,options:o})}}else{var a=u(t,""+r);a&&(e.render.push(a),e.focusable.push(t))}return e}),{render:[],focusable:[]})};var r=t.value;n.cacheComponents=u(n.cacheComponents,ve).bind(yt(yt(n))),n.cacheComponents(t.components),n.instancePrefix="react-select-"+(n.props.instanceId||++At);var o=X(r);n.buildMenuOptions=u(n.buildMenuOptions,(function(e,t){var n=e,r=n[0],o=n[1],i=t,u=i[0];return ve(o,i[1])&&ve(r.inputValue,u.inputValue)&&ve(r.options,u.options)})).bind(yt(yt(n)));var i=t.menuIsOpen?n.buildMenuOptions(t,o):{render:[],focusable:[]};return n.state.menuOptions=i,n.state.selectValue=o,n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var i=r.prototype;return i.componentDidMount=function(){this.startListeningComposition(),this.startListeningToTouch(),this.props.closeMenuOnScroll&&document&&document.addEventListener&&document.addEventListener("scroll",this.onScroll,!0),this.props.autoFocus&&this.focusInput()},i.UNSAFE_componentWillReceiveProps=function(e){var t=this.props,n=t.options,r=t.value,o=t.menuIsOpen,i=t.inputValue;if(this.cacheComponents(e.components),e.value!==r||e.options!==n||e.menuIsOpen!==o||e.inputValue!==i){var u=X(e.value),a=e.menuIsOpen?this.buildMenuOptions(e,u):{render:[],focusable:[]},s=this.getNextFocusedValue(u),l=this.getNextFocusedOption(a.focusable);this.setState({menuOptions:a,selectValue:u,focusedOption:l,focusedValue:s})}null!=this.inputIsHiddenAfterUpdate&&(this.setState({inputIsHidden:this.inputIsHiddenAfterUpdate}),delete this.inputIsHiddenAfterUpdate)},i.componentDidUpdate=function(e){var t,n,r,o,i,u=this.props,a=u.isDisabled,s=u.menuIsOpen,l=this.state.isFocused;(l&&!a&&e.isDisabled||l&&s&&!e.menuIsOpen)&&this.focusInput(),this.menuListRef&&this.focusedOptionRef&&this.scrollToFocusedOptionOnUpdate&&(t=this.menuListRef,n=this.focusedOptionRef,r=t.getBoundingClientRect(),o=n.getBoundingClientRect(),i=n.offsetHeight/3,o.bottom+i>r.bottom?q(t,Math.min(n.offsetTop+n.clientHeight-t.offsetHeight+i,t.scrollHeight)):o.top-i-1&&(a=s)}this.scrollToFocusedOptionOnUpdate=!(o&&this.menuListRef),this.inputIsHiddenAfterUpdate=!1,this.setState({menuOptions:i,focusedValue:null,focusedOption:i.focusable[a]},(function(){t.onMenuOpen(),t.announceAriaLiveContext({event:"menu"})}))},i.focusValue=function(e){var t=this.props,n=t.isMulti,r=t.isSearchable,o=this.state,i=o.selectValue,u=o.focusedValue;if(n){this.setState({focusedOption:null});var a=i.indexOf(u);u||(a=-1,this.announceAriaLiveContext({event:"value"}));var s=i.length-1,l=-1;if(i.length){switch(e){case"previous":l=0===a?0:-1===a?s:a-1;break;case"next":a>-1&&a0?u-1:o.length-1:"down"===e?i=(u+1)%o.length:"pageup"===e?(i=u-t)<0&&(i=0):"pagedown"===e?(i=u+t)>o.length-1&&(i=o.length-1):"last"===e&&(i=o.length-1),this.scrollToFocusedOptionOnUpdate=!0,this.setState({focusedOption:o[i],focusedValue:null}),this.announceAriaLiveContext({event:"menu",context:{isDisabled:vt(o[i])}})}},i.getTheme=function(){return this.props.theme?"function"==typeof this.props.theme?this.props.theme(bt):Et({},bt,this.props.theme):bt},i.getCommonProps=function(){var e=this.clearValue,t=this.getStyles,n=this.setValue,r=this.selectOption,o=this.props,i=o.classNamePrefix,u=o.isMulti,a=o.isRtl,s=o.options,l=this.state.selectValue,c=this.hasValue();return{cx:Y.bind(null,i),clearValue:e,getStyles:t,getValue:function(){return l},hasValue:c,isMulti:u,isRtl:a,options:s,selectOption:r,setValue:n,selectProps:o,theme:this.getTheme()}},i.getNextFocusedValue=function(e){if(this.clearFocusValueOnUpdate)return this.clearFocusValueOnUpdate=!1,null;var t=this.state,n=t.focusedValue,r=t.selectValue.indexOf(n);if(r>-1){if(e.indexOf(n)>-1)return n;if(r-1?t:e[0]},i.hasValue=function(){return this.state.selectValue.length>0},i.hasOptions=function(){return!!this.state.menuOptions.render.length},i.countOptions=function(){return this.state.menuOptions.focusable.length},i.isClearable=function(){var e=this.props,t=e.isClearable,n=e.isMulti;return void 0===t?n:t},i.isOptionDisabled=function(e,t){return"function"==typeof this.props.isOptionDisabled&&this.props.isOptionDisabled(e,t)},i.isOptionSelected=function(e,t){var n=this;if(t.indexOf(e)>-1)return!0;if("function"==typeof this.props.isOptionSelected)return this.props.isOptionSelected(e,t);var r=this.getOptionValue(e);return t.some((function(e){return n.getOptionValue(e)===r}))},i.filterOption=function(e,t){return!this.props.filterOption||this.props.filterOption(e,t)},i.formatOptionLabel=function(e,t){if("function"==typeof this.props.formatOptionLabel){var n=this.props.inputValue,r=this.state.selectValue;return this.props.formatOptionLabel(e,{context:t,inputValue:n,selectValue:r})}return this.getOptionLabel(e)},i.formatGroupLabel=function(e){return this.props.formatGroupLabel(e)},i.startListeningComposition=function(){document&&document.addEventListener&&(document.addEventListener("compositionstart",this.onCompositionStart,!1),document.addEventListener("compositionend",this.onCompositionEnd,!1))},i.stopListeningComposition=function(){document&&document.removeEventListener&&(document.removeEventListener("compositionstart",this.onCompositionStart),document.removeEventListener("compositionend",this.onCompositionEnd))},i.startListeningToTouch=function(){document&&document.addEventListener&&(document.addEventListener("touchstart",this.onTouchStart,!1),document.addEventListener("touchmove",this.onTouchMove,!1),document.addEventListener("touchend",this.onTouchEnd,!1))},i.stopListeningToTouch=function(){document&&document.removeEventListener&&(document.removeEventListener("touchstart",this.onTouchStart),document.removeEventListener("touchmove",this.onTouchMove),document.removeEventListener("touchend",this.onTouchEnd))},i.constructAriaLiveMessage=function(){var e=this.state,t=e.ariaLiveContext,n=e.selectValue,r=e.focusedValue,o=e.focusedOption,i=this.props,u=i.options,a=i.menuIsOpen,s=i.inputValue,l=i.screenReaderStatus;return(r?function(e){var t=e.focusedValue,n=e.getOptionLabel,r=e.selectValue;return"value "+n(t)+" focused, "+(r.indexOf(t)+1)+" of "+r.length+"."}({focusedValue:r,getOptionLabel:this.getOptionLabel,selectValue:n}):"")+" "+(o&&a?function(e){var t=e.focusedOption,n=e.getOptionLabel,r=e.options;return"option "+n(t)+" focused"+(t.isDisabled?" disabled":"")+", "+(r.indexOf(t)+1)+" of "+r.length+"."}({focusedOption:o,getOptionLabel:this.getOptionLabel,options:u}):"")+" "+function(e){var t=e.inputValue;return e.screenReaderMessage+(t?" for search term "+t:"")+"."}({inputValue:s,screenReaderMessage:l({count:this.countOptions()})})+" "+t},i.renderInput=function(){var e=this.props,t=e.isDisabled,n=e.isSearchable,r=e.inputId,i=e.inputValue,u=e.tabIndex,a=this.components.Input,s=this.state.inputIsHidden,l=r||this.getElementId("input"),c={"aria-autocomplete":"list","aria-label":this.props["aria-label"],"aria-labelledby":this.props["aria-labelledby"]};if(!n)return o.a.createElement(Qe,Et({id:l,innerRef:this.getInputRef,onBlur:this.onInputBlur,onChange:G,onFocus:this.onInputFocus,readOnly:!0,disabled:t,tabIndex:u,value:""},c));var p=this.commonProps,f=p.cx,d=p.theme,h=p.selectProps;return o.a.createElement(a,Et({autoCapitalize:"none",autoComplete:"off",autoCorrect:"off",cx:f,getStyles:this.getStyles,id:l,innerRef:this.getInputRef,isDisabled:t,isHidden:s,onBlur:this.onInputBlur,onChange:this.handleInputChange,onFocus:this.onInputFocus,selectProps:h,spellCheck:"false",tabIndex:u,theme:d,type:"text",value:i},c))},i.renderPlaceholderOrValue=function(){var e=this,t=this.components,n=t.MultiValue,r=t.MultiValueContainer,i=t.MultiValueLabel,u=t.MultiValueRemove,a=t.SingleValue,s=t.Placeholder,l=this.commonProps,c=this.props,p=c.controlShouldRenderValue,f=c.isDisabled,d=c.isMulti,h=c.inputValue,m=c.placeholder,v=this.state,g=v.selectValue,b=v.focusedValue,E=v.isFocused;if(!this.hasValue()||!p)return h?null:o.a.createElement(s,Et({},l,{key:"placeholder",isDisabled:f,isFocused:E}),m);if(d)return g.map((function(t,a){var s=t===b;return o.a.createElement(n,Et({},l,{components:{Container:r,Label:i,Remove:u},isFocused:s,isDisabled:f,key:e.getOptionValue(t),index:a,removeProps:{onClick:function(){return e.removeValue(t)},onTouchEnd:function(){return e.removeValue(t)},onMouseDown:function(e){e.preventDefault(),e.stopPropagation()}},data:t}),e.formatOptionLabel(t,"value"))}));if(h)return null;var y=g[0];return o.a.createElement(a,Et({},l,{data:y,isDisabled:f}),this.formatOptionLabel(y,"value"))},i.renderClearIndicator=function(){var e=this.components.ClearIndicator,t=this.commonProps,n=this.props,r=n.isDisabled,i=n.isLoading,u=this.state.isFocused;if(!this.isClearable()||!e||r||!this.hasValue()||i)return null;var a={onMouseDown:this.onClearIndicatorMouseDown,onTouchEnd:this.onClearIndicatorTouchEnd,"aria-hidden":"true"};return o.a.createElement(e,Et({},t,{innerProps:a,isFocused:u}))},i.renderLoadingIndicator=function(){var e=this.components.LoadingIndicator,t=this.commonProps,n=this.props,r=n.isDisabled,i=n.isLoading,u=this.state.isFocused;if(!e||!i)return null;return o.a.createElement(e,Et({},t,{innerProps:{"aria-hidden":"true"},isDisabled:r,isFocused:u}))},i.renderIndicatorSeparator=function(){var e=this.components,t=e.DropdownIndicator,n=e.IndicatorSeparator;if(!t||!n)return null;var r=this.commonProps,i=this.props.isDisabled,u=this.state.isFocused;return o.a.createElement(n,Et({},r,{isDisabled:i,isFocused:u}))},i.renderDropdownIndicator=function(){var e=this.components.DropdownIndicator;if(!e)return null;var t=this.commonProps,n=this.props.isDisabled,r=this.state.isFocused,i={onMouseDown:this.onDropdownIndicatorMouseDown,onTouchEnd:this.onDropdownIndicatorTouchEnd,"aria-hidden":"true"};return o.a.createElement(e,Et({},t,{innerProps:i,isDisabled:n,isFocused:r}))},i.renderMenu=function(){var e=this,t=this.components,n=t.Group,r=t.GroupHeading,i=t.Menu,u=t.MenuList,a=t.MenuPortal,s=t.LoadingMessage,l=t.NoOptionsMessage,c=t.Option,p=this.commonProps,f=this.state,d=f.focusedOption,h=f.menuOptions,m=this.props,v=m.captureMenuScroll,g=m.inputValue,b=m.isLoading,E=m.loadingMessage,y=m.minMenuHeight,C=m.maxMenuHeight,O=m.menuIsOpen,A=m.menuPlacement,w=m.menuPosition,F=m.menuPortalTarget,x=m.menuShouldBlockScroll,S=m.menuShouldScrollIntoView,D=m.noOptionsMessage,k=m.onMenuScrollToTop,I=m.onMenuScrollToBottom;if(!O)return null;var M,P=function(t){var n=d===t.data;return t.innerRef=n?e.getFocusedOptionRef:void 0,o.a.createElement(c,Et({},p,t,{isFocused:n}),e.formatOptionLabel(t.data,"menu"))};if(this.hasOptions())M=h.render.map((function(t){if("group"===t.type){t.type;var i=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(t,["type"]),u=t.key+"-heading";return o.a.createElement(n,Et({},p,i,{Heading:r,headingProps:{id:u},label:e.formatGroupLabel(t.data)}),t.options.map((function(e){return P(e)})))}if("option"===t.type)return P(t)}));else if(b){var L=E({inputValue:g});if(null===L)return null;M=o.a.createElement(s,p,L)}else{var V=D({inputValue:g});if(null===V)return null;M=o.a.createElement(l,p,V)}var T={minMenuHeight:y,maxMenuHeight:C,menuPlacement:A,menuPosition:w,menuShouldScrollIntoView:S},R=o.a.createElement(ue,Et({},p,T),(function(t){var n=t.ref,r=t.placerProps,a=r.placement,s=r.maxHeight;return o.a.createElement(i,Et({},p,T,{innerRef:n,innerProps:{onMouseDown:e.onMenuMouseDown,onMouseMove:e.onMenuMouseMove},isLoading:b,placement:a}),o.a.createElement(dt,{isEnabled:v,onTopArrive:k,onBottomArrive:I},o.a.createElement(pt,{isEnabled:x},o.a.createElement(u,Et({},p,{innerRef:e.getMenuListRef,isLoading:b,maxHeight:s}),M))))}));return F||"fixed"===w?o.a.createElement(a,Et({},p,{appendTo:F,controlElement:this.controlRef,menuPlacement:A,menuPosition:w}),R):R},i.renderFormField=function(){var e=this,t=this.props,n=t.delimiter,r=t.isDisabled,i=t.isMulti,u=t.name,a=this.state.selectValue;if(u&&!r){if(i){if(n){var s=a.map((function(t){return e.getOptionValue(t)})).join(n);return o.a.createElement("input",{name:u,type:"hidden",value:s})}var l=a.length>0?a.map((function(t,n){return o.a.createElement("input",{key:"i-"+n,name:u,type:"hidden",value:e.getOptionValue(t)})})):o.a.createElement("input",{name:u,type:"hidden"});return o.a.createElement("div",null,l)}var c=a[0]?this.getOptionValue(a[0]):"";return o.a.createElement("input",{name:u,type:"hidden",value:c})}},i.renderLiveRegion=function(){return this.state.isFocused?o.a.createElement(qe,{"aria-live":"polite"},o.a.createElement("p",{id:"aria-selection-event"},"\xa0",this.state.ariaLiveSelection),o.a.createElement("p",{id:"aria-context"},"\xa0",this.constructAriaLiveMessage())):null},i.render=function(){var e=this.components,t=e.Control,n=e.IndicatorsContainer,r=e.SelectContainer,i=e.ValueContainer,u=this.props,a=u.className,s=u.id,l=u.isDisabled,c=u.menuIsOpen,p=this.state.isFocused,f=this.commonProps=this.getCommonProps();return o.a.createElement(r,Et({},f,{className:a,innerProps:{id:s,onKeyDown:this.onKeyDown},isDisabled:l,isFocused:p}),this.renderLiveRegion(),o.a.createElement(t,Et({},f,{innerRef:this.getControlRef,innerProps:{onMouseDown:this.onControlMouseDown,onTouchEnd:this.onControlTouchEnd},isDisabled:l,isFocused:p,menuIsOpen:c}),o.a.createElement(i,Et({},f,{isDisabled:l}),this.renderPlaceholderOrValue(),this.renderInput()),o.a.createElement(n,Et({},f,{isDisabled:l}),this.renderClearIndicator(),this.renderLoadingIndicator(),this.renderIndicatorSeparator(),this.renderDropdownIndicator())),this.renderMenu(),this.renderFormField())},r}(r.Component);function Ft(){return(Ft=Object.assign||function(e){for(var t=1;t1?n-1:0),o=1;o=0||(o[n]=e[n]);return o}(t,["defaultInputValue","defaultMenuIsOpen","defaultValue"]));return o.a.createElement(St,Ft({},n,{ref:function(t){e.select=t},inputValue:this.getProp("inputValue"),menuIsOpen:this.getProp("menuIsOpen"),onChange:this.onChange,onInputChange:this.onInputChange,onMenuClose:this.onMenuClose,onMenuOpen:this.onMenuOpen,value:this.getProp("value")}))},r}(r.Component),Dt.defaultProps=xt,kt);t.a=It},494:function(e,t,n){"use strict";var r=n(0),o=Object(r.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=o},505:function(e,t,n){var r=n(30),o=n(54),i=n(27),u=n(26),a=n(506);e.exports=function(e,t){var n=1==e,s=2==e,l=3==e,c=4==e,p=6==e,f=5==e||p,d=t||a;return function(t,a,h){for(var m,v,g=i(t),b=o(g),E=r(a,h,3),y=u(b.length),C=0,O=n?d(t,y):s?d(t,0):void 0;y>C;C++)if((f||C in b)&&(v=E(m=b[C],C,g),e))if(n)O[C]=v;else if(v)switch(e){case 3:return!0;case 5:return m;case 6:return C;case 2:O.push(m)}else if(c)return!1;return p?-1:l||c?c:O}}},506:function(e,t,n){var r=n(507);e.exports=function(e,t){return new(r(e))(t)}},507:function(e,t,n){var r=n(13),o=n(508),i=n(2)("species");e.exports=function(e){var t;return o(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!o(t.prototype)||(t=void 0),r(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},508:function(e,t,n){var r=n(23);e.exports=Array.isArray||function(e){return"Array"==r(e)}},526:function(e,t){e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},606:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(this.props,[]);return function(e){c.forEach((function(t){return delete e[t]}))}(o),o.className=this.props.inputClassName,o.id=this.state.inputId,o.style=n,u.default.createElement("div",{className:this.props.className,style:t},this.renderStyles(),u.default.createElement("input",r({},o,{ref:this.inputRef})),u.default.createElement("div",{ref:this.sizerRef,style:l},e),this.props.placeholder?u.default.createElement("div",{ref:this.placeHolderSizerRef,style:l},this.props.placeholder):null)}}]),t}(i.Component);h.propTypes={className:a.default.string,defaultValue:a.default.any,extraWidth:a.default.oneOfType([a.default.number,a.default.string]),id:a.default.string,injectStyles:a.default.bool,inputClassName:a.default.string,inputRef:a.default.func,inputStyle:a.default.object,minWidth:a.default.oneOfType([a.default.number,a.default.string]),onAutosize:a.default.func,onChange:a.default.func,placeholder:a.default.string,placeholderIsMinWidth:a.default.bool,style:a.default.object,value:a.default.any},h.defaultProps={minWidth:1,injectStyles:!0},t.default=h}}]); \ No newline at end of file diff --git a/1.d9e14521.js.LICENSE.txt b/1.033cef57.js.LICENSE.txt similarity index 100% rename from 1.d9e14521.js.LICENSE.txt rename to 1.033cef57.js.LICENSE.txt diff --git a/17896441.b5e0c773.js b/17896441.c0aeb614.js similarity index 99% rename from 17896441.b5e0c773.js rename to 17896441.c0aeb614.js index cb5a089af3..7b38dacb22 100644 --- a/17896441.b5e0c773.js +++ b/17896441.c0aeb614.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{178:function(e,t,a){"use strict";a.r(t);a(488),a(489),a(29),a(22),a(21),a(77);var n=a(0),l=a.n(n),s=a(486),r=a(470),c=a(567),i=a(491),o=a.n(i),m=a(463),d=a.n(m),p=a(179),u=a.n(p),E=a(480),g=a(476),v=a(568);function h(e){var t=e.headings,a=e.isChild;if(Object(v.a)("contents__link","contents__link--active",100),!t.length)return null;var n=o.a.uniqBy(t,(function(e){return e.value}));return l.a.createElement("ul",{className:a?"":"contents"},n.map((function(e){var t=e.value.replace("<","<").replace(">",">");return l.a.createElement("li",{key:e.id},l.a.createElement("a",{href:"#"+e.id,className:"contents__link",dangerouslySetInnerHTML:{__html:t}}),l.a.createElement(h,{isChild:!0,headings:e.children}))})))}function _(e){var t=e.values,a=Object(g.a)().siteConfig,n=(void 0===a?{}:a).customFields.metadata.event_types,s=[];return n.forEach((function(e){t.includes(e)?s.push(l.a.createElement("span",{key:e,className:"text--primary"},o.a.capitalize(e))):s.push(l.a.createElement("del",{key:e,className:"text--warning"},o.a.capitalize(e))),s.push(l.a.createElement("span",{key:e+"-comma"},", "))})),s.pop(),s}function f(e){var t=e.operatingSystems,a=e.unsupportedOperatingSystems,n=[];return(t||[]).forEach((function(e){n.push(l.a.createElement("span",{key:e,className:"text--primary"},e)),n.push(l.a.createElement("span",{key:e+"-comma"},", "))})),(a||[]).forEach((function(e){n.push(l.a.createElement("del",{key:e,className:"text--warning"},e)),n.push(l.a.createElement("span",{key:e+"-comma"},", "))})),n.pop(),n}function N(e){var t=e.deliveryGuarantee,a=e.eventTypes,n=e.operatingSystems,s=e.status,c=e.unsupportedOperatingSystems;return s||t||n||c?l.a.createElement("div",{className:"section"},l.a.createElement("div",{className:"title"},"Support"),"beta"==s&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#beta",className:"text--warning",title:"This component is in beta and is not recommended for production environments. Click to learn more."},l.a.createElement("i",{className:"feather icon-alert-triangle"})," Beta Status")),"prod-ready"==s&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#prod-ready",className:"text--primary",title:"This component has passed reliability standards that make it production ready. Click to learn more."},l.a.createElement("i",{className:"feather icon-award"})," Prod-Ready Status")),"best_effort"==t&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#best-effort",className:"text--warning",title:"This component makes a best-effort delivery guarantee, and in rare cases can lose data. Click to learn more."},l.a.createElement("i",{className:"feather icon-shield-off"})," Best-Effort Delivery")),"at_least_once"==t&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#at-least-once",className:"text--primary",title:"This component offers an at-least-once delivery guarantee. Click to learn more."},l.a.createElement("i",{className:"feather icon-shield"})," At-Least-Once")),a&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/data-model/",title:"This component works on the these event types."},l.a.createElement("i",{className:"feather icon-database"})," ",l.a.createElement(_,{values:a}))),n&&c&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/setup/installation/operating-systems/",title:"This component works on the "+n.join(", ")+" operating systems."},l.a.createElement("i",{className:"feather icon-cpu"})," ",l.a.createElement(f,{operatingSystems:n,unsupportedOperatingSystems:c})))):null}t.default=function(e){var t=Object(g.a)().siteConfig,a=void 0===t?{}:t,n=a.title,i=a.url,o=e.content,m=o.metadata,p=m.description,v=m.editUrl,_=m.image,f=m.keywords,y=m.lastUpdatedAt,k=m.lastUpdatedBy,b=m.permalink,w=m.title,x=m.version,S=o.frontMatter,C=(S.component_title,S.delivery_guarantee),T=S.event_types,O=S.function_category,j=(S.hide_title,S.hide_table_of_contents,S.issues_url),B=S.operating_systems,D=S.posts_path,I=S.source_url,L=S.status,V=S.unsupported_operating_systems,A=i+Object(E.a)(_);return l.a.createElement("div",null,l.a.createElement(s.a,null,w&&l.a.createElement("title",null,w," | Docs | ",n),p&&l.a.createElement("meta",{name:"description",content:p}),p&&l.a.createElement("meta",{property:"og:description",content:p}),f&&f.length&&l.a.createElement("meta",{name:"keywords",content:f.join(",")}),_&&l.a.createElement("meta",{property:"og:image",content:A}),_&&l.a.createElement("meta",{property:"twitter:image",content:A}),_&&l.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+w}),b&&l.a.createElement("meta",{property:"og:url",content:i+b})),l.a.createElement("div",{className:u.a.container},l.a.createElement("div",{className:u.a.leftCol},l.a.createElement("div",{className:"docItemContainer_"},l.a.createElement("article",null,x&&l.a.createElement("span",{style:{verticalAlign:"top"},className:"badge badge--info"},"Version: ",x),!m.hide_title&&l.a.createElement("header",null,l.a.createElement("div",{className:"badges"},O&&l.a.createElement(r.a,{to:"/components?functions[]="+O,className:"badge badge--primary"},O)),l.a.createElement("h1",{className:u.a.docTitle},m.title)),l.a.createElement("div",{className:"markdown"},l.a.createElement(o,null)))),!m.hide_pagination&&(m.next||m.previous)&&l.a.createElement("div",{className:u.a.paginator},l.a.createElement(c.a,{next:m.next,previous:m.previous}))),o.rightToc&&l.a.createElement("div",{className:u.a.rightCol},l.a.createElement("div",{className:d()("table-of-contents",u.a.tableOfContents)},l.a.createElement(N,{deliveryGuarantee:C,eventTypes:T,operatingSystems:B,status:L,unsupportedOperatingSystems:V}),o.rightToc.length>0&&l.a.createElement("div",{className:"section"},l.a.createElement("div",{className:"title"},"Contents"),l.a.createElement(h,{headings:o.rightToc})),l.a.createElement("div",{className:"section"},l.a.createElement("div",{className:"title"},"Resources"),l.a.createElement("ul",{className:"contents"},v&&l.a.createElement("li",null,l.a.createElement("a",{href:v,className:"contents__link",target:"_blank"},l.a.createElement("i",{className:"feather icon-edit-1"})," Edit this page")),D&&l.a.createElement("li",null,l.a.createElement(r.a,{to:D,className:"contents__link"},l.a.createElement("i",{className:"feather icon-book-open"})," View Blog Posts")),j&&l.a.createElement("li",null,l.a.createElement("a",{href:j,className:"contents__link",target:"_blank"},l.a.createElement("i",{className:"feather icon-message-circle"})," View Issues")),I&&l.a.createElement("li",null,l.a.createElement("a",{href:I,className:"contents__link",target:"_blank"},l.a.createElement("i",{className:"feather icon-github"})," View Source")))),(y||k)&&l.a.createElement("div",{className:"section"},"Last updated"," ",y&&l.a.createElement(l.a.Fragment,null,"on"," ",l.a.createElement("strong",null,new Date(1e3*y).toLocaleDateString()),k&&" "),k&&l.a.createElement(l.a.Fragment,null,"by ",l.a.createElement("strong",null,k)))))))}},567:function(e,t,a){"use strict";var n=a(0),l=a.n(n),s=a(470),r=a(463),c=a.n(r);a(147);t.a=function(e){var t=e.className,a=e.previous,n=e.next;return l.a.createElement("nav",{className:c()("pagination-nav",t)},l.a.createElement("div",{className:"pagination-nav__item"},a&&l.a.createElement(s.a,{className:"pagination-nav__link",to:a.permalink},l.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Previous"),l.a.createElement("h4",{className:"pagination-nav__link--label"},"\xab ",a.title))),l.a.createElement("div",{className:"pagination-nav__item pagination-nav__item--next"},n&&l.a.createElement(s.a,{className:"pagination-nav__link",to:n.permalink},l.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Next"),l.a.createElement("h4",{className:"pagination-nav__link--label"},n.title," \xbb"))))}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{178:function(e,t,a){"use strict";a.r(t);a(488),a(489),a(29),a(22),a(21),a(77);var n=a(0),l=a.n(n),s=a(486),r=a(470),c=a(567),i=a(491),o=a.n(i),m=a(463),d=a.n(m),p=a(179),u=a.n(p),E=a(481),g=a(476),v=a(568);function h(e){var t=e.headings,a=e.isChild;if(Object(v.a)("contents__link","contents__link--active",100),!t.length)return null;var n=o.a.uniqBy(t,(function(e){return e.value}));return l.a.createElement("ul",{className:a?"":"contents"},n.map((function(e){var t=e.value.replace("<","<").replace(">",">");return l.a.createElement("li",{key:e.id},l.a.createElement("a",{href:"#"+e.id,className:"contents__link",dangerouslySetInnerHTML:{__html:t}}),l.a.createElement(h,{isChild:!0,headings:e.children}))})))}function _(e){var t=e.values,a=Object(g.a)().siteConfig,n=(void 0===a?{}:a).customFields.metadata.event_types,s=[];return n.forEach((function(e){t.includes(e)?s.push(l.a.createElement("span",{key:e,className:"text--primary"},o.a.capitalize(e))):s.push(l.a.createElement("del",{key:e,className:"text--warning"},o.a.capitalize(e))),s.push(l.a.createElement("span",{key:e+"-comma"},", "))})),s.pop(),s}function f(e){var t=e.operatingSystems,a=e.unsupportedOperatingSystems,n=[];return(t||[]).forEach((function(e){n.push(l.a.createElement("span",{key:e,className:"text--primary"},e)),n.push(l.a.createElement("span",{key:e+"-comma"},", "))})),(a||[]).forEach((function(e){n.push(l.a.createElement("del",{key:e,className:"text--warning"},e)),n.push(l.a.createElement("span",{key:e+"-comma"},", "))})),n.pop(),n}function N(e){var t=e.deliveryGuarantee,a=e.eventTypes,n=e.operatingSystems,s=e.status,c=e.unsupportedOperatingSystems;return s||t||n||c?l.a.createElement("div",{className:"section"},l.a.createElement("div",{className:"title"},"Support"),"beta"==s&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#beta",className:"text--warning",title:"This component is in beta and is not recommended for production environments. Click to learn more."},l.a.createElement("i",{className:"feather icon-alert-triangle"})," Beta Status")),"prod-ready"==s&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#prod-ready",className:"text--primary",title:"This component has passed reliability standards that make it production ready. Click to learn more."},l.a.createElement("i",{className:"feather icon-award"})," Prod-Ready Status")),"best_effort"==t&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#best-effort",className:"text--warning",title:"This component makes a best-effort delivery guarantee, and in rare cases can lose data. Click to learn more."},l.a.createElement("i",{className:"feather icon-shield-off"})," Best-Effort Delivery")),"at_least_once"==t&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#at-least-once",className:"text--primary",title:"This component offers an at-least-once delivery guarantee. Click to learn more."},l.a.createElement("i",{className:"feather icon-shield"})," At-Least-Once")),a&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/data-model/",title:"This component works on the these event types."},l.a.createElement("i",{className:"feather icon-database"})," ",l.a.createElement(_,{values:a}))),n&&c&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/setup/installation/operating-systems/",title:"This component works on the "+n.join(", ")+" operating systems."},l.a.createElement("i",{className:"feather icon-cpu"})," ",l.a.createElement(f,{operatingSystems:n,unsupportedOperatingSystems:c})))):null}t.default=function(e){var t=Object(g.a)().siteConfig,a=void 0===t?{}:t,n=a.title,i=a.url,o=e.content,m=o.metadata,p=m.description,v=m.editUrl,_=m.image,f=m.keywords,y=m.lastUpdatedAt,k=m.lastUpdatedBy,b=m.permalink,w=m.title,x=m.version,S=o.frontMatter,C=(S.component_title,S.delivery_guarantee),T=S.event_types,O=S.function_category,j=(S.hide_title,S.hide_table_of_contents,S.issues_url),B=S.operating_systems,D=S.posts_path,I=S.source_url,L=S.status,V=S.unsupported_operating_systems,A=i+Object(E.a)(_);return l.a.createElement("div",null,l.a.createElement(s.a,null,w&&l.a.createElement("title",null,w," | Docs | ",n),p&&l.a.createElement("meta",{name:"description",content:p}),p&&l.a.createElement("meta",{property:"og:description",content:p}),f&&f.length&&l.a.createElement("meta",{name:"keywords",content:f.join(",")}),_&&l.a.createElement("meta",{property:"og:image",content:A}),_&&l.a.createElement("meta",{property:"twitter:image",content:A}),_&&l.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+w}),b&&l.a.createElement("meta",{property:"og:url",content:i+b})),l.a.createElement("div",{className:u.a.container},l.a.createElement("div",{className:u.a.leftCol},l.a.createElement("div",{className:"docItemContainer_"},l.a.createElement("article",null,x&&l.a.createElement("span",{style:{verticalAlign:"top"},className:"badge badge--info"},"Version: ",x),!m.hide_title&&l.a.createElement("header",null,l.a.createElement("div",{className:"badges"},O&&l.a.createElement(r.a,{to:"/components?functions[]="+O,className:"badge badge--primary"},O)),l.a.createElement("h1",{className:u.a.docTitle},m.title)),l.a.createElement("div",{className:"markdown"},l.a.createElement(o,null)))),!m.hide_pagination&&(m.next||m.previous)&&l.a.createElement("div",{className:u.a.paginator},l.a.createElement(c.a,{next:m.next,previous:m.previous}))),o.rightToc&&l.a.createElement("div",{className:u.a.rightCol},l.a.createElement("div",{className:d()("table-of-contents",u.a.tableOfContents)},l.a.createElement(N,{deliveryGuarantee:C,eventTypes:T,operatingSystems:B,status:L,unsupportedOperatingSystems:V}),o.rightToc.length>0&&l.a.createElement("div",{className:"section"},l.a.createElement("div",{className:"title"},"Contents"),l.a.createElement(h,{headings:o.rightToc})),l.a.createElement("div",{className:"section"},l.a.createElement("div",{className:"title"},"Resources"),l.a.createElement("ul",{className:"contents"},v&&l.a.createElement("li",null,l.a.createElement("a",{href:v,className:"contents__link",target:"_blank"},l.a.createElement("i",{className:"feather icon-edit-1"})," Edit this page")),D&&l.a.createElement("li",null,l.a.createElement(r.a,{to:D,className:"contents__link"},l.a.createElement("i",{className:"feather icon-book-open"})," View Blog Posts")),j&&l.a.createElement("li",null,l.a.createElement("a",{href:j,className:"contents__link",target:"_blank"},l.a.createElement("i",{className:"feather icon-message-circle"})," View Issues")),I&&l.a.createElement("li",null,l.a.createElement("a",{href:I,className:"contents__link",target:"_blank"},l.a.createElement("i",{className:"feather icon-github"})," View Source")))),(y||k)&&l.a.createElement("div",{className:"section"},"Last updated"," ",y&&l.a.createElement(l.a.Fragment,null,"on"," ",l.a.createElement("strong",null,new Date(1e3*y).toLocaleDateString()),k&&" "),k&&l.a.createElement(l.a.Fragment,null,"by ",l.a.createElement("strong",null,k)))))))}},567:function(e,t,a){"use strict";var n=a(0),l=a.n(n),s=a(470),r=a(463),c=a.n(r);a(147);t.a=function(e){var t=e.className,a=e.previous,n=e.next;return l.a.createElement("nav",{className:c()("pagination-nav",t)},l.a.createElement("div",{className:"pagination-nav__item"},a&&l.a.createElement(s.a,{className:"pagination-nav__link",to:a.permalink},l.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Previous"),l.a.createElement("h4",{className:"pagination-nav__link--label"},"\xab ",a.title))),l.a.createElement("div",{className:"pagination-nav__item pagination-nav__item--next"},n&&l.a.createElement(s.a,{className:"pagination-nav__link",to:n.permalink},l.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Next"),l.a.createElement("h4",{className:"pagination-nav__link--label"},n.title," \xbb"))))}}}]); \ No newline at end of file diff --git a/1a3e0044.8bba6a63.js b/1a3e0044.79a0e5a6.js similarity index 99% rename from 1a3e0044.8bba6a63.js rename to 1a3e0044.79a0e5a6.js index 2c216a9d75..6c004a51b2 100644 --- a/1a3e0044.8bba6a63.js +++ b/1a3e0044.79a0e5a6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{183:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return m}));var a=n(1),r=n(9),i=(n(0),n(465)),o=n(464),l=(n(477),n(469)),c={last_modified_on:"2023-05-29",$schema:"/.meta/.schemas/guides.json",title:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},b={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",permalink:"/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners",readingTime:"6 min read",source:"@site/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Getting Started with Preview Environments on AWS",truncated:!1,prevItem:{title:"Enable multi-region backup on your RDS instances with AWS Backup",permalink:"/guides/advanced/adding-multi-region-backup-rds"},nextItem:{title:"GitOps with Qovery",permalink:"/guides/tutorial/gitops-with-qovery"}},s=[{value:"Steps",id:"steps",children:[]},{value:"Create your Blueprint Environment",id:"create-your-blueprint-environment",children:[{value:"Enable Preview Environment",id:"enable-preview-environment",children:[]},{value:"Change your base branch",id:"change-your-base-branch",children:[]}]},{value:"Validate your Blueprint Environment",id:"validate-your-blueprint-environment",children:[]},{value:"Create a Preview Environment",id:"create-a-preview-environment",children:[]},{value:"Delete a Preview Environment",id:"delete-a-preview-environment",children:[]},{value:"Advanced",id:"advanced",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:s};function m(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(i.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(i.b)("p",null,"It is critical to have testing and staging environments accurately reflect production, but achieving this can be a major operational hassle. Most engineering teams use a single staging environment which makes it hard for developers to test their changes in isolation; the alternative is for DevOps teams to spin up new testing or staging environments manually and tear them down after testing is done."),Object(i.b)("p",null,"Qovery\u2019s Preview Environments solve this problem by automatically creating a clone of your production environment (including applications, databases and configuration) on every pull request, so you can test your changes with confidence without affecting your production."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_flow_schema.jpg",alt:"Flow on how Qovery Preview Environment works"})),Object(i.b)("p",null,"Qovery keeps your preview environments up to date on every commit and automatically destroys them when the original pull request is merged or closed. You can also set up an expiry time to automatically clean up preview environments after a period of inactivity."),Object(i.b)("p",null,"Preview Environments can be helpful in a lot of cases:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Share your changes live in code reviews: no more Git diffs for visual changes!"),Object(i.b)("li",{parentName:"ul"},"Get shareable links for upcoming features and collaborate more effectively with internal and external stakeholders."),Object(i.b)("li",{parentName:"ul"},"Run CI tests against a high fidelity copy of your production environment before merging.")),Object(i.b)("p",null,"In this step-by-step guide you will learn how to get started using the Preview Environments on AWS with Qovery."),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"This guide also works with other cloud service providers supported by Qovery.")),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"Please contact us via ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning the Preview Environments")),Object(i.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"installed Qovery on your AWS account")),Object(i.b)("li",{parentName:"ul"},"You have at least already ",Object(i.b)("strong",{parentName:"li"},"deployed successfully")," a first application"))),Object(i.b)("h2",{id:"steps"},"Steps"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-blueprint-environment"}),'Create a "Blueprint" environment')),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#enable-preview-environment"}),"Enable Preview Environment feature")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-preview-environment"}),"Create a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#delete-a-preview-environment"}),"Delete a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#seed-your-database"}),"Seed your database")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#auto-stop-and-start-your-preview-environments"}),"Auto stop and start your Preview Environments")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#integrate-your-ci-platform"}),"Integrate your CI (Continuous Deployment) platform"))),Object(i.b)("h2",{id:"create-your-blueprint-environment"},"Create your Blueprint Environment"),Object(i.b)("p",null,"Even if not required, we recommend creating an ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/"}),"environment"),' that will serve as a root to create your Preview Environments. The idea is to keep this environment as a template of a fully working environment. This environment should not be directly used. This is what we call "blueprint environment".'),Object(i.b)("p",null,"I assume you already have a working environment, so to create a blueprint environment you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Go to your working environment"),Object(i.b)("li",{parentName:"ol"},'Click on "Actions" > "Clone"'),Object(i.b)("li",{parentName:"ol"},'Name your environment "blueprint"'),Object(i.b)("li",{parentName:"ol"},'Click on "Create"')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/a282d6b832794671a3582550aa45f9ae",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"We recommend using a different cluster than your production for your Preview Environments.")),Object(i.b)("h3",{id:"enable-preview-environment"},"Enable Preview Environment"),Object(i.b)("p",null,"Now, you can go to turn on Preview Environments by:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Click on your ",Object(i.b)("inlineCode",{parentName:"li"},"Blueprint"),' environment "Settings".'),Object(i.b)("li",{parentName:"ol"},"Click on the ",Object(i.b)("inlineCode",{parentName:"li"},"Preview Env.")," tab"),Object(i.b)("li",{parentName:"ol"},"Turn on Preview Environment feature for all your applications by clicking on ",Object(i.b)("inlineCode",{parentName:"li"},"Activate preview environment for all apps"),".")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/55b9d99a59524e1cb7875f7db7691fbe",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h3",{id:"change-your-base-branch"},"Change your base branch"),Object(i.b)("p",null,"Now that you have turned on the Preview Environment feature, you need to change the base branch from your applications inside your Blueprint Environment. Let's say, every new feature branch you create are coming from ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". Then you will need to change all your applications to target the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," branch."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/67df458d340d484fa1e675cc20e36caf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Here is a flow example showing what happen when you create a new Pull Request from a ",Object(i.b)("inlineCode",{parentName:"p"},"feat/xxx")," branch that has been created from the base branch ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),"."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_branching.jpg",alt:"Flow on how Qovery Preview Environment Branching works"})),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"A developer creates a git branch ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is created from ",Object(i.b)("inlineCode",{parentName:"li"},"staging"),"."),Object(i.b)("li",{parentName:"ol"},"A developer creates a Pull Request for ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx"),"."),Object(i.b)("li",{parentName:"ol"},"Qovery creates a Preview Environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," from the ",Object(i.b)("inlineCode",{parentName:"li"},"blueprint")," environment. ",Object(i.b)("strong",{parentName:"li"},"The frontend, backend, PostgreSQL and Redis instances are cloned!")),Object(i.b)("li",{parentName:"ol"},"The frontend app from the environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is accessible via a dedicated URL.")),Object(i.b)("h2",{id:"validate-your-blueprint-environment"},"Validate your Blueprint Environment"),Object(i.b)("p",null,"Before creating a Preview Environment, validate that your Blueprint environment works."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/3dd4d9aee9ac44a9af0cb8eddee7735c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Once done, you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},'Stop your Blueprint environment by clicking on "Actions" > "Stop".'),Object(i.b)("li",{parentName:"ol"},'Turn off "auto-deploy" by clicking on "Settings" > "Deployment" > "Auto-deploy off" > "Save".')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/36b0bb48346f40f6ac8569a7b8dbc5b3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"We are now ready to try out our Preview Environment configuration."),Object(i.b)("h2",{id:"create-a-preview-environment"},"Create a Preview Environment"),Object(i.b)("p",null,"To create a Preview Environment, here are the steps:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Checkout your ",Object(i.b)("inlineCode",{parentName:"li"},"staging")," branch."),Object(i.b)("li",{parentName:"ol"},"Create a branch ",Object(i.b)("inlineCode",{parentName:"li"},"test_qovery_preview_environment")," and push it."),Object(i.b)("li",{parentName:"ol"},"Create a Pull Request/Merge Request.")),Object(i.b)(o.a,{type:"success",mdxType:"Alert"},Object(i.b)("p",null,"Qovery take care of cloning all your services and the configuration as well (Environment Variables and Secrets included).")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/2266d0897c964635b37447ae9ef2acea",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"You must see a new environment appearing in your environment list on Qovery. Wait until it is fully deployed, then you will be able to connect to it. This environment is fully isolated from your base environment."),Object(i.b)("h2",{id:"delete-a-preview-environment"},"Delete a Preview Environment"),Object(i.b)("p",null,"To delete you need to merge ",Object(i.b)("inlineCode",{parentName:"p"},"test_qovery_preview_environment")," into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". You also have the ability to delete it manually on Qovery."),Object(i.b)(o.a,{type:"warning",mdxType:"Alert"},Object(i.b)("p",null,"By merging into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),", Qovery will auto-redeploy the new version in your ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment. Turn off ",Object(i.b)("inlineCode",{parentName:"p"},"auto-deploy")," from the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment settings if you want to manually deploy new version in staging.")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/1feb31f4bbec4d54b0764dfa1271dd0d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h2",{id:"advanced"},"Advanced"),Object(i.b)("p",null,"Eager to know how to go integrate Qovery Preview Environments with your CI and much more? Check out our the following guides:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/qovery/lifecycle-job-examples/tree/main/examples/seed-postgres-database-with-sql-script"}),"Seed your Preview Environment database")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/integration/continuous-integration/"}),"Integrate your CI platform")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/environment/#deployment-rule"}),"Auto-stop and start your Preview Environment")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/customizing-preview-url-with-qovery-cli/"}),"Set up a custom domain for your Preview Environment"))),Object(i.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(i.b)("p",null,"Congrats! You have set up your Preview Environments features. Feel free to check out our ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question. In the next guide, we will go deeper configuration to integrate the Preview Environment with your existing products and workflow."))}m.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),i=n(463),o=n.n(i);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,i=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:o()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==i}),role:"alert"},!1!==i&&r.a.createElement("i",{className:o()("feather","icon-"+(i||c))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,i=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),i=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(i.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),r=(n(481),n(478),n(52),n(29),n(22),n(21),n(0)),i=n.n(r),o=n(483),l=n(463),c=n.n(l),b=n(471),s=n.n(b),u=n(482),m=37,p=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,o=e.handleKeydown,l=e.style,b=e.values,s=e.selectedValue,u=e.tabRefs;return i.a.createElement("div",{className:n?"tabs--centered":null},i.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:l},b.map((function(e){var t=e.value,n=e.label;return i.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return o(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function v(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,c=l;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return i.a.createElement(o.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,o=e.groupId,l=e.label,c=e.placeholder,b=e.select,h=e.size,f=(e.style,e.values),g=e.urlKey,w=Object(u.a)(),y=w.tabGroupChoices,j=w.setTabGroupChoices,O=Object(r.useState)(n),N=O[0],E=O[1];if(null!=o){var k=y[o];null!=k&&k!==N&&E(k)}var C=function(e){E(e),null!=o&&j(o,e)},P=[],x=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=s.a.parse(window.location.search);e[g]&&E(e[g])}}),[]),i.a.createElement(i.a.Fragment,null,i.a.createElement("div",{className:"margin-bottom--"+(h||"md")},l&&i.a.createElement("div",{className:"margin-vert--sm"},l),f.length>1&&(b?i.a.createElement(v,Object(a.a)({changeSelectedValue:C,handleKeydown:x,placeholder:c,selectedValue:N,size:h,tabRefs:P},e)):i.a.createElement(d,Object(a.a)({changeSelectedValue:C,handleKeydown:x,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{183:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return m}));var a=n(1),r=n(9),i=(n(0),n(465)),o=n(464),l=(n(477),n(469)),c={last_modified_on:"2023-05-29",$schema:"/.meta/.schemas/guides.json",title:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},b={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",permalink:"/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners",readingTime:"6 min read",source:"@site/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Getting Started with Preview Environments on AWS",truncated:!1,prevItem:{title:"Enable multi-region backup on your RDS instances with AWS Backup",permalink:"/guides/advanced/adding-multi-region-backup-rds"},nextItem:{title:"GitOps with Qovery",permalink:"/guides/tutorial/gitops-with-qovery"}},s=[{value:"Steps",id:"steps",children:[]},{value:"Create your Blueprint Environment",id:"create-your-blueprint-environment",children:[{value:"Enable Preview Environment",id:"enable-preview-environment",children:[]},{value:"Change your base branch",id:"change-your-base-branch",children:[]}]},{value:"Validate your Blueprint Environment",id:"validate-your-blueprint-environment",children:[]},{value:"Create a Preview Environment",id:"create-a-preview-environment",children:[]},{value:"Delete a Preview Environment",id:"delete-a-preview-environment",children:[]},{value:"Advanced",id:"advanced",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:s};function m(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(i.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(i.b)("p",null,"It is critical to have testing and staging environments accurately reflect production, but achieving this can be a major operational hassle. Most engineering teams use a single staging environment which makes it hard for developers to test their changes in isolation; the alternative is for DevOps teams to spin up new testing or staging environments manually and tear them down after testing is done."),Object(i.b)("p",null,"Qovery\u2019s Preview Environments solve this problem by automatically creating a clone of your production environment (including applications, databases and configuration) on every pull request, so you can test your changes with confidence without affecting your production."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_flow_schema.jpg",alt:"Flow on how Qovery Preview Environment works"})),Object(i.b)("p",null,"Qovery keeps your preview environments up to date on every commit and automatically destroys them when the original pull request is merged or closed. You can also set up an expiry time to automatically clean up preview environments after a period of inactivity."),Object(i.b)("p",null,"Preview Environments can be helpful in a lot of cases:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Share your changes live in code reviews: no more Git diffs for visual changes!"),Object(i.b)("li",{parentName:"ul"},"Get shareable links for upcoming features and collaborate more effectively with internal and external stakeholders."),Object(i.b)("li",{parentName:"ul"},"Run CI tests against a high fidelity copy of your production environment before merging.")),Object(i.b)("p",null,"In this step-by-step guide you will learn how to get started using the Preview Environments on AWS with Qovery."),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"This guide also works with other cloud service providers supported by Qovery.")),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"Please contact us via ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning the Preview Environments")),Object(i.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"installed Qovery on your AWS account")),Object(i.b)("li",{parentName:"ul"},"You have at least already ",Object(i.b)("strong",{parentName:"li"},"deployed successfully")," a first application"))),Object(i.b)("h2",{id:"steps"},"Steps"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-blueprint-environment"}),'Create a "Blueprint" environment')),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#enable-preview-environment"}),"Enable Preview Environment feature")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-preview-environment"}),"Create a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#delete-a-preview-environment"}),"Delete a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#seed-your-database"}),"Seed your database")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#auto-stop-and-start-your-preview-environments"}),"Auto stop and start your Preview Environments")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#integrate-your-ci-platform"}),"Integrate your CI (Continuous Deployment) platform"))),Object(i.b)("h2",{id:"create-your-blueprint-environment"},"Create your Blueprint Environment"),Object(i.b)("p",null,"Even if not required, we recommend creating an ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/"}),"environment"),' that will serve as a root to create your Preview Environments. The idea is to keep this environment as a template of a fully working environment. This environment should not be directly used. This is what we call "blueprint environment".'),Object(i.b)("p",null,"I assume you already have a working environment, so to create a blueprint environment you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Go to your working environment"),Object(i.b)("li",{parentName:"ol"},'Click on "Actions" > "Clone"'),Object(i.b)("li",{parentName:"ol"},'Name your environment "blueprint"'),Object(i.b)("li",{parentName:"ol"},'Click on "Create"')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/a282d6b832794671a3582550aa45f9ae",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"We recommend using a different cluster than your production for your Preview Environments.")),Object(i.b)("h3",{id:"enable-preview-environment"},"Enable Preview Environment"),Object(i.b)("p",null,"Now, you can go to turn on Preview Environments by:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Click on your ",Object(i.b)("inlineCode",{parentName:"li"},"Blueprint"),' environment "Settings".'),Object(i.b)("li",{parentName:"ol"},"Click on the ",Object(i.b)("inlineCode",{parentName:"li"},"Preview Env.")," tab"),Object(i.b)("li",{parentName:"ol"},"Turn on Preview Environment feature for all your applications by clicking on ",Object(i.b)("inlineCode",{parentName:"li"},"Activate preview environment for all apps"),".")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/55b9d99a59524e1cb7875f7db7691fbe",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h3",{id:"change-your-base-branch"},"Change your base branch"),Object(i.b)("p",null,"Now that you have turned on the Preview Environment feature, you need to change the base branch from your applications inside your Blueprint Environment. Let's say, every new feature branch you create are coming from ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". Then you will need to change all your applications to target the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," branch."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/67df458d340d484fa1e675cc20e36caf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Here is a flow example showing what happen when you create a new Pull Request from a ",Object(i.b)("inlineCode",{parentName:"p"},"feat/xxx")," branch that has been created from the base branch ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),"."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_branching.jpg",alt:"Flow on how Qovery Preview Environment Branching works"})),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"A developer creates a git branch ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is created from ",Object(i.b)("inlineCode",{parentName:"li"},"staging"),"."),Object(i.b)("li",{parentName:"ol"},"A developer creates a Pull Request for ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx"),"."),Object(i.b)("li",{parentName:"ol"},"Qovery creates a Preview Environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," from the ",Object(i.b)("inlineCode",{parentName:"li"},"blueprint")," environment. ",Object(i.b)("strong",{parentName:"li"},"The frontend, backend, PostgreSQL and Redis instances are cloned!")),Object(i.b)("li",{parentName:"ol"},"The frontend app from the environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is accessible via a dedicated URL.")),Object(i.b)("h2",{id:"validate-your-blueprint-environment"},"Validate your Blueprint Environment"),Object(i.b)("p",null,"Before creating a Preview Environment, validate that your Blueprint environment works."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/3dd4d9aee9ac44a9af0cb8eddee7735c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Once done, you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},'Stop your Blueprint environment by clicking on "Actions" > "Stop".'),Object(i.b)("li",{parentName:"ol"},'Turn off "auto-deploy" by clicking on "Settings" > "Deployment" > "Auto-deploy off" > "Save".')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/36b0bb48346f40f6ac8569a7b8dbc5b3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"We are now ready to try out our Preview Environment configuration."),Object(i.b)("h2",{id:"create-a-preview-environment"},"Create a Preview Environment"),Object(i.b)("p",null,"To create a Preview Environment, here are the steps:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Checkout your ",Object(i.b)("inlineCode",{parentName:"li"},"staging")," branch."),Object(i.b)("li",{parentName:"ol"},"Create a branch ",Object(i.b)("inlineCode",{parentName:"li"},"test_qovery_preview_environment")," and push it."),Object(i.b)("li",{parentName:"ol"},"Create a Pull Request/Merge Request.")),Object(i.b)(o.a,{type:"success",mdxType:"Alert"},Object(i.b)("p",null,"Qovery take care of cloning all your services and the configuration as well (Environment Variables and Secrets included).")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/2266d0897c964635b37447ae9ef2acea",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"You must see a new environment appearing in your environment list on Qovery. Wait until it is fully deployed, then you will be able to connect to it. This environment is fully isolated from your base environment."),Object(i.b)("h2",{id:"delete-a-preview-environment"},"Delete a Preview Environment"),Object(i.b)("p",null,"To delete you need to merge ",Object(i.b)("inlineCode",{parentName:"p"},"test_qovery_preview_environment")," into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". You also have the ability to delete it manually on Qovery."),Object(i.b)(o.a,{type:"warning",mdxType:"Alert"},Object(i.b)("p",null,"By merging into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),", Qovery will auto-redeploy the new version in your ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment. Turn off ",Object(i.b)("inlineCode",{parentName:"p"},"auto-deploy")," from the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment settings if you want to manually deploy new version in staging.")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/1feb31f4bbec4d54b0764dfa1271dd0d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h2",{id:"advanced"},"Advanced"),Object(i.b)("p",null,"Eager to know how to go integrate Qovery Preview Environments with your CI and much more? Check out our the following guides:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/qovery/lifecycle-job-examples/tree/main/examples/seed-postgres-database-with-sql-script"}),"Seed your Preview Environment database")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/integration/continuous-integration/"}),"Integrate your CI platform")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/environment/#deployment-rule"}),"Auto-stop and start your Preview Environment")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/customizing-preview-url-with-qovery-cli/"}),"Set up a custom domain for your Preview Environment"))),Object(i.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(i.b)("p",null,"Congrats! You have set up your Preview Environments features. Feel free to check out our ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question. In the next guide, we will go deeper configuration to integrate the Preview Environment with your existing products and workflow."))}m.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),i=n(463),o=n.n(i);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,i=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:o()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==i}),role:"alert"},!1!==i&&r.a.createElement("i",{className:o()("feather","icon-"+(i||c))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,i=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),i=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(i.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),r=(n(480),n(479),n(52),n(29),n(22),n(21),n(0)),i=n.n(r),o=n(483),l=n(463),c=n.n(l),b=n(471),s=n.n(b),u=n(482),m=37,p=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,o=e.handleKeydown,l=e.style,b=e.values,s=e.selectedValue,u=e.tabRefs;return i.a.createElement("div",{className:n?"tabs--centered":null},i.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:l},b.map((function(e){var t=e.value,n=e.label;return i.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return o(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function v(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,c=l;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return i.a.createElement(o.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,o=e.groupId,l=e.label,c=e.placeholder,b=e.select,h=e.size,f=(e.style,e.values),g=e.urlKey,w=Object(u.a)(),y=w.tabGroupChoices,j=w.setTabGroupChoices,O=Object(r.useState)(n),N=O[0],E=O[1];if(null!=o){var k=y[o];null!=k&&k!==N&&E(k)}var C=function(e){E(e),null!=o&&j(o,e)},P=[],x=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=s.a.parse(window.location.search);e[g]&&E(e[g])}}),[]),i.a.createElement(i.a.Fragment,null,i.a.createElement("div",{className:"margin-bottom--"+(h||"md")},l&&i.a.createElement("div",{className:"margin-vert--sm"},l),f.length>1&&(b?i.a.createElement(v,Object(a.a)({changeSelectedValue:C,handleKeydown:x,placeholder:c,selectedValue:N,size:h,tabRefs:P},e)):i.a.createElement(d,Object(a.a)({changeSelectedValue:C,handleKeydown:x,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file diff --git a/1a6d3985.a1edd735.js b/1a6d3985.f9823480.js similarity index 99% rename from 1a6d3985.a1edd735.js rename to 1a6d3985.f9823480.js index 826f870300..e1433bbacc 100644 --- a/1a6d3985.a1edd735.js +++ b/1a6d3985.f9823480.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{184:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return s})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return d}));var a=n(1),o=n(9),r=(n(0),n(465)),i=n(464),l=(n(477),n(469)),c={last_modified_on:"2022-07-25",$schema:"/.meta/.schemas/guides.json",title:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},s={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws",readingTime:"4 min read",source:"@site/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create your Staging environment from your Production environment on AWS",truncated:!1,prevItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"},nextItem:{title:"Creating API clients using OpenAPI Tools",permalink:"/guides/tutorial/generate-qovery-api-client"}},u=[{value:"Create a Staging cluster",id:"create-a-staging-cluster",children:[]},{value:"Create your Staging environment from your Production environment",id:"create-your-staging-environment-from-your-production-environment",children:[]},{value:"Update your Staging applications",id:"update-your-staging-applications",children:[]},{value:"Override your environment variables and secrets",id:"override-your-environment-variables-and-secrets",children:[]},{value:"Deploy your Staging environment",id:"deploy-your-staging-environment",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:u};function d(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Let's say you have your production environment deployed, and you want to create a staging environment. You have two options:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Create a staging environment from scratch."),Object(r.b)("li",{parentName:"ol"},"Clone your production environment and create a staging environment from it.")),Object(r.b)("p",null,"This is where the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature of Qovery is useful. No need to create a new environment, just clone your production environment and create a staging environment from it."),Object(r.b)("p",null,"In this guide, we will go through the steps to create a staging environment from your production environment. While applying the best practices by isolating the staging and production environments on two separated clusters and VPCs."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/staging-from-production/complete_schema.jpg",alt:"Complete Production and Staging infrastructure"})),Object(r.b)(l.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/5a76704a196341deb5384b2883113adf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-a-staging-cluster"},"Create a Staging cluster"),Object(r.b)("p",null,"Isolating the staging and production environments on two separate clusters and VPCs is a good practice to avoid any potential issues on your production caused by your staging. This is not a mandatory step, but it is well recommended."),Object(r.b)("p",null,"To create your staging cluster it's also recommended creating a new AWS IAM access key and secret access key in a dedicated subaccount. Then you are sure that both environment are also isolated at the AWS level:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your Organization cluster settings"),Object(r.b)("li",{parentName:"ol"},'Add a cluster with a name "staging"'),Object(r.b)("li",{parentName:"ol"},"Deploy your staging cluster")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/6f77172ae27f41a5a7c0e3114398b13c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-your-staging-environment-from-your-production-environment"},"Create your Staging environment from your Production environment"),Object(r.b)("p",null,"Now, to create your staging environment from your production environment, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Go inside your production environment and click on the "Clone" button.'),Object(r.b)("li",{parentName:"ol"},'Give a name to your staging environment (E.g "staging")'),Object(r.b)("li",{parentName:"ol"},'Set the mode to "Staging"'),Object(r.b)("li",{parentName:"ol"},'Set the cluster to "staging"'),Object(r.b)("li",{parentName:"ol"},'Click on "Create"'),Object(r.b)("li",{parentName:"ol"},"That's it!")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Cloning your database does not copy the data (yet). To copy your data in Staging consider using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.replibyte.com"}),"Replibyte")," in standalone. It will be integrated in Qovery soon.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/614844644cc34211853de19dafe79343",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Your environment has been created, but it's not deployed yet. Before we will make some adjustment to change the branch of our applications."),Object(r.b)("h2",{id:"update-your-staging-applications"},"Update your Staging applications"),Object(r.b)("p",null,"Your Staging applications have the same branch as your Production applications. To update your Staging applications branch, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go into the settings of each of your applications."),Object(r.b)("li",{parentName:"ol"},"Update the branch to your Staging branch."),Object(r.b)("li",{parentName:"ol"},'Click on "Save"')),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/2f4f2a22062a4840ae077285a891e573",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"We are almost done, now we need to smartly change our environment variables and secrets to not use the one used in production."),Object(r.b)("h2",{id:"override-your-environment-variables-and-secrets"},"Override your environment variables and secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Qovery makes the distinction between ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Environment Variables")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Secrets")," even if for your app both will be used as Environment Variables. Check out ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"this documentation")," to learn more about Environment Variables and Secrets.")),Object(r.b)("p",null,"Let's say you have a production environment with the following environment variables:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"NODE_ENV=production"),Object(r.b)("li",{parentName:"ul"},"STRIPE_API_KEY=a-secret-production-key")),Object(r.b)("p",null,"You might need to keep the same keys but change the values. That's exactly what Qovery makes you do with the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#override-environment-variable"}),"Environment Variable Override feature"),". You can keep the same keys but change the values."),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/3d5d37dd9a954500aa559afead5b3981",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"deploy-your-staging-environment"},"Deploy your Staging environment"),Object(r.b)("p",null,'Finally, your Staging environment has been created and set up correctly. To deploy your Staging environment, you just need to go to your Staging environment and click on the "Deploy" button.'),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/04709bb4039447c699477ce01a1aa19b",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),o=n.n(a),r=n(463),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||c))}),t)}},468:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),o=n.n(a),r=n(464);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),o=(n(481),n(478),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(483),l=n(463),c=n.n(l),s=n(471),u=n.n(s),b=n(482),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",o,{"tabs--block":t}),style:l},s.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return i(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,c=l;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,c=e.placeholder,s=e.select,v=e.size,h=(e.style,e.values),y=e.urlKey,f=Object(b.a)(),w=f.tabGroupChoices,O=f.setTabGroupChoices,j=Object(o.useState)(n),k=j[0],S=j[1];if(null!=i){var N=w[i];null!=N&&N!==k&&S(N)}var C=function(e){S(e),null!=i&&O(i,e)},E=[],T=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&y){var e=u.a.parse(window.location.search);e[y]&&S(e[y])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(v||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),h.length>1&&(s?r.a.createElement(g,Object(a.a)({changeSelectedValue:C,handleKeydown:T,placeholder:c,selectedValue:k,size:v,tabRefs:E},e)):r.a.createElement(p,Object(a.a)({changeSelectedValue:C,handleKeydown:T,selectedValue:k,tabRefs:E},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{184:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return s})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return d}));var a=n(1),o=n(9),r=(n(0),n(465)),i=n(464),l=(n(477),n(469)),c={last_modified_on:"2022-07-25",$schema:"/.meta/.schemas/guides.json",title:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},s={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws",readingTime:"4 min read",source:"@site/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create your Staging environment from your Production environment on AWS",truncated:!1,prevItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"},nextItem:{title:"Creating API clients using OpenAPI Tools",permalink:"/guides/tutorial/generate-qovery-api-client"}},u=[{value:"Create a Staging cluster",id:"create-a-staging-cluster",children:[]},{value:"Create your Staging environment from your Production environment",id:"create-your-staging-environment-from-your-production-environment",children:[]},{value:"Update your Staging applications",id:"update-your-staging-applications",children:[]},{value:"Override your environment variables and secrets",id:"override-your-environment-variables-and-secrets",children:[]},{value:"Deploy your Staging environment",id:"deploy-your-staging-environment",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:u};function d(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Let's say you have your production environment deployed, and you want to create a staging environment. You have two options:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Create a staging environment from scratch."),Object(r.b)("li",{parentName:"ol"},"Clone your production environment and create a staging environment from it.")),Object(r.b)("p",null,"This is where the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature of Qovery is useful. No need to create a new environment, just clone your production environment and create a staging environment from it."),Object(r.b)("p",null,"In this guide, we will go through the steps to create a staging environment from your production environment. While applying the best practices by isolating the staging and production environments on two separated clusters and VPCs."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/staging-from-production/complete_schema.jpg",alt:"Complete Production and Staging infrastructure"})),Object(r.b)(l.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/5a76704a196341deb5384b2883113adf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-a-staging-cluster"},"Create a Staging cluster"),Object(r.b)("p",null,"Isolating the staging and production environments on two separate clusters and VPCs is a good practice to avoid any potential issues on your production caused by your staging. This is not a mandatory step, but it is well recommended."),Object(r.b)("p",null,"To create your staging cluster it's also recommended creating a new AWS IAM access key and secret access key in a dedicated subaccount. Then you are sure that both environment are also isolated at the AWS level:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your Organization cluster settings"),Object(r.b)("li",{parentName:"ol"},'Add a cluster with a name "staging"'),Object(r.b)("li",{parentName:"ol"},"Deploy your staging cluster")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/6f77172ae27f41a5a7c0e3114398b13c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-your-staging-environment-from-your-production-environment"},"Create your Staging environment from your Production environment"),Object(r.b)("p",null,"Now, to create your staging environment from your production environment, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Go inside your production environment and click on the "Clone" button.'),Object(r.b)("li",{parentName:"ol"},'Give a name to your staging environment (E.g "staging")'),Object(r.b)("li",{parentName:"ol"},'Set the mode to "Staging"'),Object(r.b)("li",{parentName:"ol"},'Set the cluster to "staging"'),Object(r.b)("li",{parentName:"ol"},'Click on "Create"'),Object(r.b)("li",{parentName:"ol"},"That's it!")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Cloning your database does not copy the data (yet). To copy your data in Staging consider using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.replibyte.com"}),"Replibyte")," in standalone. It will be integrated in Qovery soon.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/614844644cc34211853de19dafe79343",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Your environment has been created, but it's not deployed yet. Before we will make some adjustment to change the branch of our applications."),Object(r.b)("h2",{id:"update-your-staging-applications"},"Update your Staging applications"),Object(r.b)("p",null,"Your Staging applications have the same branch as your Production applications. To update your Staging applications branch, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go into the settings of each of your applications."),Object(r.b)("li",{parentName:"ol"},"Update the branch to your Staging branch."),Object(r.b)("li",{parentName:"ol"},'Click on "Save"')),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/2f4f2a22062a4840ae077285a891e573",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"We are almost done, now we need to smartly change our environment variables and secrets to not use the one used in production."),Object(r.b)("h2",{id:"override-your-environment-variables-and-secrets"},"Override your environment variables and secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Qovery makes the distinction between ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Environment Variables")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Secrets")," even if for your app both will be used as Environment Variables. Check out ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"this documentation")," to learn more about Environment Variables and Secrets.")),Object(r.b)("p",null,"Let's say you have a production environment with the following environment variables:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"NODE_ENV=production"),Object(r.b)("li",{parentName:"ul"},"STRIPE_API_KEY=a-secret-production-key")),Object(r.b)("p",null,"You might need to keep the same keys but change the values. That's exactly what Qovery makes you do with the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#override-environment-variable"}),"Environment Variable Override feature"),". You can keep the same keys but change the values."),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/3d5d37dd9a954500aa559afead5b3981",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"deploy-your-staging-environment"},"Deploy your Staging environment"),Object(r.b)("p",null,'Finally, your Staging environment has been created and set up correctly. To deploy your Staging environment, you just need to go to your Staging environment and click on the "Deploy" button.'),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/04709bb4039447c699477ce01a1aa19b",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),o=n.n(a),r=n(463),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||c))}),t)}},468:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),o=n.n(a),r=n(464);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),o=(n(480),n(479),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(483),l=n(463),c=n.n(l),s=n(471),u=n.n(s),b=n(482),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",o,{"tabs--block":t}),style:l},s.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return i(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,c=l;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,c=e.placeholder,s=e.select,v=e.size,h=(e.style,e.values),y=e.urlKey,f=Object(b.a)(),w=f.tabGroupChoices,O=f.setTabGroupChoices,j=Object(o.useState)(n),k=j[0],S=j[1];if(null!=i){var N=w[i];null!=N&&N!==k&&S(N)}var C=function(e){S(e),null!=i&&O(i,e)},E=[],T=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&y){var e=u.a.parse(window.location.search);e[y]&&S(e[y])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(v||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),h.length>1&&(s?r.a.createElement(g,Object(a.a)({changeSelectedValue:C,handleKeydown:T,placeholder:c,selectedValue:k,size:v,tabRefs:E},e)):r.a.createElement(p,Object(a.a)({changeSelectedValue:C,handleKeydown:T,selectedValue:k,tabRefs:E},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}}}]); \ No newline at end of file diff --git a/1be78505.ebc70c63.js b/1be78505.cddfba4f.js similarity index 99% rename from 1be78505.ebc70c63.js rename to 1be78505.cddfba4f.js index cafe862e82..cb900f0ad6 100644 --- a/1be78505.ebc70c63.js +++ b/1be78505.cddfba4f.js @@ -1,2 +1,2 @@ -/*! For license information please see 1be78505.ebc70c63.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[38,310],{460:function(e,t,n){"use strict";n.r(t);n(29),n(22),n(21),n(52),n(478);var a=n(0),r=n.n(a),i=n(465),o=n(463),l=n.n(o),s=n(476),c=n(67),u=n(487),d=n(1),p=(n(78),n(488),n(489),n(470)),m=n(484),f=n.n(m);n(480);var b=n(492),g=n(493),h=n(187),y=n.n(h);n(188);function v(e){var t=e.item,n=e.level,i=e.onItemClick,o=e.collapsible,s=t.items,c=t.href,u=t.label,m=t.type,f=Object(a.useState)(t.collapsed),b=f[0],g=f[1],h=Object(a.useState)(null),y=h[0],k=h[1];switch(t.collapsed!==y&&(k(t.collapsed),g(t.collapsed)),m){case"category":if(0==s.length)return!1;if(1==n)return r.a.createElement("li",{className:l()("menu__list-item"),key:u},r.a.createElement("div",{className:"title"},u),r.a.createElement("ul",{className:"menu__list"},s.map((function(e){return r.a.createElement(v,{key:e.label,item:e,level:n+1,onItemClick:i,collapsible:o})}))));var w=s[0].href;return r.a.createElement("li",{className:l()("menu__list-item",{"menu__list-item--collapsed":b}),key:u},r.a.createElement(p.a,{activeClassName:"menu__link--active",className:l()("menu__link",{"menu__link--sublist":o}),to:w+"/",onClick:o&&"#!"==w?function(){return g(!b)}:void 0},u),r.a.createElement("ul",{className:"menu__list"},s.map((function(e){return r.a.createElement(v,{key:e.label,item:e,level:n+1,onItemClick:i,collapsible:o})}))));case"link":default:var E=[],_=u;if(u.includes("|")){var x=u.split("|",2);_=x[0],E=JSON.parse(x[1])}var O="hidden"==_;return r.a.createElement("li",{className:l()("menu__list-item",O&&"menu__list-item-hidden"),key:u},r.a.createElement(p.a,Object(d.a)({className:"menu__link",to:c+"/"},/^\/(?!\/)/.test(c)?{activeClassName:"menu__link--active",exact:!0,onClick:i}:{target:"_blank",rel:"noreferrer noopener"}),_,E.length>0&&r.a.createElement("span",{className:"badges"},E.includes("log")&&r.a.createElement("span",{className:"badge badge--secondary",title:"This component works with log events."},"L"),E.includes("metric")&&r.a.createElement("span",{className:"badge badge--secondary",title:"This component works with metric events."},"M"))))}}var k=function(e){var t=Object(a.useState)(!1),n=t[0],i=t[1],o=Object(s.a)(),c=o.siteConfig,u=(c=void 0===c?{}:c).themeConfig.navbar,m=(u=void 0===u?{}:u).title,h=o.isClient,k=Object(g.a)(),w=k.logoLink,E=k.logoLinkProps,_=k.logoImageUrl,x=k.logoAlt,O=e.docsSidebars,j=e.path,S=e.sidebar,N=e.sidebarCollapsible;if(Object(b.a)(n),!S)return null;var T=O[S];if(!T)throw new Error('Cannot find the sidebar "'+S+'" in the sidebar config!');return N&&T.forEach((function(e){return function e(t,n){var a=t.items,r=t.href;switch(t.type){case"category":var i=a.map((function(t){return e(t,n)})).filter((function(e){return e})).length>0;return t.collapsed=!i,i;case"link":default:return r===n}}(e,j)})),r.a.createElement("div",{className:l()("docs-sidebar",y.a.sidebar)},r.a.createElement(p.a,Object(d.a)({className:y.a.sidebarLogo,style:{maxWidth:"130px"},to:w},E),null!=_&&r.a.createElement(f.a,{key:h,src:_,alt:x}),null!=m&&r.a.createElement("strong",null,m)),r.a.createElement("div",{className:l()("menu","menu--responsive",y.a.menu,{"menu--show":n})},r.a.createElement("button",{"aria-label":n?"Close Menu":"Open Menu",className:"button button--secondary button--sm menu__button",type:"button",onClick:function(){i(!n)}},n?r.a.createElement("span",{className:l()(y.a.sidebarMenuIcon,y.a.sidebarMenuCloseIcon)},"\xd7"):r.a.createElement("svg",{className:y.a.sidebarMenuIcon,xmlns:"http://www.w3.org/2000/svg",height:24,width:24,viewBox:"0 0 32 32",role:"img",focusable:"false"},r.a.createElement("title",null,"Menu"),r.a.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))),r.a.createElement("ul",{className:"menu__list"},T.map((function(e){return e.items.length>0&&r.a.createElement(v,{key:e.label,item:e,level:1,onItemClick:function(){i(!1)},collapsible:N})})))))},w=n(569),E=n(604),_=n(512),x=n(189),O=n.n(x);t.default=function(e){var t=e.route,n=e.docsMetadata,a=e.location,o=t.routes.find((function(e){return Object(_.b)(a.pathname,e)}))||{},d=n.permalinkToSidebar,p=n.docsSidebars,m=n.version,f=d[o.path],b=Object(s.a)(),g=b.siteConfig,h=(g=void 0===g?{}:g).themeConfig,y=void 0===h?{}:h,v=b.isClient,x=y.sidebarCollapsible,j=void 0===x||x;return 0===Object.keys(o).length?r.a.createElement(E.default,e):r.a.createElement(u.a,{version:m,key:v},r.a.createElement("div",{className:l()(O.a.container,"container","container--l")},f&&r.a.createElement("div",{className:l()(O.a.sidebar)},r.a.createElement(k,{docsSidebars:p,path:o.path,sidebar:f,sidebarCollapsible:j})),r.a.createElement("main",{className:O.a.main},r.a.createElement(i.a,{components:w.a},Object(c.a)(t.routes)))))}},463:function(e,t,n){var a;!function(){"use strict";var n={}.hasOwnProperty;function r(){for(var e=[],t=0;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l({},t,{},e)),n},d=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},m=Object(a.forwardRef)((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,o=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,f=d["".concat(o,".").concat(m)]||d[m]||p[m]||i;return n?r.a.createElement(f,l({ref:t},c,{components:n})):r.a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c1?arguments[1]:void 0)}}),n(74)("find")},487:function(e,t,n){"use strict";n(497);var a=n(0),r=n.n(a),i=n(498),o=n(486),l=n(1),s=(n(488),n(489),n(499),n(470)),c=n(500),u=n(484),d=n.n(u),p=n(501),m=n.n(p),f=n(476),b=n(463),g=n.n(b),h=n(135),y=n.n(h),v=function(){return r.a.createElement("span",{className:g()(y.a.toggle,y.a.moon)})},k=function(){return r.a.createElement("span",{className:g()(y.a.toggle,y.a.sun)})},w=function(e){var t=Object(f.a)().isClient;return r.a.createElement(m.a,Object(l.a)({disabled:!t,icons:{checked:r.a.createElement(v,null),unchecked:r.a.createElement(k,null)}},e))};function E(){var e=Object(f.a)().siteConfig,t=(void 0===e?{}:e).customFields.metadata.latest_post,n=Date.parse(t.date),a=new Date,r=Math.abs(a-n),i=Math.ceil(r/864e5),o=null;return"undefined"!=typeof window&&(o=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!o||o0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(d.a,{className:"navbar__logo",src:m,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),s.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(R,e))}))):null)}))),(u||o)&&r.a.createElement("div",{className:"text--center"},u&&u.src&&r.a.createElement("div",{className:"margin-bottom--sm"},u.href?r.a.createElement("a",{href:u.href,target:"_blank",rel:"noopener noreferrer",className:I.a.footerLogoLink},r.a.createElement(D,{alt:u.alt,url:p})):r.a.createElement(D,{alt:u.alt,url:p})),r.a.createElement("small",null,o),r.a.createElement("br",null))))},M=n(502),F=n(503),q=n(3);n(138);t.a=function(e){var t=Object(f.a)().siteConfig,n=void 0===t?{}:t,a=n.title,l=n.themeConfig.image,s=n.url,c=e.children,u=e.title,d=e.noFooter,p=e.description,m=e.image,b=e.keywords,g=e.version,h=u?u+" | "+a:a,y=m||l,v=s+Object(x.a)(y),k=Object(q.h)(),w=k?"https://docs.qovery.com"+(k.pathname.endsWith("/")?k.pathname:k.pathname+"/"):null;return r.a.createElement(F.a,null,r.a.createElement(M.a,null,r.a.createElement(o.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),h&&r.a.createElement("title",null,h),h&&r.a.createElement("meta",{property:"og:title",content:h}),r.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),r.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),r.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),r.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),r.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),r.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),p&&r.a.createElement("meta",{name:"description",content:p}),p&&r.a.createElement("meta",{property:"og:description",content:p}),g&&r.a.createElement("meta",{name:"docsearch:version",content:g}),b&&b.length&&r.a.createElement("meta",{name:"keywords",content:b.join(",")}),y&&r.a.createElement("meta",{property:"og:image",content:v}),y&&r.a.createElement("meta",{property:"twitter:image",content:v}),y&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+h}),w&&r.a.createElement("meta",{property:"og:url",content:w}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),w&&r.a.createElement("link",{rel:"canonical",href:w})),r.a.createElement(i.a,null),r.a.createElement(A,null),r.a.createElement("div",{className:"main-wrapper"},c),!d&&r.a.createElement($,null)))}},490:function(e,t,n){"use strict";var a=n(9),r=n(0),i=n.n(r),o=n(463),l=n.n(o),s=n(476),c=(n(139),n(140)),u=n.n(c);t.a=function(e){return function(t){var n,r=t.id,o=Object(a.a)(t,["id"]),c=Object(s.a)().siteConfig,d=(c=void 0===c?{}:c).themeConfig,p=(d=void 0===d?{}:d).navbar,m=(p=void 0===p?{}:p).hideOnScroll,f=void 0!==m&&m;return r?i.a.createElement(e,o,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:l()("anchor",(n={},n[u.a.enhancedAnchor]=!f,n)),id:r}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),o.children):i.a.createElement(e,o)}}},494:function(e,t,n){"use strict";var a=n(0),r=Object(a.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=r},505:function(e,t,n){var a=n(30),r=n(54),i=n(27),o=n(26),l=n(506);e.exports=function(e,t){var n=1==e,s=2==e,c=3==e,u=4==e,d=6==e,p=5==e||d,m=t||l;return function(t,l,f){for(var b,g,h=i(t),y=r(h),v=a(l,f,3),k=o(y.length),w=0,E=n?m(t,k):s?m(t,0):void 0;k>w;w++)if((p||w in y)&&(g=v(b=y[w],w,h),e))if(n)E[w]=g;else if(g)switch(e){case 3:return!0;case 5:return b;case 6:return w;case 2:E.push(b)}else if(u)return!1;return d?-1:c||u?u:E}}},506:function(e,t,n){var a=n(507);e.exports=function(e,t){return new(a(e))(t)}},507:function(e,t,n){var a=n(13),r=n(508),i=n(2)("species");e.exports=function(e){var t;return r(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!r(t.prototype)||(t=void 0),a(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},508:function(e,t,n){var a=n(23);e.exports=Array.isArray||function(e){return"Array"==a(e)}},527:function(e,t,n){"use strict";(function(e){var a=n(1),r=(n(488),n(489),n(78),n(77),n(570),n(0)),i=n.n(r),o=n(571),l=n.n(o),s=n(603),c=n(53),u=n(463),d=n.n(u),p=n(583),m=n.n(p),f=n(572),b=n.n(f),g=n(476),h=n(485),y=n(148),v=n.n(y);(void 0!==e?e:window).Prism=c.a,n(573),n(574),n(575),n(576),n(90),n(577),n(578),n(579),n(580),n(581),n(582);var k=/{([\d,-]+)}/,w=/title=".*"/;t.a=function(e){var t=e.children,n=e.className,o=e.metastring,c=Object(g.a)().siteConfig.themeConfig.prism,u=void 0===c?{}:c,p=Object(r.useState)(!1),f=p[0],y=p[1],E=Object(r.useState)(!1),_=E[0],x=E[1];Object(r.useEffect)((function(){x(!0)}),[]);var O=Object(r.useRef)(null),j=Object(r.useRef)(null),S=[],N="",T=Object(h.a)().isDarkTheme,C=u.theme||m.a,P=u.darkTheme||C,A=T?P:C;if(o&&k.test(o)){var z=o.match(k)[1];S=b.a.parse(z).filter((function(e){return e>0}))}o&&w.test(o)&&(N=o.match(w)[0].split("title=")[1].replace(/"+/g,"")),Object(r.useEffect)((function(){var e;return j.current&&(e=new l.a(j.current,{target:function(){return O.current}})),function(){e&&e.destroy()}}),[j.current,O.current]);var L=n&&n.replace(/language-/,"");!L&&u.defaultLanguage&&(L=u.defaultLanguage);var I=function(){window.getSelection().empty(),y(!0),setTimeout((function(){return y(!1)}),2e3)};return i.a.createElement(s.a,Object(a.a)({},s.b,{key:_,theme:A,code:t.trim(),language:L}),(function(e){var t,n,r=e.className,o=e.style,l=e.tokens,s=e.getLineProps,c=e.getTokenProps;return i.a.createElement(i.a.Fragment,null,N&&i.a.createElement("div",{style:o,className:v.a.codeBlockTitle},N),i.a.createElement("div",{className:v.a.codeBlockContent},i.a.createElement("button",{ref:j,type:"button","aria-label":"Copy code to clipboard",className:d()(v.a.copyButton,(t={},t[v.a.copyButtonWithTitle]=N,t)),onClick:I},f?"Copied":"Copy"),i.a.createElement("pre",{className:d()(r,v.a.codeBlock,(n={},n[v.a.codeBlockWithTitle]=N,n))},i.a.createElement("div",{ref:O,className:v.a.codeBlockLines,style:o},l.map((function(e,t){1===e.length&&""===e[0].content&&(e[0].content="\n");var n=s({line:e,key:t});return S.includes(t+1)&&(n.className=n.className+" docusaurus-highlight-code-line"),i.a.createElement("div",Object(a.a)({key:t},n),e.map((function(e,t){return i.a.createElement("span",Object(a.a)({key:t},c({token:e,key:t})))})))}))))))}))}}).call(this,n(76))},569:function(e,t,n){"use strict";var a=n(1),r=n(0),i=n.n(r),o=n(470),l=n(527),s=n(490),c=n(149),u=n.n(c);t.a={code:function(e){var t=e.children;return"string"==typeof t?i.a.createElement(l.a,e):t},a:function(e){return/\.[^./]+$/.test(e.href)?i.a.createElement("a",e):i.a.createElement(o.a,e)},pre:function(e){return i.a.createElement("div",Object(a.a)({className:u.a.mdxCodeBlock},e))},h1:Object(s.a)("h1"),h2:Object(s.a)("h2"),h3:Object(s.a)("h3"),h4:Object(s.a)("h4"),h5:Object(s.a)("h5"),h6:Object(s.a)("h6")}},570:function(e,t,n){"use strict";var a=n(8),r=n(26),i=n(60),o=n(55);n(56)("match",1,(function(e,t,n,l){return[function(n){var a=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,a):new RegExp(n)[t](String(a))},function(e){var t=l(n,e,this);if(t.done)return t.value;var s=a(e),c=String(this);if(!s.global)return o(s,c);var u=s.unicode;s.lastIndex=0;for(var d,p=[],m=0;null!==(d=o(s,c));){var f=String(d[0]);p[m]=f,""===f&&(s.lastIndex=i(c,r(s.lastIndex),u)),m++}return 0===m?null:p}]}))},571:function(e,t,n){var a;a=function(){return function(e){var t={};function n(a){if(t[a])return t[a].exports;var r=t[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(a,r,function(t){return e[t]}.bind(null,r));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=6)}([function(e,t){e.exports=function(e){var t;if("SELECT"===e.nodeName)e.focus(),t=e.value;else if("INPUT"===e.nodeName||"TEXTAREA"===e.nodeName){var n=e.hasAttribute("readonly");n||e.setAttribute("readonly",""),e.select(),e.setSelectionRange(0,e.value.length),n||e.removeAttribute("readonly"),t=e.value}else{e.hasAttribute("contenteditable")&&e.focus();var a=window.getSelection(),r=document.createRange();r.selectNodeContents(e),a.removeAllRanges(),a.addRange(r),t=a.toString()}return t}},function(e,t){function n(){}n.prototype={on:function(e,t,n){var a=this.e||(this.e={});return(a[e]||(a[e]=[])).push({fn:t,ctx:n}),this},once:function(e,t,n){var a=this;function r(){a.off(e,r),t.apply(n,arguments)}return r._=t,this.on(e,r,n)},emit:function(e){for(var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),a=0,r=n.length;a0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var e=this,t="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[t?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=r()(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=r()(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":i(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function(){return this._target}}]),e}(),s=n(1),c=n.n(s),u=n(2),d=n.n(u),p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},m=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===p(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=d()(e,"click",(function(e){return t.onClick(e)}))}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l({action:this.action(t),target:this.target(t),text:this.text(t),container:this.container,trigger:t,emitter:this})}},{key:"defaultAction",value:function(e){return b("action",e)}},{key:"defaultTarget",value:function(e){var t=b("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return b("text",e)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach((function(e){n=n&&!!document.queryCommandSupported(e)})),n}}]),t}(c.a);function b(e,t){var n="data-clipboard-"+e;if(t.hasAttribute(n))return t.getAttribute(n)}t.default=f}]).default},e.exports=a()},572:function(e,t){e.exports.parse=function(e){var t=e.split(",").map((function(e){return function(e){if(/^-?\d+$/.test(e))return parseInt(e,10);var t;if(t=e.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){var n=t[1],a=t[2],r=t[3];if(n&&r){var i=[],o=(n=parseInt(n))<(r=parseInt(r))?1:-1;"-"!=a&&".."!=a&&"\u2025"!=a||(r+=o);for(var l=n;l!=r;l+=o)i.push(l);return i}}return[]}(e)}));return 0===t.length?[]:1===t.length?Array.isArray(t[0])?t[0]:t:t.reduce((function(e,t){return Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]),e.concat(t)}))}},573:function(e,t){!function(e){function t(e){return RegExp("(^(?:"+e+"):[ \t]*(?![ \t]))[^]+","i")}e.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:e.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:t(/Content-Security-Policy/.source),lookbehind:!0,alias:["csp","languages-csp"],inside:e.languages.csp},{pattern:t(/Public-Key-Pins(?:-Report-Only)?/.source),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:e.languages.hpkp},{pattern:t(/Strict-Transport-Security/.source),lookbehind:!0,alias:["hsts","languages-hsts"],inside:e.languages.hsts},{pattern:t(/[^:]+/.source),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var n,a=e.languages,r={"application/javascript":a.javascript,"application/json":a.json||a.javascript,"application/xml":a.xml,"text/xml":a.xml,"text/html":a.html,"text/css":a.css,"text/plain":a.plain},i={"application/json":!0,"application/xml":!0};function o(e){var t=e.replace(/^[a-z]+\//,"");return"(?:"+e+"|"+("\\w+/(?:[\\w.-]+\\+)+"+t+"(?![+\\w.-])")+")"}for(var l in r)if(r[l]){n=n||{};var s=i[l]?o(l):l;n[l.replace(/\//g,"-")]={pattern:RegExp("("+/content-type:\s*/.source+s+/(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source+")"+/[^ \t\w-][\s\S]*/.source,"i"),lookbehind:!0,inside:r[l]}}n&&e.languages.insertBefore("http","header",n)}(Prism)},574:function(e,t){Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}},575:function(e,t){!function(e){var t=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};t.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:t},boolean:t.boolean,variable:t.variable}}(Prism)},576:function(e,t){!function(e){var t=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:t}},builtin:t,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism)},577:function(e,t){!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},578:function(e,t){!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},579:function(e,t){!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,a={pattern:RegExp(n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(n+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},580:function(e,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},581:function(e,t){!function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,r=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,i=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:r,punctuation:i};var o={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},l=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:o}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:o}}];e.languages.insertBefore("php","variable",{string:l,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:l,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:a,operator:r,punctuation:i}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){if(/<\?/.test(t.code)){e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(Prism)},582:function(e,t){!function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,a="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",r=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),i=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function o(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return a})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return a}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return a})).replace(/<>/g,(function(){return"(?:"+r+"|"+i+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:o(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:o(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:o(i),lookbehind:!0,greedy:!0},number:{pattern:o(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism)},583:function(e,t){e.exports={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]}},603:function(e,t,n){"use strict";n.d(t,"b",(function(){return o}));var a=n(53),r={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","at-rule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},i=n(0),o={Prism:a.a,theme:r};function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(){return(s=Object.assign||function(e){for(var t=1;t0&&e[n-1]===t?e:e.concat(t)},p=function(e,t){var n=e.plain,a=Object.create(null),r=e.styles.reduce((function(e,n){var a=n.languages,r=n.style;return a&&!a.includes(t)||n.types.forEach((function(t){var n=s({},e[t],r);e[t]=n})),e}),a);return r.root=n,r.plain=s({},n,{backgroundColor:null}),r};function m(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&-1===t.indexOf(a)&&(n[a]=e[a]);return n}var f=function(e){function t(){for(var t=this,n=[],a=arguments.length;a--;)n[a]=arguments[a];e.apply(this,n),l(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?p(e.theme,e.language):void 0;return t.themeDict=n})),l(this,"getLineProps",(function(e){var n=e.key,a=e.className,r=e.style,i=s({},m(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),o=t.getThemeDict(t.props);return void 0!==o&&(i.style=o.plain),void 0!==r&&(i.style=void 0!==i.style?s({},i.style,r):r),void 0!==n&&(i.key=n),a&&(i.className+=" "+a),i})),l(this,"getStyleForToken",(function(e){var n=e.types,a=e.empty,r=n.length,i=t.getThemeDict(t.props);if(void 0!==i){if(1===r&&"plain"===n[0])return a?{display:"inline-block"}:void 0;if(1===r&&!a)return i[n[0]];var o=a?{display:"inline-block"}:{},l=n.map((function(e){return i[e]}));return Object.assign.apply(Object,[o].concat(l))}})),l(this,"getTokenProps",(function(e){var n=e.key,a=e.className,r=e.style,i=e.token,o=s({},m(e,["key","className","style","token"]),{className:"token "+i.types.join(" "),children:i.content,style:t.getStyleForToken(i),key:void 0});return void 0!==r&&(o.style=void 0!==o.style?s({},o.style,r):r),void 0!==n&&(o.key=n),a&&(o.className+=" "+a),o}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,a=e.code,r=e.children,i=this.getThemeDict(this.props),o=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],a=[0],r=[e.length],i=0,o=0,l=[],s=[l];o>-1;){for(;(i=a[o]++)0?m:["plain"],p=f):(m=d(m,f.type),f.alias&&(m=d(m,f.alias)),p=f.content),"string"==typeof p){var b=p.split(c),g=b.length;l.push({types:m,content:b[0]});for(var h=1;h0&&r.a.createElement("span",{className:"badges"},E.includes("log")&&r.a.createElement("span",{className:"badge badge--secondary",title:"This component works with log events."},"L"),E.includes("metric")&&r.a.createElement("span",{className:"badge badge--secondary",title:"This component works with metric events."},"M"))))}}var k=function(e){var t=Object(a.useState)(!1),n=t[0],i=t[1],o=Object(s.a)(),c=o.siteConfig,u=(c=void 0===c?{}:c).themeConfig.navbar,m=(u=void 0===u?{}:u).title,h=o.isClient,k=Object(g.a)(),w=k.logoLink,E=k.logoLinkProps,_=k.logoImageUrl,x=k.logoAlt,O=e.docsSidebars,j=e.path,S=e.sidebar,N=e.sidebarCollapsible;if(Object(b.a)(n),!S)return null;var T=O[S];if(!T)throw new Error('Cannot find the sidebar "'+S+'" in the sidebar config!');return N&&T.forEach((function(e){return function e(t,n){var a=t.items,r=t.href;switch(t.type){case"category":var i=a.map((function(t){return e(t,n)})).filter((function(e){return e})).length>0;return t.collapsed=!i,i;case"link":default:return r===n}}(e,j)})),r.a.createElement("div",{className:l()("docs-sidebar",y.a.sidebar)},r.a.createElement(p.a,Object(d.a)({className:y.a.sidebarLogo,style:{maxWidth:"130px"},to:w},E),null!=_&&r.a.createElement(f.a,{key:h,src:_,alt:x}),null!=m&&r.a.createElement("strong",null,m)),r.a.createElement("div",{className:l()("menu","menu--responsive",y.a.menu,{"menu--show":n})},r.a.createElement("button",{"aria-label":n?"Close Menu":"Open Menu",className:"button button--secondary button--sm menu__button",type:"button",onClick:function(){i(!n)}},n?r.a.createElement("span",{className:l()(y.a.sidebarMenuIcon,y.a.sidebarMenuCloseIcon)},"\xd7"):r.a.createElement("svg",{className:y.a.sidebarMenuIcon,xmlns:"http://www.w3.org/2000/svg",height:24,width:24,viewBox:"0 0 32 32",role:"img",focusable:"false"},r.a.createElement("title",null,"Menu"),r.a.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))),r.a.createElement("ul",{className:"menu__list"},T.map((function(e){return e.items.length>0&&r.a.createElement(v,{key:e.label,item:e,level:1,onItemClick:function(){i(!1)},collapsible:N})})))))},w=n(569),E=n(604),_=n(512),x=n(189),O=n.n(x);t.default=function(e){var t=e.route,n=e.docsMetadata,a=e.location,o=t.routes.find((function(e){return Object(_.b)(a.pathname,e)}))||{},d=n.permalinkToSidebar,p=n.docsSidebars,m=n.version,f=d[o.path],b=Object(s.a)(),g=b.siteConfig,h=(g=void 0===g?{}:g).themeConfig,y=void 0===h?{}:h,v=b.isClient,x=y.sidebarCollapsible,j=void 0===x||x;return 0===Object.keys(o).length?r.a.createElement(E.default,e):r.a.createElement(u.a,{version:m,key:v},r.a.createElement("div",{className:l()(O.a.container,"container","container--l")},f&&r.a.createElement("div",{className:l()(O.a.sidebar)},r.a.createElement(k,{docsSidebars:p,path:o.path,sidebar:f,sidebarCollapsible:j})),r.a.createElement("main",{className:O.a.main},r.a.createElement(i.a,{components:w.a},Object(c.a)(t.routes)))))}},463:function(e,t,n){var a;!function(){"use strict";var n={}.hasOwnProperty;function r(){for(var e=[],t=0;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l({},t,{},e)),n},d=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},m=Object(a.forwardRef)((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,o=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,f=d["".concat(o,".").concat(m)]||d[m]||p[m]||i;return n?r.a.createElement(f,l({ref:t},c,{components:n})):r.a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c1?arguments[1]:void 0)}}),n(74)("find")},487:function(e,t,n){"use strict";n(497);var a=n(0),r=n.n(a),i=n(498),o=n(486),l=n(1),s=(n(488),n(489),n(499),n(470)),c=n(500),u=n(484),d=n.n(u),p=n(501),m=n.n(p),f=n(476),b=n(463),g=n.n(b),h=n(135),y=n.n(h),v=function(){return r.a.createElement("span",{className:g()(y.a.toggle,y.a.moon)})},k=function(){return r.a.createElement("span",{className:g()(y.a.toggle,y.a.sun)})},w=function(e){var t=Object(f.a)().isClient;return r.a.createElement(m.a,Object(l.a)({disabled:!t,icons:{checked:r.a.createElement(v,null),unchecked:r.a.createElement(k,null)}},e))};function E(){var e=Object(f.a)().siteConfig,t=(void 0===e?{}:e).customFields.metadata.latest_post,n=Date.parse(t.date),a=new Date,r=Math.abs(a-n),i=Math.ceil(r/864e5),o=null;return"undefined"!=typeof window&&(o=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!o||o0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(d.a,{className:"navbar__logo",src:m,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),s.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(R,e))}))):null)}))),(u||o)&&r.a.createElement("div",{className:"text--center"},u&&u.src&&r.a.createElement("div",{className:"margin-bottom--sm"},u.href?r.a.createElement("a",{href:u.href,target:"_blank",rel:"noopener noreferrer",className:I.a.footerLogoLink},r.a.createElement(D,{alt:u.alt,url:p})):r.a.createElement(D,{alt:u.alt,url:p})),r.a.createElement("small",null,o),r.a.createElement("br",null))))},M=n(502),F=n(503),q=n(3);n(138);t.a=function(e){var t=Object(f.a)().siteConfig,n=void 0===t?{}:t,a=n.title,l=n.themeConfig.image,s=n.url,c=e.children,u=e.title,d=e.noFooter,p=e.description,m=e.image,b=e.keywords,g=e.version,h=u?u+" | "+a:a,y=m||l,v=s+Object(x.a)(y),k=Object(q.h)(),w=k?"https://docs.qovery.com"+(k.pathname.endsWith("/")?k.pathname:k.pathname+"/"):null;return r.a.createElement(F.a,null,r.a.createElement(M.a,null,r.a.createElement(o.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),h&&r.a.createElement("title",null,h),h&&r.a.createElement("meta",{property:"og:title",content:h}),r.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),r.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),r.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),r.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),r.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),r.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),p&&r.a.createElement("meta",{name:"description",content:p}),p&&r.a.createElement("meta",{property:"og:description",content:p}),g&&r.a.createElement("meta",{name:"docsearch:version",content:g}),b&&b.length&&r.a.createElement("meta",{name:"keywords",content:b.join(",")}),y&&r.a.createElement("meta",{property:"og:image",content:v}),y&&r.a.createElement("meta",{property:"twitter:image",content:v}),y&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+h}),w&&r.a.createElement("meta",{property:"og:url",content:w}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),w&&r.a.createElement("link",{rel:"canonical",href:w})),r.a.createElement(i.a,null),r.a.createElement(A,null),r.a.createElement("div",{className:"main-wrapper"},c),!d&&r.a.createElement($,null)))}},490:function(e,t,n){"use strict";var a=n(9),r=n(0),i=n.n(r),o=n(463),l=n.n(o),s=n(476),c=(n(139),n(140)),u=n.n(c);t.a=function(e){return function(t){var n,r=t.id,o=Object(a.a)(t,["id"]),c=Object(s.a)().siteConfig,d=(c=void 0===c?{}:c).themeConfig,p=(d=void 0===d?{}:d).navbar,m=(p=void 0===p?{}:p).hideOnScroll,f=void 0!==m&&m;return r?i.a.createElement(e,o,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:l()("anchor",(n={},n[u.a.enhancedAnchor]=!f,n)),id:r}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),o.children):i.a.createElement(e,o)}}},494:function(e,t,n){"use strict";var a=n(0),r=Object(a.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=r},505:function(e,t,n){var a=n(30),r=n(54),i=n(27),o=n(26),l=n(506);e.exports=function(e,t){var n=1==e,s=2==e,c=3==e,u=4==e,d=6==e,p=5==e||d,m=t||l;return function(t,l,f){for(var b,g,h=i(t),y=r(h),v=a(l,f,3),k=o(y.length),w=0,E=n?m(t,k):s?m(t,0):void 0;k>w;w++)if((p||w in y)&&(g=v(b=y[w],w,h),e))if(n)E[w]=g;else if(g)switch(e){case 3:return!0;case 5:return b;case 6:return w;case 2:E.push(b)}else if(u)return!1;return d?-1:c||u?u:E}}},506:function(e,t,n){var a=n(507);e.exports=function(e,t){return new(a(e))(t)}},507:function(e,t,n){var a=n(13),r=n(508),i=n(2)("species");e.exports=function(e){var t;return r(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!r(t.prototype)||(t=void 0),a(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},508:function(e,t,n){var a=n(23);e.exports=Array.isArray||function(e){return"Array"==a(e)}},527:function(e,t,n){"use strict";(function(e){var a=n(1),r=(n(488),n(489),n(78),n(77),n(570),n(0)),i=n.n(r),o=n(571),l=n.n(o),s=n(603),c=n(53),u=n(463),d=n.n(u),p=n(583),m=n.n(p),f=n(572),b=n.n(f),g=n(476),h=n(485),y=n(148),v=n.n(y);(void 0!==e?e:window).Prism=c.a,n(573),n(574),n(575),n(576),n(90),n(577),n(578),n(579),n(580),n(581),n(582);var k=/{([\d,-]+)}/,w=/title=".*"/;t.a=function(e){var t=e.children,n=e.className,o=e.metastring,c=Object(g.a)().siteConfig.themeConfig.prism,u=void 0===c?{}:c,p=Object(r.useState)(!1),f=p[0],y=p[1],E=Object(r.useState)(!1),_=E[0],x=E[1];Object(r.useEffect)((function(){x(!0)}),[]);var O=Object(r.useRef)(null),j=Object(r.useRef)(null),S=[],N="",T=Object(h.a)().isDarkTheme,C=u.theme||m.a,P=u.darkTheme||C,A=T?P:C;if(o&&k.test(o)){var z=o.match(k)[1];S=b.a.parse(z).filter((function(e){return e>0}))}o&&w.test(o)&&(N=o.match(w)[0].split("title=")[1].replace(/"+/g,"")),Object(r.useEffect)((function(){var e;return j.current&&(e=new l.a(j.current,{target:function(){return O.current}})),function(){e&&e.destroy()}}),[j.current,O.current]);var L=n&&n.replace(/language-/,"");!L&&u.defaultLanguage&&(L=u.defaultLanguage);var I=function(){window.getSelection().empty(),y(!0),setTimeout((function(){return y(!1)}),2e3)};return i.a.createElement(s.a,Object(a.a)({},s.b,{key:_,theme:A,code:t.trim(),language:L}),(function(e){var t,n,r=e.className,o=e.style,l=e.tokens,s=e.getLineProps,c=e.getTokenProps;return i.a.createElement(i.a.Fragment,null,N&&i.a.createElement("div",{style:o,className:v.a.codeBlockTitle},N),i.a.createElement("div",{className:v.a.codeBlockContent},i.a.createElement("button",{ref:j,type:"button","aria-label":"Copy code to clipboard",className:d()(v.a.copyButton,(t={},t[v.a.copyButtonWithTitle]=N,t)),onClick:I},f?"Copied":"Copy"),i.a.createElement("pre",{className:d()(r,v.a.codeBlock,(n={},n[v.a.codeBlockWithTitle]=N,n))},i.a.createElement("div",{ref:O,className:v.a.codeBlockLines,style:o},l.map((function(e,t){1===e.length&&""===e[0].content&&(e[0].content="\n");var n=s({line:e,key:t});return S.includes(t+1)&&(n.className=n.className+" docusaurus-highlight-code-line"),i.a.createElement("div",Object(a.a)({key:t},n),e.map((function(e,t){return i.a.createElement("span",Object(a.a)({key:t},c({token:e,key:t})))})))}))))))}))}}).call(this,n(76))},569:function(e,t,n){"use strict";var a=n(1),r=n(0),i=n.n(r),o=n(470),l=n(527),s=n(490),c=n(149),u=n.n(c);t.a={code:function(e){var t=e.children;return"string"==typeof t?i.a.createElement(l.a,e):t},a:function(e){return/\.[^./]+$/.test(e.href)?i.a.createElement("a",e):i.a.createElement(o.a,e)},pre:function(e){return i.a.createElement("div",Object(a.a)({className:u.a.mdxCodeBlock},e))},h1:Object(s.a)("h1"),h2:Object(s.a)("h2"),h3:Object(s.a)("h3"),h4:Object(s.a)("h4"),h5:Object(s.a)("h5"),h6:Object(s.a)("h6")}},570:function(e,t,n){"use strict";var a=n(8),r=n(26),i=n(60),o=n(55);n(56)("match",1,(function(e,t,n,l){return[function(n){var a=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,a):new RegExp(n)[t](String(a))},function(e){var t=l(n,e,this);if(t.done)return t.value;var s=a(e),c=String(this);if(!s.global)return o(s,c);var u=s.unicode;s.lastIndex=0;for(var d,p=[],m=0;null!==(d=o(s,c));){var f=String(d[0]);p[m]=f,""===f&&(s.lastIndex=i(c,r(s.lastIndex),u)),m++}return 0===m?null:p}]}))},571:function(e,t,n){var a;a=function(){return function(e){var t={};function n(a){if(t[a])return t[a].exports;var r=t[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(a,r,function(t){return e[t]}.bind(null,r));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=6)}([function(e,t){e.exports=function(e){var t;if("SELECT"===e.nodeName)e.focus(),t=e.value;else if("INPUT"===e.nodeName||"TEXTAREA"===e.nodeName){var n=e.hasAttribute("readonly");n||e.setAttribute("readonly",""),e.select(),e.setSelectionRange(0,e.value.length),n||e.removeAttribute("readonly"),t=e.value}else{e.hasAttribute("contenteditable")&&e.focus();var a=window.getSelection(),r=document.createRange();r.selectNodeContents(e),a.removeAllRanges(),a.addRange(r),t=a.toString()}return t}},function(e,t){function n(){}n.prototype={on:function(e,t,n){var a=this.e||(this.e={});return(a[e]||(a[e]=[])).push({fn:t,ctx:n}),this},once:function(e,t,n){var a=this;function r(){a.off(e,r),t.apply(n,arguments)}return r._=t,this.on(e,r,n)},emit:function(e){for(var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),a=0,r=n.length;a0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var e=this,t="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[t?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=r()(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=r()(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":i(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function(){return this._target}}]),e}(),s=n(1),c=n.n(s),u=n(2),d=n.n(u),p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},m=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===p(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=d()(e,"click",(function(e){return t.onClick(e)}))}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l({action:this.action(t),target:this.target(t),text:this.text(t),container:this.container,trigger:t,emitter:this})}},{key:"defaultAction",value:function(e){return b("action",e)}},{key:"defaultTarget",value:function(e){var t=b("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return b("text",e)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach((function(e){n=n&&!!document.queryCommandSupported(e)})),n}}]),t}(c.a);function b(e,t){var n="data-clipboard-"+e;if(t.hasAttribute(n))return t.getAttribute(n)}t.default=f}]).default},e.exports=a()},572:function(e,t){e.exports.parse=function(e){var t=e.split(",").map((function(e){return function(e){if(/^-?\d+$/.test(e))return parseInt(e,10);var t;if(t=e.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){var n=t[1],a=t[2],r=t[3];if(n&&r){var i=[],o=(n=parseInt(n))<(r=parseInt(r))?1:-1;"-"!=a&&".."!=a&&"\u2025"!=a||(r+=o);for(var l=n;l!=r;l+=o)i.push(l);return i}}return[]}(e)}));return 0===t.length?[]:1===t.length?Array.isArray(t[0])?t[0]:t:t.reduce((function(e,t){return Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]),e.concat(t)}))}},573:function(e,t){!function(e){function t(e){return RegExp("(^(?:"+e+"):[ \t]*(?![ \t]))[^]+","i")}e.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:e.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:t(/Content-Security-Policy/.source),lookbehind:!0,alias:["csp","languages-csp"],inside:e.languages.csp},{pattern:t(/Public-Key-Pins(?:-Report-Only)?/.source),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:e.languages.hpkp},{pattern:t(/Strict-Transport-Security/.source),lookbehind:!0,alias:["hsts","languages-hsts"],inside:e.languages.hsts},{pattern:t(/[^:]+/.source),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var n,a=e.languages,r={"application/javascript":a.javascript,"application/json":a.json||a.javascript,"application/xml":a.xml,"text/xml":a.xml,"text/html":a.html,"text/css":a.css,"text/plain":a.plain},i={"application/json":!0,"application/xml":!0};function o(e){var t=e.replace(/^[a-z]+\//,"");return"(?:"+e+"|"+("\\w+/(?:[\\w.-]+\\+)+"+t+"(?![+\\w.-])")+")"}for(var l in r)if(r[l]){n=n||{};var s=i[l]?o(l):l;n[l.replace(/\//g,"-")]={pattern:RegExp("("+/content-type:\s*/.source+s+/(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source+")"+/[^ \t\w-][\s\S]*/.source,"i"),lookbehind:!0,inside:r[l]}}n&&e.languages.insertBefore("http","header",n)}(Prism)},574:function(e,t){Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}},575:function(e,t){!function(e){var t=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};t.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:t},boolean:t.boolean,variable:t.variable}}(Prism)},576:function(e,t){!function(e){var t=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:t}},builtin:t,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism)},577:function(e,t){!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},578:function(e,t){!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},579:function(e,t){!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,a={pattern:RegExp(n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(n+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},580:function(e,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},581:function(e,t){!function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,r=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,i=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:r,punctuation:i};var o={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},l=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:o}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:o}}];e.languages.insertBefore("php","variable",{string:l,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:l,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:a,operator:r,punctuation:i}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){if(/<\?/.test(t.code)){e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(Prism)},582:function(e,t){!function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,a="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",r=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),i=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function o(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return a})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return a}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return a})).replace(/<>/g,(function(){return"(?:"+r+"|"+i+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:o(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:o(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:o(i),lookbehind:!0,greedy:!0},number:{pattern:o(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism)},583:function(e,t){e.exports={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]}},603:function(e,t,n){"use strict";n.d(t,"b",(function(){return o}));var a=n(53),r={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","at-rule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},i=n(0),o={Prism:a.a,theme:r};function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(){return(s=Object.assign||function(e){for(var t=1;t0&&e[n-1]===t?e:e.concat(t)},p=function(e,t){var n=e.plain,a=Object.create(null),r=e.styles.reduce((function(e,n){var a=n.languages,r=n.style;return a&&!a.includes(t)||n.types.forEach((function(t){var n=s({},e[t],r);e[t]=n})),e}),a);return r.root=n,r.plain=s({},n,{backgroundColor:null}),r};function m(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&-1===t.indexOf(a)&&(n[a]=e[a]);return n}var f=function(e){function t(){for(var t=this,n=[],a=arguments.length;a--;)n[a]=arguments[a];e.apply(this,n),l(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?p(e.theme,e.language):void 0;return t.themeDict=n})),l(this,"getLineProps",(function(e){var n=e.key,a=e.className,r=e.style,i=s({},m(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),o=t.getThemeDict(t.props);return void 0!==o&&(i.style=o.plain),void 0!==r&&(i.style=void 0!==i.style?s({},i.style,r):r),void 0!==n&&(i.key=n),a&&(i.className+=" "+a),i})),l(this,"getStyleForToken",(function(e){var n=e.types,a=e.empty,r=n.length,i=t.getThemeDict(t.props);if(void 0!==i){if(1===r&&"plain"===n[0])return a?{display:"inline-block"}:void 0;if(1===r&&!a)return i[n[0]];var o=a?{display:"inline-block"}:{},l=n.map((function(e){return i[e]}));return Object.assign.apply(Object,[o].concat(l))}})),l(this,"getTokenProps",(function(e){var n=e.key,a=e.className,r=e.style,i=e.token,o=s({},m(e,["key","className","style","token"]),{className:"token "+i.types.join(" "),children:i.content,style:t.getStyleForToken(i),key:void 0});return void 0!==r&&(o.style=void 0!==o.style?s({},o.style,r):r),void 0!==n&&(o.key=n),a&&(o.className+=" "+a),o}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,a=e.code,r=e.children,i=this.getThemeDict(this.props),o=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],a=[0],r=[e.length],i=0,o=0,l=[],s=[l];o>-1;){for(;(i=a[o]++)0?m:["plain"],p=f):(m=d(m,f.type),f.alias&&(m=d(m,f.alias)),p=f.content),"string"==typeof p){var b=p.split(c),g=b.length;l.push({types:m,content:b[0]});for(var h=1;h/":G?V="/guides/integrate/sources/"+G.name+"//":H&&(V="/guides/integrate/sinks//");var K=H?"/guides/integrate/sources//"+H.name+"/":"/guides/integrate/sources//",Z=Object(u.useState)(!1),J=Z[0],Y=Z[1],X=Object(u.useState)(!1),Q=X[0],ee=X[1];return Object(O.a)("contents__link","contents__link--active",100),r.a.createElement(l.a,{title:v,description:v+", in minutes, for free"},J&&r.a.createElement(p.a,{className:"modal",onRequestClose:function(){return Y(!1)},overlayClassName:"modal-overlay",isOpen:null!==J,contentLabel:"Minimal Modal Example"},r.a.createElement("header",null,r.a.createElement("h1",null,"Where do you receive your data from?")),r.a.createElement(_.a,{exceptFunctions:["test"],exceptNames:[G&&G.name,"docker","qovery"],eventTypes:H&&H.event_types,pathTemplate:K,titles:!1,sources:!0,transforms:!1,sinks:!1})),Q&&r.a.createElement(p.a,{className:"modal",onRequestClose:function(){return ee(!1)},overlayClassName:"modal-overlay",isOpen:null!==Q,contentLabel:"Minimal Modal Example"},r.a.createElement("header",null,r.a.createElement("h1",null,"Where do you want to send your data?")),r.a.createElement(_.a,{exceptFunctions:["test"],exceptNames:[H&&H.name,"qovery"],eventTypes:G&&G.event_types,pathTemplate:V,titles:!1,sources:!1,transforms:!1,sinks:!0})),r.a.createElement("header",{className:"hero domain-bg domain-bg--"+M},r.a.createElement("div",{className:"container"},(z||G||H)&&r.a.createElement("div",{className:"component-icons"},z&&r.a.createElement("div",{className:"icon panel"},z.logo_path?r.a.createElement(g.a,{src:z.logo_path,alt:z.title+" Logo"}):r.a.createElement("i",{className:"feather icon-server"})),G&&!z&&r.a.createElement("div",{className:"icon panel link",title:"Change your source",onClick:function(e){return Y(!0)}},G.logo_path?r.a.createElement(g.a,{src:G.logo_path,alt:G.title+" Logo"}):r.a.createElement("i",{className:"feather icon-server"})),!G&&!z&&r.a.createElement("div",{className:"icon panel link",title:"Select a source",onClick:function(e){return Y(!0)}},r.a.createElement("i",{className:"feather icon-plus"})),H&&r.a.createElement("div",{className:"icon panel link",title:"Change your destination",onClick:function(e){return ee(!0)}},H.logo_path?r.a.createElement(g.a,{src:H.logo_path,alt:H.title+" Logo"}):r.a.createElement("i",{className:"feather icon-database"})),!H&&r.a.createElement("div",{className:"icon panel link",title:"Select a destination",onClick:function(e){return ee(!0)}},r.a.createElement("i",{className:"feather icon-plus"}))),!z&&!G&&!H&&r.a.createElement("div",{className:"hero--category"},r.a.createElement(f.a,{to:E[0].permalink+"/"},E[0].name)),r.a.createElement("h1",{className:C.a.header},v),r.a.createElement("div",{className:"hero--subtitle"},n.description),r.a.createElement(y.a,{colorProfile:"guides",tags:D}))),r.a.createElement("main",{className:d()("container","container--l",C.a.container)},r.a.createElement("aside",{className:C.a.sidebar},r.a.createElement("section",{className:C.a.avatar},r.a.createElement(i,{bio:!0,github:c,size:"lg",rel:"author",subTitle:!1,vertical:!0})),r.a.createElement("section",{className:d()("table-of-contents",C.a.tableOfContents)},r.a.createElement("div",{className:"section"},r.a.createElement("div",{className:"title"},"Stats"),r.a.createElement("div",{className:"text--secondary text--bold"},r.a.createElement("i",{className:"feather icon-book"})," ",w),r.a.createElement("div",{className:"text--secondary text--bold"},r.a.createElement("i",{className:"feather icon-clock"})," Updated ",r.a.createElement("time",{pubdate:"pubdate",dateTime:s},k()(R,"mmm dS, yyyy")))),t.rightToc.length>0&&r.a.createElement("div",{className:"section"},r.a.createElement("div",{className:"title"},"Contents"),r.a.createElement(I,{headings:t.rightToc})))),r.a.createElement("div",{className:C.a.article},r.a.createElement("article",null,r.a.createElement("div",{className:"markdown"},r.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"anchor",id:"overview"}),r.a.createElement(h.a,{components:m.a},r.a.createElement(t,null)))),!n.hide_pagination&&r.a.createElement(b.a,{previous:a.prevItem,next:a.nextItem,className:C.a.paginator}))))}},464:function(e,t,n){"use strict";n(466);var u=n(0),r=n.n(u),a=n(463),d=n.n(a);n(132);t.a=function(e){var t=e.children,n=e.classNames,u=e.fill,a=e.icon,o=e.type,i=null;switch(o){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return r.a.createElement("div",{className:d()(n,"alert","alert--"+o,{"alert--fill":u,"alert--icon":!1!==a}),role:"alert"},!1!==a&&r.a.createElement("i",{className:d()("feather","icon-"+(a||i))}),t)}},468:function(e,t,n){var u=n(28).f,r=Function.prototype,a=/^\s*function ([^ (]*)/;"name"in r||n(10)&&u(r,"name",{configurable:!0,get:function(){try{return(""+this).match(a)[1]}catch(e){return""}}})},473:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(470),d=n(463),o=n.n(d);n(134);t.a=function(e){var t=e.children,n=e.className,u=e.badge,d=e.leftIcon,i=e.rightIcon,c=e.size,l=e.target,f=e.to,s=o()("jump-to","jump-to--"+c,n),p=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},d&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+d})),r.a.createElement("div",{className:"jump-to--main"},u?r.a.createElement("span",{className:"badge badge--primary badge--right"},u):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(i||"chevron-right")+" arrow"}))));return l?r.a.createElement("a",{href:f,target:l,className:s},p):r.a.createElement(a.a,{to:f,className:s},p)}},477:function(e,t,n){"use strict";var u=n(1),r=(n(481),n(478),n(52),n(29),n(22),n(21),n(0)),a=n.n(r),d=n(483),o=n(463),i=n.n(o),c=n(471),l=n.n(c),f=n(482),s=37,p=39;function m(e){var t=e.block,n=e.centered,u=e.changeSelectedValue,r=e.className,d=e.handleKeydown,o=e.style,c=e.values,l=e.selectedValue,f=e.tabRefs;return a.a.createElement("div",{className:n?"tabs--centered":null},a.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",r,{"tabs--block":t}),style:o},c.map((function(e){var t=e.value,n=e.label;return a.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":l===t,className:i()("tab-item",{"tab-item--active":l===t}),key:t,ref:function(e){return f.push(e)},onKeyDown:function(e){return d(f,e.target,e)},onFocus:function(){return u(t)},onClick:function(){return u(t)}},n)}))))}function h(e){var t=e.placeholder,n=e.selectedValue,u=e.changeSelectedValue,r=e.size,o=e.values,i=o;if(i[0].group){var c=_.groupBy(i,"group");i=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return a.a.createElement(d.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:i,isClearable:n,placeholder:t,value:o.find((function(e){return e.value==n})),onChange:function(e){return u(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,d=e.groupId,o=e.label,i=e.placeholder,c=e.select,b=e.size,v=(e.style,e.values),g=e.urlKey,y=Object(f.a)(),_=y.tabGroupChoices,E=y.setTabGroupChoices,w=Object(r.useState)(n),D=w[0],k=w[1];if(null!=d){var x=_[d];null!=x&&x!==D&&k(x)}var S=function(e){k(e),null!=d&&E(d,e)},C=[],O=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case s:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=l.a.parse(window.location.search);e[g]&&k(e[g])}}),[]),a.a.createElement(a.a.Fragment,null,a.a.createElement("div",{className:"margin-bottom--"+(b||"md")},o&&a.a.createElement("div",{className:"margin-vert--sm"},o),v.length>1&&(c?a.a.createElement(h,Object(u.a)({changeSelectedValue:S,handleKeydown:O,placeholder:i,selectedValue:D,size:b,tabRefs:C},e)):a.a.createElement(m,Object(u.a)({changeSelectedValue:S,handleKeydown:O,selectedValue:D,tabRefs:C},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===D}))[0])}},479:function(e,t,n){"use strict";var u=n(0),r=n.n(u);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}},485:function(e,t,n){"use strict";var u=n(0),r=n(525);t.a=function(){return Object(u.useContext)(r.a)}},487:function(e,t,n){"use strict";n(497);var u=n(0),r=n.n(u),a=n(498),d=n(486),o=n(1),i=(n(488),n(489),n(499),n(470)),c=n(500),l=n(484),f=n.n(l),s=n(501),p=n.n(s),m=n(476),h=n(463),b=n.n(h),v=n(135),g=n.n(v),y=function(){return r.a.createElement("span",{className:b()(g.a.toggle,g.a.moon)})},_=function(){return r.a.createElement("span",{className:b()(g.a.toggle,g.a.sun)})},E=function(e){var t=Object(m.a)().isClient;return r.a.createElement(p.a,Object(o.a)({disabled:!t,icons:{checked:r.a.createElement(y,null),unchecked:r.a.createElement(_,null)}},e))};function w(){var e=Object(m.a)().siteConfig,t=(void 0===e?{}:e).customFields.metadata.latest_post,n=Date.parse(t.date),u=new Date,r=Math.abs(u-n),a=Math.ceil(r/864e5),d=null;return"undefined"!=typeof window&&(d=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),a<30&&(!d||d0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(f.a,{className:"navbar__logo",src:p,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),i.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(M,e))}))):null)}))),(l||d)&&r.a.createElement("div",{className:"text--center"},l&&l.src&&r.a.createElement("div",{className:"margin-bottom--sm"},l.href?r.a.createElement("a",{href:l.href,target:"_blank",rel:"noopener noreferrer",className:P.a.footerLogoLink},r.a.createElement(R,{alt:l.alt,url:s})):r.a.createElement(R,{alt:l.alt,url:s})),r.a.createElement("small",null,d),r.a.createElement("br",null))))},B=n(502),z=n(503),U=n(3);n(138);t.a=function(e){var t=Object(m.a)().siteConfig,n=void 0===t?{}:t,u=n.title,o=n.themeConfig.image,i=n.url,c=e.children,l=e.title,f=e.noFooter,s=e.description,p=e.image,h=e.keywords,b=e.version,v=l?l+" | "+u:u,g=p||o,y=i+Object(k.a)(g),_=Object(U.h)(),E=_?"https://docs.qovery.com"+(_.pathname.endsWith("/")?_.pathname:_.pathname+"/"):null;return r.a.createElement(z.a,null,r.a.createElement(B.a,null,r.a.createElement(d.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),v&&r.a.createElement("title",null,v),v&&r.a.createElement("meta",{property:"og:title",content:v}),r.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),r.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),r.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),r.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),r.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),r.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),s&&r.a.createElement("meta",{name:"description",content:s}),s&&r.a.createElement("meta",{property:"og:description",content:s}),b&&r.a.createElement("meta",{name:"docsearch:version",content:b}),h&&h.length&&r.a.createElement("meta",{name:"keywords",content:h.join(",")}),g&&r.a.createElement("meta",{property:"og:image",content:y}),g&&r.a.createElement("meta",{property:"twitter:image",content:y}),g&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+v}),E&&r.a.createElement("meta",{property:"og:url",content:E}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),E&&r.a.createElement("link",{rel:"canonical",href:E})),r.a.createElement(a.a,null),r.a.createElement(N,null),r.a.createElement("div",{className:"main-wrapper"},c),!f&&r.a.createElement(L,null)))}},490:function(e,t,n){"use strict";var u=n(9),r=n(0),a=n.n(r),d=n(463),o=n.n(d),i=n(476),c=(n(139),n(140)),l=n.n(c);t.a=function(e){return function(t){var n,r=t.id,d=Object(u.a)(t,["id"]),c=Object(i.a)().siteConfig,f=(c=void 0===c?{}:c).themeConfig,s=(f=void 0===f?{}:f).navbar,p=(s=void 0===s?{}:s).hideOnScroll,m=void 0!==p&&p;return r?a.a.createElement(e,d,a.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:o()("anchor",(n={},n[l.a.enhancedAnchor]=!m,n)),id:r}),a.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),d.children):a.a.createElement(e,d)}}},491:function(e,t,n){(function(e,u){var r;(function(){var a="Expected a function",d="__lodash_placeholder__",o=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],i="[object Arguments]",c="[object Array]",l="[object Boolean]",f="[object Date]",s="[object Error]",p="[object Function]",m="[object GeneratorFunction]",h="[object Map]",b="[object Number]",v="[object Object]",g="[object RegExp]",y="[object Set]",_="[object String]",E="[object Symbol]",w="[object WeakMap]",D="[object ArrayBuffer]",k="[object DataView]",x="[object Float32Array]",S="[object Float64Array]",C="[object Int8Array]",O="[object Int16Array]",I="[object Int32Array]",A="[object Uint8Array]",j="[object Uint16Array]",N="[object Uint32Array]",F=/\b__p \+= '';/g,T=/\b(__p \+=) '' \+/g,P=/(__e\(.*?\)|\b__t\)) \+\n'';/g,M=/&(?:amp|lt|gt|quot|#39);/g,R=/[&<>"']/g,L=RegExp(M.source),B=RegExp(R.source),z=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,W=/<%=([\s\S]+?)%>/g,H=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,$=/^\w*$/,q=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,G=/[\\^$.*+?()[\]{}|]/g,V=RegExp(G.source),K=/^\s+|\s+$/g,Z=/^\s+/,J=/\s+$/,Y=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,X=/\{\n\/\* \[wrapped with (.+)\] \*/,Q=/,? & /,ee=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,te=/\\(\\)?/g,ne=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ue=/\w*$/,re=/^[-+]0x[0-9a-f]+$/i,ae=/^0b[01]+$/i,de=/^\[object .+?Constructor\]$/,oe=/^0o[0-7]+$/i,ie=/^(?:0|[1-9]\d*)$/,ce=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,le=/($^)/,fe=/['\n\r\u2028\u2029\\]/g,se="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",pe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",me="[\\ud800-\\udfff]",he="["+pe+"]",be="["+se+"]",ve="\\d+",ge="[\\u2700-\\u27bf]",ye="[a-z\\xdf-\\xf6\\xf8-\\xff]",_e="[^\\ud800-\\udfff"+pe+ve+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",Ee="\\ud83c[\\udffb-\\udfff]",we="[^\\ud800-\\udfff]",De="(?:\\ud83c[\\udde6-\\uddff]){2}",ke="[\\ud800-\\udbff][\\udc00-\\udfff]",xe="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Se="(?:"+ye+"|"+_e+")",Ce="(?:"+xe+"|"+_e+")",Oe="(?:"+be+"|"+Ee+")"+"?",Ie="[\\ufe0e\\ufe0f]?"+Oe+("(?:\\u200d(?:"+[we,De,ke].join("|")+")[\\ufe0e\\ufe0f]?"+Oe+")*"),Ae="(?:"+[ge,De,ke].join("|")+")"+Ie,je="(?:"+[we+be+"?",be,De,ke,me].join("|")+")",Ne=RegExp("['\u2019]","g"),Fe=RegExp(be,"g"),Te=RegExp(Ee+"(?="+Ee+")|"+je+Ie,"g"),Pe=RegExp([xe+"?"+ye+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[he,xe,"$"].join("|")+")",Ce+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[he,xe+Se,"$"].join("|")+")",xe+"?"+Se+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",xe+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ve,Ae].join("|"),"g"),Me=RegExp("[\\u200d\\ud800-\\udfff"+se+"\\ufe0e\\ufe0f]"),Re=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Le=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Be=-1,ze={};ze[x]=ze[S]=ze[C]=ze[O]=ze[I]=ze[A]=ze["[object Uint8ClampedArray]"]=ze[j]=ze[N]=!0,ze[i]=ze[c]=ze[D]=ze[l]=ze[k]=ze[f]=ze[s]=ze[p]=ze[h]=ze[b]=ze[v]=ze[g]=ze[y]=ze[_]=ze[w]=!1;var Ue={};Ue[i]=Ue[c]=Ue[D]=Ue[k]=Ue[l]=Ue[f]=Ue[x]=Ue[S]=Ue[C]=Ue[O]=Ue[I]=Ue[h]=Ue[b]=Ue[v]=Ue[g]=Ue[y]=Ue[_]=Ue[E]=Ue[A]=Ue["[object Uint8ClampedArray]"]=Ue[j]=Ue[N]=!0,Ue[s]=Ue[p]=Ue[w]=!1;var We={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},He=parseFloat,$e=parseInt,qe="object"==typeof e&&e&&e.Object===Object&&e,Ge="object"==typeof self&&self&&self.Object===Object&&self,Ve=qe||Ge||Function("return this")(),Ke=t&&!t.nodeType&&t,Ze=Ke&&"object"==typeof u&&u&&!u.nodeType&&u,Je=Ze&&Ze.exports===Ke,Ye=Je&&qe.process,Xe=function(){try{var e=Ze&&Ze.require&&Ze.require("util").types;return e||Ye&&Ye.binding&&Ye.binding("util")}catch(t){}}(),Qe=Xe&&Xe.isArrayBuffer,et=Xe&&Xe.isDate,tt=Xe&&Xe.isMap,nt=Xe&&Xe.isRegExp,ut=Xe&&Xe.isSet,rt=Xe&&Xe.isTypedArray;function at(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function dt(e,t,n,u){for(var r=-1,a=null==e?0:e.length;++r-1}function st(e,t,n){for(var u=-1,r=null==e?0:e.length;++u-1;);return n}function Tt(e,t){for(var n=e.length;n--&&Et(t,e[n],0)>-1;);return n}function Pt(e,t){for(var n=e.length,u=0;n--;)e[n]===t&&++u;return u}var Mt=St({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Rt=St({"&":"&","<":"<",">":">",'"':""","'":"'"});function Lt(e){return"\\"+We[e]}function Bt(e){return Me.test(e)}function zt(e){var t=-1,n=Array(e.size);return e.forEach((function(e,u){n[++t]=[u,e]})),n}function Ut(e,t){return function(n){return e(t(n))}}function Wt(e,t){for(var n=-1,u=e.length,r=0,a=[];++n",""":'"',"'":"'"});var Kt=function e(t){var n,u=(t=null==t?Ve:Kt.defaults(Ve.Object(),t,Kt.pick(Ve,Le))).Array,r=t.Date,se=t.Error,pe=t.Function,me=t.Math,he=t.Object,be=t.RegExp,ve=t.String,ge=t.TypeError,ye=u.prototype,_e=pe.prototype,Ee=he.prototype,we=t["__core-js_shared__"],De=_e.toString,ke=Ee.hasOwnProperty,xe=0,Se=(n=/[^.]+$/.exec(we&&we.keys&&we.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",Ce=Ee.toString,Oe=De.call(he),Ie=Ve._,Ae=be("^"+De.call(ke).replace(G,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),je=Je?t.Buffer:void 0,Te=t.Symbol,Me=t.Uint8Array,We=je?je.allocUnsafe:void 0,qe=Ut(he.getPrototypeOf,he),Ge=he.create,Ke=Ee.propertyIsEnumerable,Ze=ye.splice,Ye=Te?Te.isConcatSpreadable:void 0,Xe=Te?Te.iterator:void 0,gt=Te?Te.toStringTag:void 0,St=function(){try{var e=Qr(he,"defineProperty");return e({},"",{}),e}catch(t){}}(),Zt=t.clearTimeout!==Ve.clearTimeout&&t.clearTimeout,Jt=r&&r.now!==Ve.Date.now&&r.now,Yt=t.setTimeout!==Ve.setTimeout&&t.setTimeout,Xt=me.ceil,Qt=me.floor,en=he.getOwnPropertySymbols,tn=je?je.isBuffer:void 0,nn=t.isFinite,un=ye.join,rn=Ut(he.keys,he),an=me.max,dn=me.min,on=r.now,cn=t.parseInt,ln=me.random,fn=ye.reverse,sn=Qr(t,"DataView"),pn=Qr(t,"Map"),mn=Qr(t,"Promise"),hn=Qr(t,"Set"),bn=Qr(t,"WeakMap"),vn=Qr(he,"create"),gn=bn&&new bn,yn={},_n=Sa(sn),En=Sa(pn),wn=Sa(mn),Dn=Sa(hn),kn=Sa(bn),xn=Te?Te.prototype:void 0,Sn=xn?xn.valueOf:void 0,Cn=xn?xn.toString:void 0;function On(e){if(Hd(e)&&!Nd(e)&&!(e instanceof Nn)){if(e instanceof jn)return e;if(ke.call(e,"__wrapped__"))return Ca(e)}return new jn(e)}var In=function(){function e(){}return function(t){if(!Wd(t))return{};if(Ge)return Ge(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();function An(){}function jn(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Nn(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Fn(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t=t?e:t)),e}function Jn(e,t,n,u,r,a){var d,o=1&t,c=2&t,s=4&t;if(n&&(d=r?n(e,u,r,a):n(e)),void 0!==d)return d;if(!Wd(e))return e;var w=Nd(e);if(w){if(d=function(e){var t=e.length,n=new e.constructor(t);t&&"string"==typeof e[0]&&ke.call(e,"index")&&(n.index=e.index,n.input=e.input);return n}(e),!o)return vr(e,d)}else{var F=na(e),T=F==p||F==m;if(Md(e))return fr(e,o);if(F==v||F==i||T&&!r){if(d=c||T?{}:ra(e),!o)return c?function(e,t){return gr(e,ta(e),t)}(e,function(e,t){return e&&gr(t,Eo(t),e)}(d,e)):function(e,t){return gr(e,ea(e),t)}(e,Gn(d,e))}else{if(!Ue[F])return r?e:{};d=function(e,t,n){var u=e.constructor;switch(t){case D:return sr(e);case l:case f:return new u(+e);case k:return function(e,t){var n=t?sr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}(e,n);case x:case S:case C:case O:case I:case A:case"[object Uint8ClampedArray]":case j:case N:return pr(e,n);case h:return new u;case b:case _:return new u(e);case g:return function(e){var t=new e.constructor(e.source,ue.exec(e));return t.lastIndex=e.lastIndex,t}(e);case y:return new u;case E:return r=e,Sn?he(Sn.call(r)):{}}var r}(e,F,o)}}a||(a=new Rn);var P=a.get(e);if(P)return P;a.set(e,d),Kd(e)?e.forEach((function(u){d.add(Jn(u,t,n,u,e,a))})):$d(e)&&e.forEach((function(u,r){d.set(r,Jn(u,t,n,r,e,a))}));var M=w?void 0:(s?c?Gr:qr:c?Eo:_o)(e);return ot(M||e,(function(u,r){M&&(u=e[r=u]),Hn(d,r,Jn(u,t,n,r,e,a))})),d}function Yn(e,t,n){var u=n.length;if(null==e)return!u;for(e=he(e);u--;){var r=n[u],a=t[r],d=e[r];if(void 0===d&&!(r in e)||!a(d))return!1}return!0}function Xn(e,t,n){if("function"!=typeof e)throw new ge(a);return ya((function(){e.apply(void 0,n)}),t)}function Qn(e,t,n,u){var r=-1,a=ft,d=!0,o=e.length,i=[],c=t.length;if(!o)return i;n&&(t=pt(t,At(n))),u?(a=st,d=!1):t.length>=200&&(a=Nt,d=!1,t=new Mn(t));e:for(;++r-1},Tn.prototype.set=function(e,t){var n=this.__data__,u=$n(n,e);return u<0?(++this.size,n.push([e,t])):n[u][1]=t,this},Pn.prototype.clear=function(){this.size=0,this.__data__={hash:new Fn,map:new(pn||Tn),string:new Fn}},Pn.prototype.delete=function(e){var t=Yr(this,e).delete(e);return this.size-=t?1:0,t},Pn.prototype.get=function(e){return Yr(this,e).get(e)},Pn.prototype.has=function(e){return Yr(this,e).has(e)},Pn.prototype.set=function(e,t){var n=Yr(this,e),u=n.size;return n.set(e,t),this.size+=n.size==u?0:1,this},Mn.prototype.add=Mn.prototype.push=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},Mn.prototype.has=function(e){return this.__data__.has(e)},Rn.prototype.clear=function(){this.__data__=new Tn,this.size=0},Rn.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},Rn.prototype.get=function(e){return this.__data__.get(e)},Rn.prototype.has=function(e){return this.__data__.has(e)},Rn.prototype.set=function(e,t){var n=this.__data__;if(n instanceof Tn){var u=n.__data__;if(!pn||u.length<199)return u.push([e,t]),this.size=++n.size,this;n=this.__data__=new Pn(u)}return n.set(e,t),this.size=n.size,this};var eu=Er(iu),tu=Er(cu,!0);function nu(e,t){var n=!0;return eu(e,(function(e,u,r){return n=!!t(e,u,r)})),n}function uu(e,t,n){for(var u=-1,r=e.length;++u0&&n(o)?t>1?au(o,t-1,n,u,r):mt(r,o):u||(r[r.length]=o)}return r}var du=wr(),ou=wr(!0);function iu(e,t){return e&&du(e,t,_o)}function cu(e,t){return e&&ou(e,t,_o)}function lu(e,t){return lt(t,(function(t){return Bd(e[t])}))}function fu(e,t){for(var n=0,u=(t=or(t,e)).length;null!=e&&nt}function hu(e,t){return null!=e&&ke.call(e,t)}function bu(e,t){return null!=e&&t in he(e)}function vu(e,t,n){for(var r=n?st:ft,a=e[0].length,d=e.length,o=d,i=u(d),c=1/0,l=[];o--;){var f=e[o];o&&t&&(f=pt(f,At(t))),c=dn(f.length,c),i[o]=!n&&(t||a>=120&&f.length>=120)?new Mn(o&&f):void 0}f=e[0];var s=-1,p=i[0];e:for(;++s=o)return i;var c=n[u];return i*("desc"==c?-1:1)}}return e.index-t.index}(e,t,n)}))}function Fu(e,t,n){for(var u=-1,r=t.length,a={};++u-1;)o!==e&&Ze.call(o,i,1),Ze.call(e,i,1);return e}function Pu(e,t){for(var n=e?t.length:0,u=n-1;n--;){var r=t[n];if(n==u||r!==a){var a=r;da(r)?Ze.call(e,r,1):Qu(e,r)}}return e}function Mu(e,t){return e+Qt(ln()*(t-e+1))}function Ru(e,t){var n="";if(!e||t<1||t>9007199254740991)return n;do{t%2&&(n+=e),(t=Qt(t/2))&&(e+=e)}while(t);return n}function Lu(e,t){return _a(ma(e,t,Go),e+"")}function Bu(e){return Bn(Io(e))}function zu(e,t){var n=Io(e);return Da(n,Zn(t,0,n.length))}function Uu(e,t,n,u){if(!Wd(e))return e;for(var r=-1,a=(t=or(t,e)).length,d=a-1,o=e;null!=o&&++ra?0:a+t),(n=n>a?a:n)<0&&(n+=a),a=t>n?0:n-t>>>0,t>>>=0;for(var d=u(a);++r>>1,d=e[a];null!==d&&!Jd(d)&&(n?d<=t:d=200){var c=t?null:Rr(e);if(c)return Ht(c);d=!1,r=Nt,i=new Mn}else i=t?[]:o;e:for(;++u=u?e:qu(e,t,n)}var lr=Zt||function(e){return Ve.clearTimeout(e)};function fr(e,t){if(t)return e.slice();var n=e.length,u=We?We(n):new e.constructor(n);return e.copy(u),u}function sr(e){var t=new e.constructor(e.byteLength);return new Me(t).set(new Me(e)),t}function pr(e,t){var n=t?sr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}function mr(e,t){if(e!==t){var n=void 0!==e,u=null===e,r=e==e,a=Jd(e),d=void 0!==t,o=null===t,i=t==t,c=Jd(t);if(!o&&!c&&!a&&e>t||a&&d&&i&&!o&&!c||u&&d&&i||!n&&i||!r)return 1;if(!u&&!a&&!c&&e1?n[r-1]:void 0,d=r>2?n[2]:void 0;for(a=e.length>3&&"function"==typeof a?(r--,a):void 0,d&&oa(n[0],n[1],d)&&(a=r<3?void 0:a,r=1),t=he(t);++u-1?r[a?t[d]:d]:void 0}}function Cr(e){return $r((function(t){var n=t.length,u=n,r=jn.prototype.thru;for(e&&t.reverse();u--;){var d=t[u];if("function"!=typeof d)throw new ge(a);if(r&&!o&&"wrapper"==Kr(d))var o=new jn([],!0)}for(u=o?u:n;++u1&&y.reverse(),f&&co))return!1;var c=a.get(e);if(c&&a.get(t))return c==t;var l=-1,f=!0,s=2&n?new Mn:void 0;for(a.set(e,t),a.set(t,e);++l-1&&e%1==0&&e1?"& ":"")+t[u],t=t.join(n>2?", ":" "),e.replace(Y,"{\n/* [wrapped with "+t+"] */\n")}(u,function(e,t){return ot(o,(function(n){var u="_."+n[0];t&n[1]&&!ft(e,u)&&e.push(u)})),e.sort()}(function(e){var t=e.match(X);return t?t[1].split(Q):[]}(u),n)))}function wa(e){var t=0,n=0;return function(){var u=on(),r=16-(u-n);if(n=u,r>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function Da(e,t){var n=-1,u=e.length,r=u-1;for(t=void 0===t?u:t;++n1?e[t-1]:void 0;return n="function"==typeof n?(e.pop(),n):void 0,Va(e,n)}));function ed(e){var t=On(e);return t.__chain__=!0,t}function td(e,t){return t(e)}var nd=$r((function(e){var t=e.length,n=t?e[0]:0,u=this.__wrapped__,r=function(t){return Kn(t,e)};return!(t>1||this.__actions__.length)&&u instanceof Nn&&da(n)?((u=u.slice(n,+n+(t?1:0))).__actions__.push({func:td,args:[r],thisArg:void 0}),new jn(u,this.__chain__).thru((function(e){return t&&!e.length&&e.push(void 0),e}))):this.thru(r)}));var ud=yr((function(e,t,n){ke.call(e,n)?++e[n]:Vn(e,n,1)}));var rd=Sr(ja),ad=Sr(Na);function dd(e,t){return(Nd(e)?ot:eu)(e,Jr(t,3))}function od(e,t){return(Nd(e)?it:tu)(e,Jr(t,3))}var id=yr((function(e,t,n){ke.call(e,n)?e[n].push(t):Vn(e,n,[t])}));var cd=Lu((function(e,t,n){var r=-1,a="function"==typeof t,d=Td(e)?u(e.length):[];return eu(e,(function(e){d[++r]=a?at(t,e,n):gu(e,t,n)})),d})),ld=yr((function(e,t,n){Vn(e,n,t)}));function fd(e,t){return(Nd(e)?pt:Cu)(e,Jr(t,3))}var sd=yr((function(e,t,n){e[n?0:1].push(t)}),(function(){return[[],[]]}));var pd=Lu((function(e,t){if(null==e)return[];var n=t.length;return n>1&&oa(e,t[0],t[1])?t=[]:n>2&&oa(t[0],t[1],t[2])&&(t=[t[0]]),Nu(e,au(t,1),[])})),md=Jt||function(){return Ve.Date.now()};function hd(e,t,n){return t=n?void 0:t,Br(e,128,void 0,void 0,void 0,void 0,t=e&&null==t?e.length:t)}function bd(e,t){var n;if("function"!=typeof t)throw new ge(a);return e=no(e),function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=void 0),n}}var vd=Lu((function(e,t,n){var u=1;if(n.length){var r=Wt(n,Zr(vd));u|=32}return Br(e,u,t,n,r)})),gd=Lu((function(e,t,n){var u=3;if(n.length){var r=Wt(n,Zr(gd));u|=32}return Br(t,u,e,n,r)}));function yd(e,t,n){var u,r,d,o,i,c,l=0,f=!1,s=!1,p=!0;if("function"!=typeof e)throw new ge(a);function m(t){var n=u,a=r;return u=r=void 0,l=t,o=e.apply(a,n)}function h(e){return l=e,i=ya(v,t),f?m(e):o}function b(e){var n=e-c;return void 0===c||n>=t||n<0||s&&e-l>=d}function v(){var e=md();if(b(e))return g(e);i=ya(v,function(e){var n=t-(e-c);return s?dn(n,d-(e-l)):n}(e))}function g(e){return i=void 0,p&&u?m(e):(u=r=void 0,o)}function y(){var e=md(),n=b(e);if(u=arguments,r=this,c=e,n){if(void 0===i)return h(c);if(s)return lr(i),i=ya(v,t),m(c)}return void 0===i&&(i=ya(v,t)),o}return t=ro(t)||0,Wd(n)&&(f=!!n.leading,d=(s="maxWait"in n)?an(ro(n.maxWait)||0,t):d,p="trailing"in n?!!n.trailing:p),y.cancel=function(){void 0!==i&&lr(i),l=0,u=c=r=i=void 0},y.flush=function(){return void 0===i?o:g(md())},y}var _d=Lu((function(e,t){return Xn(e,1,t)})),Ed=Lu((function(e,t,n){return Xn(e,ro(t)||0,n)}));function wd(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new ge(a);var n=function(){var u=arguments,r=t?t.apply(this,u):u[0],a=n.cache;if(a.has(r))return a.get(r);var d=e.apply(this,u);return n.cache=a.set(r,d)||a,d};return n.cache=new(wd.Cache||Pn),n}function Dd(e){if("function"!=typeof e)throw new ge(a);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}wd.Cache=Pn;var kd=ir((function(e,t){var n=(t=1==t.length&&Nd(t[0])?pt(t[0],At(Jr())):pt(au(t,1),At(Jr()))).length;return Lu((function(u){for(var r=-1,a=dn(u.length,n);++r=t})),jd=yu(function(){return arguments}())?yu:function(e){return Hd(e)&&ke.call(e,"callee")&&!Ke.call(e,"callee")},Nd=u.isArray,Fd=Qe?At(Qe):function(e){return Hd(e)&&pu(e)==D};function Td(e){return null!=e&&Ud(e.length)&&!Bd(e)}function Pd(e){return Hd(e)&&Td(e)}var Md=tn||ai,Rd=et?At(et):function(e){return Hd(e)&&pu(e)==f};function Ld(e){if(!Hd(e))return!1;var t=pu(e);return t==s||"[object DOMException]"==t||"string"==typeof e.message&&"string"==typeof e.name&&!Gd(e)}function Bd(e){if(!Wd(e))return!1;var t=pu(e);return t==p||t==m||"[object AsyncFunction]"==t||"[object Proxy]"==t}function zd(e){return"number"==typeof e&&e==no(e)}function Ud(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}function Wd(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function Hd(e){return null!=e&&"object"==typeof e}var $d=tt?At(tt):function(e){return Hd(e)&&na(e)==h};function qd(e){return"number"==typeof e||Hd(e)&&pu(e)==b}function Gd(e){if(!Hd(e)||pu(e)!=v)return!1;var t=qe(e);if(null===t)return!0;var n=ke.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&De.call(n)==Oe}var Vd=nt?At(nt):function(e){return Hd(e)&&pu(e)==g};var Kd=ut?At(ut):function(e){return Hd(e)&&na(e)==y};function Zd(e){return"string"==typeof e||!Nd(e)&&Hd(e)&&pu(e)==_}function Jd(e){return"symbol"==typeof e||Hd(e)&&pu(e)==E}var Yd=rt?At(rt):function(e){return Hd(e)&&Ud(e.length)&&!!ze[pu(e)]};var Xd=Tr(Su),Qd=Tr((function(e,t){return e<=t}));function eo(e){if(!e)return[];if(Td(e))return Zd(e)?Gt(e):vr(e);if(Xe&&e[Xe])return function(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}(e[Xe]());var t=na(e);return(t==h?zt:t==y?Ht:Io)(e)}function to(e){return e?(e=ro(e))===1/0||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function no(e){var t=to(e),n=t%1;return t==t?n?t-n:t:0}function uo(e){return e?Zn(no(e),0,4294967295):0}function ro(e){if("number"==typeof e)return e;if(Jd(e))return NaN;if(Wd(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Wd(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(K,"");var n=ae.test(e);return n||oe.test(e)?$e(e.slice(2),n?2:8):re.test(e)?NaN:+e}function ao(e){return gr(e,Eo(e))}function oo(e){return null==e?"":Yu(e)}var io=_r((function(e,t){if(fa(t)||Td(t))gr(t,_o(t),e);else for(var n in t)ke.call(t,n)&&Hn(e,n,t[n])})),co=_r((function(e,t){gr(t,Eo(t),e)})),lo=_r((function(e,t,n,u){gr(t,Eo(t),e,u)})),fo=_r((function(e,t,n,u){gr(t,_o(t),e,u)})),so=$r(Kn);var po=Lu((function(e,t){e=he(e);var n=-1,u=t.length,r=u>2?t[2]:void 0;for(r&&oa(t[0],t[1],r)&&(u=1);++n1),t})),gr(e,Gr(e),n),u&&(n=Jn(n,7,Wr));for(var r=t.length;r--;)Qu(n,t[r]);return n}));var xo=$r((function(e,t){return null==e?{}:function(e,t){return Fu(e,t,(function(t,n){return bo(e,n)}))}(e,t)}));function So(e,t){if(null==e)return{};var n=pt(Gr(e),(function(e){return[e]}));return t=Jr(t),Fu(e,n,(function(e,n){return t(e,n[0])}))}var Co=Lr(_o),Oo=Lr(Eo);function Io(e){return null==e?[]:jt(e,_o(e))}var Ao=kr((function(e,t,n){return t=t.toLowerCase(),e+(n?jo(t):t)}));function jo(e){return Bo(oo(e).toLowerCase())}function No(e){return(e=oo(e))&&e.replace(ce,Mt).replace(Fe,"")}var Fo=kr((function(e,t,n){return e+(n?"-":"")+t.toLowerCase()})),To=kr((function(e,t,n){return e+(n?" ":"")+t.toLowerCase()})),Po=Dr("toLowerCase");var Mo=kr((function(e,t,n){return e+(n?"_":"")+t.toLowerCase()}));var Ro=kr((function(e,t,n){return e+(n?" ":"")+Bo(t)}));var Lo=kr((function(e,t,n){return e+(n?" ":"")+t.toUpperCase()})),Bo=Dr("toUpperCase");function zo(e,t,n){return e=oo(e),void 0===(t=n?void 0:t)?function(e){return Re.test(e)}(e)?function(e){return e.match(Pe)||[]}(e):function(e){return e.match(ee)||[]}(e):e.match(t)||[]}var Uo=Lu((function(e,t){try{return at(e,void 0,t)}catch(n){return Ld(n)?n:new se(n)}})),Wo=$r((function(e,t){return ot(t,(function(t){t=xa(t),Vn(e,t,vd(e[t],e))})),e}));function Ho(e){return function(){return e}}var $o=Cr(),qo=Cr(!0);function Go(e){return e}function Vo(e){return Du("function"==typeof e?e:Jn(e,1))}var Ko=Lu((function(e,t){return function(n){return gu(n,e,t)}})),Zo=Lu((function(e,t){return function(n){return gu(e,n,t)}}));function Jo(e,t,n){var u=_o(t),r=lu(t,u);null!=n||Wd(t)&&(r.length||!u.length)||(n=t,t=e,e=this,r=lu(t,_o(t)));var a=!(Wd(n)&&"chain"in n&&!n.chain),d=Bd(e);return ot(r,(function(n){var u=t[n];e[n]=u,d&&(e.prototype[n]=function(){var t=this.__chain__;if(a||t){var n=e(this.__wrapped__),r=n.__actions__=vr(this.__actions__);return r.push({func:u,args:arguments,thisArg:e}),n.__chain__=t,n}return u.apply(e,mt([this.value()],arguments))})})),e}function Yo(){}var Xo=jr(pt),Qo=jr(ct),ei=jr(vt);function ti(e){return ia(e)?xt(xa(e)):function(e){return function(t){return fu(t,e)}}(e)}var ni=Fr(),ui=Fr(!0);function ri(){return[]}function ai(){return!1}var di=Ar((function(e,t){return e+t}),0),oi=Mr("ceil"),ii=Ar((function(e,t){return e/t}),1),ci=Mr("floor");var li,fi=Ar((function(e,t){return e*t}),1),si=Mr("round"),pi=Ar((function(e,t){return e-t}),0);return On.after=function(e,t){if("function"!=typeof t)throw new ge(a);return e=no(e),function(){if(--e<1)return t.apply(this,arguments)}},On.ary=hd,On.assign=io,On.assignIn=co,On.assignInWith=lo,On.assignWith=fo,On.at=so,On.before=bd,On.bind=vd,On.bindAll=Wo,On.bindKey=gd,On.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return Nd(e)?e:[e]},On.chain=ed,On.chunk=function(e,t,n){t=(n?oa(e,t,n):void 0===t)?1:an(no(t),0);var r=null==e?0:e.length;if(!r||t<1)return[];for(var a=0,d=0,o=u(Xt(r/t));ar?0:r+n),(u=void 0===u||u>r?r:no(u))<0&&(u+=r),u=n>u?0:uo(u);n>>0)?(e=oo(e))&&("string"==typeof t||null!=t&&!Vd(t))&&!(t=Yu(t))&&Bt(e)?cr(Gt(e),0,n):e.split(t,n):[]},On.spread=function(e,t){if("function"!=typeof e)throw new ge(a);return t=null==t?0:an(no(t),0),Lu((function(n){var u=n[t],r=cr(n,0,t);return u&&mt(r,u),at(e,this,r)}))},On.tail=function(e){var t=null==e?0:e.length;return t?qu(e,1,t):[]},On.take=function(e,t,n){return e&&e.length?qu(e,0,(t=n||void 0===t?1:no(t))<0?0:t):[]},On.takeRight=function(e,t,n){var u=null==e?0:e.length;return u?qu(e,(t=u-(t=n||void 0===t?1:no(t)))<0?0:t,u):[]},On.takeRightWhile=function(e,t){return e&&e.length?tr(e,Jr(t,3),!1,!0):[]},On.takeWhile=function(e,t){return e&&e.length?tr(e,Jr(t,3)):[]},On.tap=function(e,t){return t(e),e},On.throttle=function(e,t,n){var u=!0,r=!0;if("function"!=typeof e)throw new ge(a);return Wd(n)&&(u="leading"in n?!!n.leading:u,r="trailing"in n?!!n.trailing:r),yd(e,t,{leading:u,maxWait:t,trailing:r})},On.thru=td,On.toArray=eo,On.toPairs=Co,On.toPairsIn=Oo,On.toPath=function(e){return Nd(e)?pt(e,xa):Jd(e)?[e]:vr(ka(oo(e)))},On.toPlainObject=ao,On.transform=function(e,t,n){var u=Nd(e),r=u||Md(e)||Yd(e);if(t=Jr(t,4),null==n){var a=e&&e.constructor;n=r?u?new a:[]:Wd(e)&&Bd(a)?In(qe(e)):{}}return(r?ot:iu)(e,(function(e,u,r){return t(n,e,u,r)})),n},On.unary=function(e){return hd(e,1)},On.union=Ha,On.unionBy=$a,On.unionWith=qa,On.uniq=function(e){return e&&e.length?Xu(e):[]},On.uniqBy=function(e,t){return e&&e.length?Xu(e,Jr(t,2)):[]},On.uniqWith=function(e,t){return t="function"==typeof t?t:void 0,e&&e.length?Xu(e,void 0,t):[]},On.unset=function(e,t){return null==e||Qu(e,t)},On.unzip=Ga,On.unzipWith=Va,On.update=function(e,t,n){return null==e?e:er(e,t,dr(n))},On.updateWith=function(e,t,n,u){return u="function"==typeof u?u:void 0,null==e?e:er(e,t,dr(n),u)},On.values=Io,On.valuesIn=function(e){return null==e?[]:jt(e,Eo(e))},On.without=Ka,On.words=zo,On.wrap=function(e,t){return xd(dr(t),e)},On.xor=Za,On.xorBy=Ja,On.xorWith=Ya,On.zip=Xa,On.zipObject=function(e,t){return rr(e||[],t||[],Hn)},On.zipObjectDeep=function(e,t){return rr(e||[],t||[],Uu)},On.zipWith=Qa,On.entries=Co,On.entriesIn=Oo,On.extend=co,On.extendWith=lo,Jo(On,On),On.add=di,On.attempt=Uo,On.camelCase=Ao,On.capitalize=jo,On.ceil=oi,On.clamp=function(e,t,n){return void 0===n&&(n=t,t=void 0),void 0!==n&&(n=(n=ro(n))==n?n:0),void 0!==t&&(t=(t=ro(t))==t?t:0),Zn(ro(e),t,n)},On.clone=function(e){return Jn(e,4)},On.cloneDeep=function(e){return Jn(e,5)},On.cloneDeepWith=function(e,t){return Jn(e,5,t="function"==typeof t?t:void 0)},On.cloneWith=function(e,t){return Jn(e,4,t="function"==typeof t?t:void 0)},On.conformsTo=function(e,t){return null==t||Yn(e,t,_o(t))},On.deburr=No,On.defaultTo=function(e,t){return null==e||e!=e?t:e},On.divide=ii,On.endsWith=function(e,t,n){e=oo(e),t=Yu(t);var u=e.length,r=n=void 0===n?u:Zn(no(n),0,u);return(n-=t.length)>=0&&e.slice(n,r)==t},On.eq=Od,On.escape=function(e){return(e=oo(e))&&B.test(e)?e.replace(R,Rt):e},On.escapeRegExp=function(e){return(e=oo(e))&&V.test(e)?e.replace(G,"\\$&"):e},On.every=function(e,t,n){var u=Nd(e)?ct:nu;return n&&oa(e,t,n)&&(t=void 0),u(e,Jr(t,3))},On.find=rd,On.findIndex=ja,On.findKey=function(e,t){return yt(e,Jr(t,3),iu)},On.findLast=ad,On.findLastIndex=Na,On.findLastKey=function(e,t){return yt(e,Jr(t,3),cu)},On.floor=ci,On.forEach=dd,On.forEachRight=od,On.forIn=function(e,t){return null==e?e:du(e,Jr(t,3),Eo)},On.forInRight=function(e,t){return null==e?e:ou(e,Jr(t,3),Eo)},On.forOwn=function(e,t){return e&&iu(e,Jr(t,3))},On.forOwnRight=function(e,t){return e&&cu(e,Jr(t,3))},On.get=ho,On.gt=Id,On.gte=Ad,On.has=function(e,t){return null!=e&&ua(e,t,hu)},On.hasIn=bo,On.head=Ta,On.identity=Go,On.includes=function(e,t,n,u){e=Td(e)?e:Io(e),n=n&&!u?no(n):0;var r=e.length;return n<0&&(n=an(r+n,0)),Zd(e)?n<=r&&e.indexOf(t,n)>-1:!!r&&Et(e,t,n)>-1},On.indexOf=function(e,t,n){var u=null==e?0:e.length;if(!u)return-1;var r=null==n?0:no(n);return r<0&&(r=an(u+r,0)),Et(e,t,r)},On.inRange=function(e,t,n){return t=to(t),void 0===n?(n=t,t=0):n=to(n),function(e,t,n){return e>=dn(t,n)&&e=-9007199254740991&&e<=9007199254740991},On.isSet=Kd,On.isString=Zd,On.isSymbol=Jd,On.isTypedArray=Yd,On.isUndefined=function(e){return void 0===e},On.isWeakMap=function(e){return Hd(e)&&na(e)==w},On.isWeakSet=function(e){return Hd(e)&&"[object WeakSet]"==pu(e)},On.join=function(e,t){return null==e?"":un.call(e,t)},On.kebabCase=Fo,On.last=La,On.lastIndexOf=function(e,t,n){var u=null==e?0:e.length;if(!u)return-1;var r=u;return void 0!==n&&(r=(r=no(n))<0?an(u+r,0):dn(r,u-1)),t==t?function(e,t,n){for(var u=n+1;u--;)if(e[u]===t)return u;return u}(e,t,r):_t(e,Dt,r,!0)},On.lowerCase=To,On.lowerFirst=Po,On.lt=Xd,On.lte=Qd,On.max=function(e){return e&&e.length?uu(e,Go,mu):void 0},On.maxBy=function(e,t){return e&&e.length?uu(e,Jr(t,2),mu):void 0},On.mean=function(e){return kt(e,Go)},On.meanBy=function(e,t){return kt(e,Jr(t,2))},On.min=function(e){return e&&e.length?uu(e,Go,Su):void 0},On.minBy=function(e,t){return e&&e.length?uu(e,Jr(t,2),Su):void 0},On.stubArray=ri,On.stubFalse=ai,On.stubObject=function(){return{}},On.stubString=function(){return""},On.stubTrue=function(){return!0},On.multiply=fi,On.nth=function(e,t){return e&&e.length?ju(e,no(t)):void 0},On.noConflict=function(){return Ve._===this&&(Ve._=Ie),this},On.noop=Yo,On.now=md,On.pad=function(e,t,n){e=oo(e);var u=(t=no(t))?qt(e):0;if(!t||u>=t)return e;var r=(t-u)/2;return Nr(Qt(r),n)+e+Nr(Xt(r),n)},On.padEnd=function(e,t,n){e=oo(e);var u=(t=no(t))?qt(e):0;return t&&ut){var u=e;e=t,t=u}if(n||e%1||t%1){var r=ln();return dn(e+r*(t-e+He("1e-"+((r+"").length-1))),t)}return Mu(e,t)},On.reduce=function(e,t,n){var u=Nd(e)?ht:Ct,r=arguments.length<3;return u(e,Jr(t,4),n,r,eu)},On.reduceRight=function(e,t,n){var u=Nd(e)?bt:Ct,r=arguments.length<3;return u(e,Jr(t,4),n,r,tu)},On.repeat=function(e,t,n){return t=(n?oa(e,t,n):void 0===t)?1:no(t),Ru(oo(e),t)},On.replace=function(){var e=arguments,t=oo(e[0]);return e.length<3?t:t.replace(e[1],e[2])},On.result=function(e,t,n){var u=-1,r=(t=or(t,e)).length;for(r||(r=1,e=void 0);++u9007199254740991)return[];var n=4294967295,u=dn(e,4294967295);e-=4294967295;for(var r=It(u,t=Jr(t));++n=a)return e;var o=n-qt(u);if(o<1)return u;var i=d?cr(d,0,o).join(""):e.slice(0,o);if(void 0===r)return i+u;if(d&&(o+=i.length-o),Vd(r)){if(e.slice(o).search(r)){var c,l=i;for(r.global||(r=be(r.source,oo(ue.exec(r))+"g")),r.lastIndex=0;c=r.exec(l);)var f=c.index;i=i.slice(0,void 0===f?o:f)}}else if(e.indexOf(Yu(r),o)!=o){var s=i.lastIndexOf(r);s>-1&&(i=i.slice(0,s))}return i+u},On.unescape=function(e){return(e=oo(e))&&L.test(e)?e.replace(M,Vt):e},On.uniqueId=function(e){var t=++xe;return oo(e)+t},On.upperCase=Lo,On.upperFirst=Bo,On.each=dd,On.eachRight=od,On.first=Ta,Jo(On,(li={},iu(On,(function(e,t){ke.call(On.prototype,t)||(li[t]=e)})),li),{chain:!1}),On.VERSION="4.17.15",ot(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){On[e].placeholder=On})),ot(["drop","take"],(function(e,t){Nn.prototype[e]=function(n){n=void 0===n?1:an(no(n),0);var u=this.__filtered__&&!t?new Nn(this):this.clone();return u.__filtered__?u.__takeCount__=dn(n,u.__takeCount__):u.__views__.push({size:dn(n,4294967295),type:e+(u.__dir__<0?"Right":"")}),u},Nn.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}})),ot(["filter","map","takeWhile"],(function(e,t){var n=t+1,u=1==n||3==n;Nn.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:Jr(e,3),type:n}),t.__filtered__=t.__filtered__||u,t}})),ot(["head","last"],(function(e,t){var n="take"+(t?"Right":"");Nn.prototype[e]=function(){return this[n](1).value()[0]}})),ot(["initial","tail"],(function(e,t){var n="drop"+(t?"":"Right");Nn.prototype[e]=function(){return this.__filtered__?new Nn(this):this[n](1)}})),Nn.prototype.compact=function(){return this.filter(Go)},Nn.prototype.find=function(e){return this.filter(e).head()},Nn.prototype.findLast=function(e){return this.reverse().find(e)},Nn.prototype.invokeMap=Lu((function(e,t){return"function"==typeof e?new Nn(this):this.map((function(n){return gu(n,e,t)}))})),Nn.prototype.reject=function(e){return this.filter(Dd(Jr(e)))},Nn.prototype.slice=function(e,t){e=no(e);var n=this;return n.__filtered__&&(e>0||t<0)?new Nn(n):(e<0?n=n.takeRight(-e):e&&(n=n.drop(e)),void 0!==t&&(n=(t=no(t))<0?n.dropRight(-t):n.take(t-e)),n)},Nn.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},Nn.prototype.toArray=function(){return this.take(4294967295)},iu(Nn.prototype,(function(e,t){var n=/^(?:filter|find|map|reject)|While$/.test(t),u=/^(?:head|last)$/.test(t),r=On[u?"take"+("last"==t?"Right":""):t],a=u||/^find/.test(t);r&&(On.prototype[t]=function(){var t=this.__wrapped__,d=u?[1]:arguments,o=t instanceof Nn,i=d[0],c=o||Nd(t),l=function(e){var t=r.apply(On,mt([e],d));return u&&f?t[0]:t};c&&n&&"function"==typeof i&&1!=i.length&&(o=c=!1);var f=this.__chain__,s=!!this.__actions__.length,p=a&&!f,m=o&&!s;if(!a&&c){t=m?t:new Nn(this);var h=e.apply(t,d);return h.__actions__.push({func:td,args:[l],thisArg:void 0}),new jn(h,f)}return p&&m?e.apply(this,d):(h=this.thru(l),p?u?h.value()[0]:h.value():h)})})),ot(["pop","push","shift","sort","splice","unshift"],(function(e){var t=ye[e],n=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",u=/^(?:pop|shift)$/.test(e);On.prototype[e]=function(){var e=arguments;if(u&&!this.__chain__){var r=this.value();return t.apply(Nd(r)?r:[],e)}return this[n]((function(n){return t.apply(Nd(n)?n:[],e)}))}})),iu(Nn.prototype,(function(e,t){var n=On[t];if(n){var u=n.name+"";ke.call(yn,u)||(yn[u]=[]),yn[u].push({name:t,func:n})}})),yn[Or(void 0,2).name]=[{name:"wrapper",func:void 0}],Nn.prototype.clone=function(){var e=new Nn(this.__wrapped__);return e.__actions__=vr(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=vr(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=vr(this.__views__),e},Nn.prototype.reverse=function(){if(this.__filtered__){var e=new Nn(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},Nn.prototype.value=function(){var e=this.__wrapped__.value(),t=this.__dir__,n=Nd(e),u=t<0,r=n?e.length:0,a=function(e,t,n){var u=-1,r=n.length;for(;++u=this.__values__.length;return{done:e,value:e?void 0:this.__values__[this.__index__++]}},On.prototype.plant=function(e){for(var t,n=this;n instanceof An;){var u=Ca(n);u.__index__=0,u.__values__=void 0,t?r.__wrapped__=u:t=u;var r=u;n=n.__wrapped__}return r.__wrapped__=e,t},On.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof Nn){var t=e;return this.__actions__.length&&(t=new Nn(this)),(t=t.reverse()).__actions__.push({func:td,args:[Wa],thisArg:void 0}),new jn(t,this.__chain__)}return this.thru(Wa)},On.prototype.toJSON=On.prototype.valueOf=On.prototype.value=function(){return nr(this.__wrapped__,this.__actions__)},On.prototype.first=On.prototype.head,Xe&&(On.prototype[Xe]=function(){return this}),On}();Ve._=Kt,void 0===(r=function(){return Kt}.call(t,n,t,u))||(u.exports=r)}).call(this)}).call(this,n(76),n(496)(e))},492:function(e,t,n){"use strict";var u=n(0);t.a=function(e){void 0===e&&(e=!0),Object(u.useEffect)((function(){return document.body.style.overflow=e?"hidden":"visible",function(){document.body.style.overflow="visible"}}),[e])}},493:function(e,t,n){"use strict";var u=n(476),r=n(485),a=n(480),d=n(474);t.a=function(){var e=Object(u.a)().siteConfig,t=(e=void 0===e?{}:e).baseUrl,n=e.themeConfig.navbar,o=(n=void 0===n?{}:n).logo,i=void 0===o?{}:o,c=Object(r.a)().isDarkTheme,l=i.href||t,f={};i.target?f={target:i.target}:Object(d.a)(l)||(f={rel:"noopener noreferrer",target:"_blank"});var s=i.srcDark&&c?i.srcDark:i.src;return{logoLink:l,logoLinkProps:f,logoImageUrl:Object(a.a)(s),logoAlt:i.alt}}},495:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));n(77),n(513),n(478),n(78);var u=n(515),r=n.n(u);function a(e,t){var n=new r.a;return e.map((function(e){var u=e;return"string"==typeof e&&(u={label:e,permalink:"/blog/tags/"+n.slug(e)}),function(e,t){var n=e.label.split(": ",2),u=n[0],r=n[1],a="primary";switch(t){case"blog":case"guides":a=function(e){switch(e){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(u)}return{category:u,count:e.count,label:e.label,permalink:e.permalink,style:a,value:r}}(u,t)}))}},496:function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},497:function(e,t,n){"use strict";var u=n(12),r=n(26),a=n(557),d="".endsWith;u(u.P+u.F*n(558)("endsWith"),"String",{endsWith:function(e){var t=a(this,e,"endsWith"),n=arguments.length>1?arguments[1]:void 0,u=r(t.length),o=void 0===n?u:Math.min(r(n),u),i=String(e);return d?d.call(t,i,o):t.slice(o-i.length,o)===i}})},498:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(476),d=n(145),o=n.n(d);t.a=function(){var e=Object(a.a)().siteConfig,t=(e=void 0===e?{}:e).themeConfig.announcementBar,n=void 0===t?{}:t,d=n.id,i=n.content,c=n.backgroundColor,l=n.textColor,f=Object(u.useState)(!0),s=f[0],p=f[1];return Object(u.useEffect)((function(){var e=localStorage.getItem("docusaurus.announcement.id"),t=d!==e;localStorage.setItem("docusaurus.announcement.id",d),t&&localStorage.setItem("docusaurus.announcement.dismiss",!1),(t||"false"===localStorage.getItem("docusaurus.announcement.dismiss"))&&p(!1)}),[]),!i||s?null:r.a.createElement("div",{className:o.a.announcementBar,style:{backgroundColor:c,color:l},role:"banner"},r.a.createElement("div",{className:o.a.announcementBarContent,dangerouslySetInnerHTML:{__html:i}}),r.a.createElement("button",{type:"button",className:o.a.announcementBarClose,onClick:function(){localStorage.setItem("docusaurus.announcement.dismiss",!0),p(!0)},"aria-label":"Close"},r.a.createElement("span",{"aria-hidden":"true"},"\xd7")))}},499:function(e,t,n){"use strict";var u=n(0);u.PureComponent},500:function(e,t,n){"use strict";n(58),n(29),n(22),n(21),n(79);var u=n(0),r=n.n(u),a=n(463),d=n.n(a),o=n(476),i=n(512);n(146);t.a=function(e){var t=Object(u.useState)(!1),a=t[0],c=t[1],l=Object(u.useRef)(null),f=Object(o.a)().siteConfig,s=(void 0===f?{}:f).themeConfig.algolia,p=Object(i.c)();var m=function(e){void 0===e&&(e=!0),a||Promise.all([n.e(309).then(n.t.bind(null,610,7)),n.e(209).then(n.t.bind(null,623,7))]).then((function(t){var n=t[0].default;c(!0),window.docsearch=n,function(e){window.docsearch({appId:s.appId,apiKey:s.apiKey,indexName:s.indexName,inputSelector:"#search_input_react",algoliaOptions:s.algoliaOptions,handleSelected:function(e,t,n){var u=document.createElement("a");u.href=n.url;var r="#__docusaurus"===u.hash?""+u.pathname:""+u.pathname+u.hash;p.push(r)}}),e&&l.current.focus()}(e)}))},h=Object(u.useCallback)((function(){m(),a&&l.current.focus(),e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]),b=Object(u.useCallback)((function(){e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]),v=Object(u.useCallback)((function(e){var t="mouseover"!==e.type;m(t)}));return r.a.createElement("div",{className:"navbar__search",key:"search-box"},r.a.createElement("span",{"aria-label":"expand searchbar",role:"button",className:d()("search-icon",{"search-icon-hidden":e.isSearchBarExpanded}),onClick:h,onKeyDown:h,tabIndex:0}),r.a.createElement("input",{id:"search_input_react",type:"search",placeholder:"Search","aria-label":"Search",className:d()("navbar__search-input",{"search-bar-expanded":e.isSearchBarExpanded},{"search-bar":!e.isSearchBarExpanded}),onMouseOver:v,onFocus:v,onBlur:b,ref:l}))}},501:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=Object.assign||function(e){for(var t=1;tthis.startX&&(this.setState({checked:!0}),this.startX=t,this.activated=tn?this.previouslyChecked!==this.state.checked&&(this.setState({checked:!1}),this.previouslyChecked=this.state.checked,t.click()):this.startX-4=0||Object.prototype.hasOwnProperty.call(e,u)&&(n[u]=e[u]);return n}(t,["className","icons"])),a=(0,o.default)("react-toggle",{"react-toggle--checked":this.state.checked,"react-toggle--focus":this.state.hasFocus,"react-toggle--disabled":this.props.disabled},n);return d.default.createElement("div",{className:a,onClick:this.handleClick,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEnd},d.default.createElement("div",{className:"react-toggle-track"},d.default.createElement("div",{className:"react-toggle-track-check"},this.getIcon("checked")),d.default.createElement("div",{className:"react-toggle-track-x"},this.getIcon("unchecked"))),d.default.createElement("div",{className:"react-toggle-thumb"}),d.default.createElement("input",u({},r,{ref:function(t){e.input=t},onFocus:this.handleFocus,onBlur:this.handleBlur,className:"react-toggle-screenreader-only",type:"checkbox"})))}}]),t}(a.PureComponent);t.default=p,p.displayName="Toggle",p.defaultProps={icons:{checked:d.default.createElement(c.default,null),unchecked:d.default.createElement(l.default,null)}},p.propTypes={checked:i.default.bool,disabled:i.default.bool,defaultChecked:i.default.bool,onChange:i.default.func,onFocus:i.default.func,onBlur:i.default.func,className:i.default.string,name:i.default.string,value:i.default.string,id:i.default.string,"aria-labelledby":i.default.string,"aria-label":i.default.string,icons:i.default.oneOfType([i.default.bool,i.default.shape({checked:i.default.node,unchecked:i.default.node})])}},502:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=(n(84),n(513),function(){var e=Object(u.useState)({}),t=e[0],n=e[1],r=Object(u.useCallback)((function(e,t){try{localStorage.setItem("docusaurus.tab."+e,t)}catch(n){console.error(n)}}),[]);return Object(u.useEffect)((function(){try{for(var e={},t=0;t=f?d(!1):e+n1&&"boolean"!=typeof t)throw new a('"allowMissing" argument must be a boolean');if(null===w(/^%?[^%]*%?$/,e))throw new u("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var n=x(e),r=n.length>0?n[0]:"",d=S("%"+r+"%",t),i=d.name,c=d.value,l=!1,f=d.alias;f&&(r=f[0],y(n,g([0,1],f)));for(var s=1,p=!0;s=n.length){var D=o(c,h);c=(p=!!D)&&"get"in D&&!("originalValue"in D.get)?D.get:c[h]}else p=v(c,h),c=c[h];p&&!l&&(m[i]=c)}}return c}},510:function(e,t,n){"use strict";var u=n(549);e.exports=Function.prototype.bind||u},511:function(e,t,n){"use strict";var u=String.prototype.replace,r=/%20/g,a="RFC1738",d="RFC3986";e.exports={default:d,formatters:{RFC1738:function(e){return u.call(e,r,"+")},RFC3986:function(e){return String(e)}},RFC1738:a,RFC3986:d}},512:function(e,t,n){"use strict";var u=n(39);n.d(t,"a",(function(){return u.c})),n.d(t,"b",(function(){return u.d})),n.d(t,"c",(function(){return u.e})),n.d(t,"d",(function(){return u.f}))},514:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(470),d=n(463),o=n.n(d);t.a=function(e){var t=e.count,n=e.label,u=e.permalink,d=e.style,i=e.value,c=e.valueOnly;return r.a.createElement(a.a,{to:u+"/",className:o()("badge","badge--rounded","badge--"+d)},c?i:n,t&&r.a.createElement(r.a.Fragment,null," (",t,")"))}},515:function(e,t,n){var u=n(516);e.exports=o;var r=Object.hasOwnProperty,a=/\s/g,d=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function o(){if(!(this instanceof o))return new o;this.reset()}function i(e,t){return"string"!=typeof e?"":(t||(e=e.toLowerCase()),e.trim().replace(d,"").replace(u(),"").replace(a,"-"))}o.prototype.slug=function(e,t){for(var n=i(e,!0===t),u=n;r.call(this.occurrences,n);)this.occurrences[u]++,n=u+"-"+this.occurrences[u];return this.occurrences[n]=0,n},o.prototype.reset=function(){this.occurrences=Object.create(null)},o.slug=i},516:function(e,t){e.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},518:function(e,t,n){"use strict";var u=n(511),r=Object.prototype.hasOwnProperty,a=Array.isArray,d=function(){for(var e=[],t=0;t<256;++t)e.push("%"+((t<16?"0":"")+t.toString(16)).toUpperCase());return e}(),o=function(e,t){for(var n=t&&t.plainObjects?Object.create(null):{},u=0;u1;){var t=e.pop(),n=t.obj[t.prop];if(a(n)){for(var u=[],r=0;r=48&&l<=57||l>=65&&l<=90||l>=97&&l<=122||a===u.RFC1738&&(40===l||41===l)?i+=o.charAt(c):l<128?i+=d[l]:l<2048?i+=d[192|l>>6]+d[128|63&l]:l<55296||l>=57344?i+=d[224|l>>12]+d[128|l>>6&63]+d[128|63&l]:(c+=1,l=65536+((1023&l)<<10|1023&o.charCodeAt(c)),i+=d[240|l>>18]+d[128|l>>12&63]+d[128|l>>6&63]+d[128|63&l])}return i},isBuffer:function(e){return!(!e||"object"!=typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},maybeMap:function(e,t){if(a(e)){for(var n=[],u=0;u{if("string"!=typeof e)throw new TypeError("Expected a string");return e=(e=(e=u(e)).toLowerCase().replace(/[_-]+/g," ").replace(/\s{2,}/g," ").trim()).charAt(0).toUpperCase()+e.slice(1)};e.exports=r,e.exports.default=r},525:function(e,t,n){"use strict";var u=n(0),r=n.n(u).a.createContext({isDarkTheme:!1,setLightTheme:function(){},setDarkTheme:function(){}});t.a=r},527:function(e,t,n){"use strict";(function(e){var u=n(1),r=(n(488),n(489),n(78),n(77),n(570),n(0)),a=n.n(r),d=n(571),o=n.n(d),i=n(603),c=n(53),l=n(463),f=n.n(l),s=n(583),p=n.n(s),m=n(572),h=n.n(m),b=n(476),v=n(485),g=n(148),y=n.n(g);(void 0!==e?e:window).Prism=c.a,n(573),n(574),n(575),n(576),n(90),n(577),n(578),n(579),n(580),n(581),n(582);var _=/{([\d,-]+)}/,E=/title=".*"/;t.a=function(e){var t=e.children,n=e.className,d=e.metastring,c=Object(b.a)().siteConfig.themeConfig.prism,l=void 0===c?{}:c,s=Object(r.useState)(!1),m=s[0],g=s[1],w=Object(r.useState)(!1),D=w[0],k=w[1];Object(r.useEffect)((function(){k(!0)}),[]);var x=Object(r.useRef)(null),S=Object(r.useRef)(null),C=[],O="",I=Object(v.a)().isDarkTheme,A=l.theme||p.a,j=l.darkTheme||A,N=I?j:A;if(d&&_.test(d)){var F=d.match(_)[1];C=h.a.parse(F).filter((function(e){return e>0}))}d&&E.test(d)&&(O=d.match(E)[0].split("title=")[1].replace(/"+/g,"")),Object(r.useEffect)((function(){var e;return S.current&&(e=new o.a(S.current,{target:function(){return x.current}})),function(){e&&e.destroy()}}),[S.current,x.current]);var T=n&&n.replace(/language-/,"");!T&&l.defaultLanguage&&(T=l.defaultLanguage);var P=function(){window.getSelection().empty(),g(!0),setTimeout((function(){return g(!1)}),2e3)};return a.a.createElement(i.a,Object(u.a)({},i.b,{key:D,theme:N,code:t.trim(),language:T}),(function(e){var t,n,r=e.className,d=e.style,o=e.tokens,i=e.getLineProps,c=e.getTokenProps;return a.a.createElement(a.a.Fragment,null,O&&a.a.createElement("div",{style:d,className:y.a.codeBlockTitle},O),a.a.createElement("div",{className:y.a.codeBlockContent},a.a.createElement("button",{ref:S,type:"button","aria-label":"Copy code to clipboard",className:f()(y.a.copyButton,(t={},t[y.a.copyButtonWithTitle]=O,t)),onClick:P},m?"Copied":"Copy"),a.a.createElement("pre",{className:f()(r,y.a.codeBlock,(n={},n[y.a.codeBlockWithTitle]=O,n))},a.a.createElement("div",{ref:x,className:y.a.codeBlockLines,style:d},o.map((function(e,t){1===e.length&&""===e[0].content&&(e[0].content="\n");var n=i({line:e,key:t});return C.includes(t+1)&&(n.className=n.className+" docusaurus-highlight-code-line"),a.a.createElement("div",Object(u.a)({key:t},n),e.map((function(e,t){return a.a.createElement("span",Object(u.a)({key:t},c({token:e,key:t})))})))}))))))}))}}).call(this,n(76))},528:function(e,t,n){"use strict";var u=n(0),r=n.n(u);n(464),n(144);t.a=function(e){var t=e.children,n=Object(u.useState)(!1),a=n[0],d=n[1];return a?r.a.createElement("div",{className:"code-explanation code-explanation--expanded"},t,r.a.createElement("div",{className:"code-explanation--toggle",onClick:function(){return d(!a)}},r.a.createElement("i",{className:"feather icon-arrow-up-circle"})," hide")):r.a.createElement("div",{className:"code-explanation code-explanation--collapsed"},r.a.createElement("div",{className:"code-explanation--toggle",onClick:function(){return d(!a)}},r.a.createElement("i",{className:"feather icon-info"})," explain this command"))}},529:function(e,t,n){"use strict";var u=n(30),r=n(12),a=n(27),d=n(91),o=n(92),i=n(26),c=n(585),l=n(93);r(r.S+r.F*!n(83)((function(e){Array.from(e)})),"Array",{from:function(e){var t,n,r,f,s=a(e),p="function"==typeof this?this:Array,m=arguments.length,h=m>1?arguments[1]:void 0,b=void 0!==h,v=0,g=l(s);if(b&&(h=u(h,m>2?arguments[2]:void 0,2)),null==g||p==Array&&o(g))for(n=new p(t=i(s.length));t>v;v++)c(n,v,b?h(s[v],v):s[v]);else for(f=g.call(s),n=new p;!(r=f.next()).done;v++)c(n,v,b?d(f,h,[r.value,v],!0):r.value);return n.length=v,n}})},530:function(e,t,n){"use strict";var u=n(586),r=n(532);e.exports=n(587)("Set",(function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(e){return u.def(r(this,"Set"),e=0===e?0:e,e)}},u)},531:function(e,t,n){var u=n(40)("meta"),r=n(13),a=n(31),d=n(28).f,o=0,i=Object.isExtensible||function(){return!0},c=!n(14)((function(){return i(Object.preventExtensions({}))})),l=function(e){d(e,u,{value:{i:"O"+ ++o,w:{}}})},f=e.exports={KEY:u,NEED:!1,fastKey:function(e,t){if(!r(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,u)){if(!i(e))return"F";if(!t)return"E";l(e)}return e[u].i},getWeak:function(e,t){if(!a(e,u)){if(!i(e))return!0;if(!t)return!1;l(e)}return e[u].w},onFreeze:function(e){return c&&f.NEED&&i(e)&&!a(e,u)&&l(e),e}}},532:function(e,t,n){var u=n(13);e.exports=function(e,t){if(!u(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}},533:function(e,t,n){"use strict";const u=n(534);e.exports=(e,t)=>{if("string"!=typeof e)throw new TypeError("Expected a string");t=void 0===t?"_":t;const n=u("([\\p{Ll}\\d])(\\p{Lu})","g"),r=u("(\\p{Lu}+)(\\p{Lu}[\\p{Ll}\\d]+)","g");return e.replace(n,`$1${t}$2`).replace(r,`$1${t}$2`).toLowerCase()}},534:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=f(n(535)),r=f(n(536)),a=f(n(537)),d=f(n(538)),o=f(n(539)),i=f(n(540)),c=f(n(541)),l=f(n(542));function f(e){return e&&e.__esModule?e:{default:e}}(0,r.default)(u.default),(0,a.default)(u.default),(0,d.default)(u.default),(0,o.default)(u.default),(0,i.default)(u.default),(0,c.default)(u.default),(0,l.default)(u.default),t.default=u.default,e.exports=t.default},535:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u={astral:!1},r={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},a={},d={},o={},i=[],c={default:/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,class:/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},l=/\$(?:{([\w$]+)}|<([\w$]+)>|(\d\d?|[\s\S]))/g,f=void 0===r.exec.call(/()??/,"")[1],s=void 0!==/x/.flags,p={}.toString;function m(e){var t=!0;try{new RegExp("",e)}catch(n){t=!1}return t}var h=m("u"),b=m("y"),v={g:!0,i:!0,m:!0,u:h,y:b};function g(e,t,n,u,r){var a=void 0;if(e.xregexp={captureNames:t},r)return e;if(e.__proto__)e.__proto__=j.prototype;else for(a in j.prototype)e[a]=j.prototype[a];return e.xregexp.source=n,e.xregexp.flags=u?u.split("").sort().join(""):u,e}function y(e){return r.replace.call(e,/([\s\S])(?=[\s\S]*\1)/g,"")}function _(e,t){if(!j.isRegExp(e))throw new TypeError("Type RegExp expected");var n=e.xregexp||{},u=function(e){return s?e.flags:r.exec.call(/\/([a-z]*)$/i,RegExp.prototype.toString.call(e))[1]}(e),a="",d="",o=null,i=null;return(t=t||{}).removeG&&(d+="g"),t.removeY&&(d+="y"),d&&(u=r.replace.call(u,new RegExp("["+d+"]+","g"),"")),t.addG&&(a+="g"),t.addY&&(a+="y"),a&&(u=y(u+a)),t.isInternalOnly||(void 0!==n.source&&(o=n.source),null!=n.flags&&(i=a?y(n.flags+a):n.flags)),e=g(new RegExp(t.source||e.source,u),function(e){return!(!e.xregexp||!e.xregexp.captureNames)}(e)?n.captureNames.slice(0):null,o,i,t.isInternalOnly)}function E(e){return parseInt(e,16)}function w(e,t,n){return"("===e.input[e.index-1]||")"===e.input[e.index+e[0].length]||function(e,t,n){return r.test.call(-1!==n.indexOf("x")?/^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/,e.slice(t))}(e.input,e.index+e[0].length,n)?"":"(?:)"}function D(e){return parseInt(e,10).toString(16)}function k(e,t){return p.call(e)==="[object "+t+"]"}function x(e){for(;e.length<4;)e="0"+e;return e}function S(e){var t={};return k(e,"String")?(j.forEach(e,/[^\s,]+/,(function(e){t[e]=!0})),t):e}function C(e){if(!/^[\w$]$/.test(e))throw new Error("Flag must be a single character A-Za-z0-9_$");v[e]=!0}function O(e,t,n,u,r){for(var a=i.length,d=e[n],o=null,c=void 0,l=void 0;a--;)if(!((l=i[a]).leadChar&&l.leadChar!==d||l.scope!==u&&"all"!==l.scope||l.flag&&-1===t.indexOf(l.flag))&&(c=j.exec(e,l.regex,n,"sticky"))){o={matchLength:c[0].length,output:l.handler.call(r,c,u,t),reparse:l.reparse};break}return o}function I(e){u.astral=e}function A(e){if(null==e)throw new TypeError("Cannot convert null or undefined to object");return e}function j(e,t){if(j.isRegExp(e)){if(void 0!==t)throw new TypeError("Cannot supply flags when copying a RegExp");return _(e)}if(e=void 0===e?"":String(e),t=void 0===t?"":String(t),j.isInstalled("astral")&&-1===t.indexOf("A")&&(t+="A"),o[e]||(o[e]={}),!o[e][t]){for(var n={hasNamedCapture:!1,captureNames:[]},u="default",a="",d=0,i=void 0,l=function(e,t){var n=void 0;if(y(t)!==t)throw new SyntaxError("Invalid duplicate regex flag "+t);for(e=r.replace.call(e,/^\(\?([\w$]+)\)/,(function(e,n){if(r.test.call(/[gy]/,n))throw new SyntaxError("Cannot use flag g or y in mode modifier "+e);return t=y(t+n),""})),n=0;n"}else if(n)return"\\"+(+n+d);return e}if(!k(e,"Array")||!e.length)throw new TypeError("Must provide a nonempty array of patterns to merge");for(var c=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,l=[],f=void 0,s=0;s1&&-1!==n.indexOf("")){var u=_(this,{removeG:!0,isInternalOnly:!0});r.replace.call(String(e).slice(n.index),u,(function(){for(var e=arguments.length,t=Array(e),u=0;un.index&&(this.lastIndex=n.index)}return this.global||(this.lastIndex=t),n},a.test=function(e){return!!a.exec.call(this,e)},a.match=function(e){if(j.isRegExp(e)){if(e.global){var t=r.match.apply(this,arguments);return e.lastIndex=0,t}}else e=new RegExp(e);return a.exec.call(e,A(this))},a.replace=function(e,t){var n=j.isRegExp(e),u=void 0,a=void 0,d=void 0;return n?(e.xregexp&&(a=e.xregexp.captureNames),u=e.lastIndex):e+="",d=k(t,"Function")?r.replace.call(String(this),e,(function(){for(var u=arguments.length,r=Array(u),d=0;dn.length-3)throw new SyntaxError("Backreference to undefined group "+e);return n[r]||""}throw new SyntaxError("Invalid token "+e)}})),n&&(e.global?e.lastIndex=0:e.lastIndex=u),d},a.split=function(e,t){if(!j.isRegExp(e))return r.split.apply(this,arguments);var n=String(this),u=[],a=e.lastIndex,d=0,o=void 0;return t=(void 0===t?-1:t)>>>0,j.forEach(n,e,(function(e){e.index+e[0].length>d&&(u.push(n.slice(d,e.index)),e.length>1&&e.indext?u.slice(0,t):u},j.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,(function(e,t){if("B"===e[1]&&"default"===t)return e[0];throw new SyntaxError("Invalid escape "+e[0])}),{scope:"all",leadChar:"\\"}),j.addToken(/\\u{([\dA-Fa-f]+)}/,(function(e,t,n){var u=E(e[1]);if(u>1114111)throw new SyntaxError("Invalid Unicode code point "+e[0]);if(u<=65535)return"\\u"+x(D(u));if(h&&-1!==n.indexOf("u"))return e[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u")}),{scope:"all",leadChar:"\\"}),j.addToken(/\[(\^?)\]/,(function(e){return e[1]?"[\\s\\S]":"\\b\\B"}),{leadChar:"["}),j.addToken(/\(\?#[^)]*\)/,w,{leadChar:"("}),j.addToken(/\s+|#[^\n]*\n?/,w,{flag:"x"}),j.addToken(/\./,(function(){return"[\\s\\S]"}),{flag:"s",leadChar:"."}),j.addToken(/\\k<([\w$]+)>/,(function(e){var t=isNaN(e[1])?this.captureNames.indexOf(e[1])+1:+e[1],n=e.index+e[0].length;if(!t||t>this.captureNames.length)throw new SyntaxError("Backreference to undefined group "+e[0]);return"\\"+t+(n===e.input.length||isNaN(e.input[n])?"":"(?:)")}),{leadChar:"\\"}),j.addToken(/\\(\d+)/,(function(e,t){if(!("default"===t&&/^[1-9]/.test(e[1])&&+e[1]<=this.captureNames.length)&&"0"!==e[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group "+e[0]);return e[0]}),{scope:"all",leadChar:"\\"}),j.addToken(/\(\?P?<([\w$]+)>/,(function(e){if(!isNaN(e[1]))throw new SyntaxError("Cannot use integer as capture name "+e[0]);if("length"===e[1]||"__proto__"===e[1])throw new SyntaxError("Cannot use reserved word as capture name "+e[0]);if(-1!==this.captureNames.indexOf(e[1]))throw new SyntaxError("Cannot use same name for multiple groups "+e[0]);return this.captureNames.push(e[1]),this.hasNamedCapture=!0,"("}),{leadChar:"("}),j.addToken(/\((?!\?)/,(function(e,t,n){return-1!==n.indexOf("n")?"(?:":(this.captureNames.push(null),"(")}),{optionalFlags:"n",leadChar:"("}),t.default=j,e.exports=t.default},536:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,n=e.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,t],"g",{conjunction:"or"});function u(e){var t=/^(?:\(\?:\))*\^/,n=/\$(?:\(\?:\))*$/;return t.test(e)&&n.test(e)&&n.test(e.replace(/\\[\s\S]/g,""))?e.replace(t,"").replace(n,""):e}function r(t,n){var u=n?"x":"";return e.isRegExp(t)?t.xregexp&&t.xregexp.captureNames?t:e(t.source,u):e(t,u)}function a(t){return t instanceof RegExp?t:e.escape(t)}function d(e,t,n){return e["subpattern"+n]=t,e}function o(e,t,n){return e+(t1?u-1:0),i=1;i"):i="(?:",h=m,""+i+l[d].pattern.replace(t,(function(e,t,n){if(t){if(o=l[d].names[m-h],++m,o)return"(?<"+o+">"}else if(n)return c=+n-1,l[d].names[c]?"\\k<"+l[d].names[c]+">":"\\"+(+n+h);return e}))+")"}if(r){if(o=g[b],v[++b]=++m,o)return"(?<"+o+">"}else if(a)return g[c=+a-1]?"\\k<"+g[c]+">":"\\"+v[+a];return e}));return e(y,o)}},e.exports=t.default},537:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){function t(e,t,n,u){return{name:e,value:t,start:n,end:u}}e.matchRecursive=function(n,u,r,a,d){d=d||{};var o=-1!==(a=a||"").indexOf("g"),i=-1!==a.indexOf("y"),c=a.replace(/y/g,""),l=d.escapeChar,f=d.valueNames,s=[],p=0,m=0,h=0,b=0,v=void 0,g=void 0,y=void 0,_=void 0,E=void 0;if(u=e(u,c),r=e(r,c),l){if(l.length>1)throw new Error("Cannot use more than one escape character");l=e.escape(l),E=new RegExp("(?:"+l+"[\\S\\s]|(?:(?!"+e.union([u,r],"",{conjunction:"or"}).source+")[^"+l+"])+)+",a.replace(/[^imu]+/g,""))}for(;;){if(l&&(h+=(e.exec(n,E,h,"sticky")||[""])[0].length),y=e.exec(n,u,h),_=e.exec(n,r,h),y&&_&&(y.index<=_.index?_=null:y=null),y||_)h=(m=(y||_).index)+(y||_)[0].length;else if(!p)break;if(i&&!p&&m>b)break;if(y)p||(v=m,g=h),++p;else{if(!_||!p)throw new Error("Unbalanced delimiter found in string");if(!--p&&(f?(f[0]&&v>b&&s.push(t(f[0],n.slice(b,v),b,v)),f[1]&&s.push(t(f[1],n.slice(v,g),v,g)),f[2]&&s.push(t(f[2],n.slice(g,m),g,m)),f[3]&&s.push(t(f[3],n.slice(m,h),m,h))):s.push(n.slice(g,m)),b=h,!o))break}m===h&&++h}return o&&!i&&f&&f[0]&&n.length>b&&s.push(t(f[0],n.slice(b),b,n.length)),s}},e.exports=t.default},538:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t={},n=e._dec,u=e._hex,r=e._pad4;function a(e){return e.replace(/[- _]+/g,"").toLowerCase()}function d(e){var t=/^\\[xu](.+)/.exec(e);return t?n(t[1]):e.charCodeAt("\\"===e[0]?1:0)}function o(n){var a,o,i;return t[n]["b!"]||(t[n]["b!"]=(a=t[n].bmp,o="",i=-1,e.forEach(a,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,(function(e){var t=d(e[1]);t>i+1&&(o+="\\u"+r(u(i+1)),t>i+2&&(o+="-\\u"+r(u(t-1)))),i=d(e[2]||e[1])})),i<65535&&(o+="\\u"+r(u(i+1)),i<65534&&(o+="-\\uFFFF")),o))}function i(e,n){var u=n?"a!":"a=";return t[e][u]||(t[e][u]=function(e,n){var u=t[e],r="";return u.bmp&&!u.isBmpLast&&(r="["+u.bmp+"]"+(u.astral?"|":"")),u.astral&&(r+=u.astral),u.isBmpLast&&u.bmp&&(r+=(u.astral?"|":"")+"["+u.bmp+"]"),n?"(?:(?!"+r+")(?:[\ud800-\udbff][\udc00-\udfff]|[\0-\uffff]))":"(?:"+r+")"}(e,n))}e.addToken(/\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/,(function(e,n,u){var r="P"===e[1]||!!e[2],d=-1!==u.indexOf("A"),c=a(e[4]||e[3]),l=t[c];if("P"===e[1]&&e[2])throw new SyntaxError("Invalid double negation "+e[0]);if(!t.hasOwnProperty(c))throw new SyntaxError("Unknown Unicode token "+e[0]);if(l.inverseOf){if(c=a(l.inverseOf),!t.hasOwnProperty(c))throw new ReferenceError("Unicode token missing data "+e[0]+" -> "+l.inverseOf);l=t[c],r=!r}if(!l.bmp&&!d)throw new SyntaxError("Astral mode required for Unicode token "+e[0]);if(d){if("class"===n)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");return i(c,r)}return"class"===n?r?o(c):l.bmp:(r?"[^":"[")+l.bmp+"]"}),{scope:"all",optionalFlags:"A",leadChar:"\\"}),e.addUnicodeData=function(n){for(var u=void 0,r=0;r\\x5E`\\x7C~\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20be\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83b[\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\x24\xa2-\xa5\u058f\u060b\u09f2\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20be\ua838\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\x5E`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u309b\u309c\ua700-\ua716\ua720\ua721\ua789\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3",astral:"\ud83c[\udffb-\udfff]"},{name:"Sm",alias:"Math_Symbol",bmp:"\\x2B<->\\x7C~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec",astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"\xa6\xa9\xae\xb0\u0482\u058d\u058e\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u214a\u214c\u214d\u214f\u218a\u218b\u2195-\u2199\u219c-\u219f\u21a1\u21a2\u21a4\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udffa]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Z",alias:"Separator",bmp:" \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:" \xa0\u1680\u2000-\u200a\u202f\u205f\u3000"}])},e.exports=t.default},541:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");var t=[{name:"ASCII",bmp:"\0-\x7f"},{name:"Alphabetic",bmp:"A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0345\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05b0-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0657\u0659-\u065f\u066e-\u06d3\u06d5-\u06dc\u06e1-\u06e8\u06ed-\u06ef\u06fa-\u06fc\u06ff\u0710-\u073f\u074d-\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0817\u081a-\u082c\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08df\u08e3-\u08e9\u08f0-\u093b\u093d-\u094c\u094e-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c4\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac5\u0ac7-\u0ac9\u0acb\u0acc\u0ad0\u0ae0-\u0ae3\u0af9\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d-\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4c\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccc\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e46\u0e4d\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ecd\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f71-\u0f81\u0f88-\u0f97\u0f99-\u0fbc\u1000-\u1036\u1038\u103b-\u103f\u1050-\u1062\u1065-\u1068\u106e-\u1086\u108e\u109c\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135f\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17b3\u17b6-\u17c8\u17d7\u17dc\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u1938\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a61-\u1a74\u1aa7\u1b00-\u1b33\u1b35-\u1b43\u1b45-\u1b4b\u1b80-\u1ba9\u1bac-\u1baf\u1bba-\u1be5\u1be7-\u1bf1\u1c00-\u1c35\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1de7-\u1df4\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua674-\ua67b\ua67f-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua827\ua840-\ua873\ua880-\ua8c3\ua8c5\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua92a\ua930-\ua952\ua960-\ua97c\ua980-\ua9b2\ua9b4-\ua9bf\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a\uaa7e-\uaabe\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc00-\udc45\udc82-\udcb8\udcd0-\udce8\udd00-\udd32\udd50-\udd72\udd76\udd80-\uddbf\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude34\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udee8\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d-\udf44\udf47\udf48\udf4b\udf4c\udf50\udf57\udf5d-\udf63]|\ud805[\udc00-\udc41\udc43-\udc45\udc47-\udc4a\udc80-\udcc1\udcc4\udcc5\udcc7\udd80-\uddb5\uddb8-\uddbe\uddd8-\udddd\ude00-\ude3e\ude40\ude44\ude80-\udeb5\udf00-\udf19\udf1d-\udf2a]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc3e\udc40\udc72-\udc8f\udc92-\udca7\udca9-\udcb6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf36\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9e]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd47]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Any",isBmpLast:!0,bmp:"\0-\uffff",astral:"[\ud800-\udbff][\udc00-\udfff]"},{name:"Default_Ignorable_Code_Point",bmp:"\xad\u034f\u061c\u115f\u1160\u17b4\u17b5\u180b-\u180e\u200b-\u200f\u202a-\u202e\u2060-\u206f\u3164\ufe00-\ufe0f\ufeff\uffa0\ufff0-\ufff8",astral:"\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|[\udb40-\udb43][\udc00-\udfff]"},{name:"Lowercase",bmp:"a-z\xaa\xb5\xba\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02b8\u02c0\u02c1\u02e0-\u02e4\u0345\u0371\u0373\u0377\u037a-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0561-\u0587\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1dbf\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u2071\u207f\u2090-\u209c\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2170-\u217f\u2184\u24d0-\u24e9\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7d\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b-\ua69d\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7b5\ua7b7\ua7f8-\ua7fa\uab30-\uab5a\uab5c-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a",astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud83a[\udd22-\udd43]"},{name:"Noncharacter_Code_Point",bmp:"\ufdd0-\ufdef\ufffe\uffff",astral:"[\ud83f\ud87f\ud8bf\ud8ff\ud93f\ud97f\ud9bf\ud9ff\uda3f\uda7f\udabf\udaff\udb3f\udb7f\udbbf\udbff][\udffe\udfff]"},{name:"Uppercase",bmp:"A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2160-\u216f\u2183\u24b6-\u24cf\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\uff21-\uff3a",astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]"},{name:"White_Space",bmp:"\t-\r \x85\xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"}];t.push({name:"Assigned",inverseOf:"Cn"}),e.addUnicodeData(t)},e.exports=t.default},542:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");e.addUnicodeData([{name:"Adlam",astral:"\ud83a[\udd00-\udd4a\udd50-\udd59\udd5e\udd5f]"},{name:"Ahom",astral:"\ud805[\udf00-\udf19\udf1d-\udf2b\udf30-\udf3f]"},{name:"Anatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude46]"},{name:"Arabic",bmp:"\u0600-\u0604\u0606-\u060b\u060d-\u061a\u061e\u0620-\u063f\u0641-\u064a\u0656-\u066f\u0671-\u06dc\u06de-\u06ff\u0750-\u077f\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08e1\u08e3-\u08ff\ufb50-\ufbc1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfd\ufe70-\ufe74\ufe76-\ufefc",astral:"\ud803[\ude60-\ude7e]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb\udef0\udef1]"},{name:"Armenian",bmp:"\u0531-\u0556\u0559-\u055f\u0561-\u0587\u058a\u058d-\u058f\ufb13-\ufb17"},{name:"Avestan",astral:"\ud802[\udf00-\udf35\udf39-\udf3f]"},{name:"Balinese",bmp:"\u1b00-\u1b4b\u1b50-\u1b7c"},{name:"Bamum",bmp:"\ua6a0-\ua6f7",astral:"\ud81a[\udc00-\ude38]"},{name:"Bassa_Vah",astral:"\ud81a[\uded0-\udeed\udef0-\udef5]"},{name:"Batak",bmp:"\u1bc0-\u1bf3\u1bfc-\u1bff"},{name:"Bengali",bmp:"\u0980-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09fb"},{name:"Bhaiksuki",astral:"\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc45\udc50-\udc6c]"},{name:"Bopomofo",bmp:"\u02ea\u02eb\u3105-\u312d\u31a0-\u31ba"},{name:"Brahmi",astral:"\ud804[\udc00-\udc4d\udc52-\udc6f\udc7f]"},{name:"Braille",bmp:"\u2800-\u28ff"},{name:"Buginese",bmp:"\u1a00-\u1a1b\u1a1e\u1a1f"},{name:"Buhid",bmp:"\u1740-\u1753"},{name:"Canadian_Aboriginal",bmp:"\u1400-\u167f\u18b0-\u18f5"},{name:"Carian",astral:"\ud800[\udea0-\uded0]"},{name:"Caucasian_Albanian",astral:"\ud801[\udd30-\udd63\udd6f]"},{name:"Chakma",astral:"\ud804[\udd00-\udd34\udd36-\udd43]"},{name:"Cham",bmp:"\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f"},{name:"Cherokee",bmp:"\u13a0-\u13f5\u13f8-\u13fd\uab70-\uabbf"},{name:"Common",bmp:"\0-@\\x5B-`\\x7B-\xa9\xab-\xb9\xbb-\xbf\xd7\xf7\u02b9-\u02df\u02e5-\u02e9\u02ec-\u02ff\u0374\u037e\u0385\u0387\u0589\u0605\u060c\u061b\u061c\u061f\u0640\u06dd\u08e2\u0964\u0965\u0e3f\u0fd5-\u0fd8\u10fb\u16eb-\u16ed\u1735\u1736\u1802\u1803\u1805\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u2000-\u200b\u200e-\u2064\u2066-\u2070\u2074-\u207e\u2080-\u208e\u20a0-\u20be\u2100-\u2125\u2127-\u2129\u212c-\u2131\u2133-\u214d\u214f-\u215f\u2189-\u218b\u2190-\u23fe\u2400-\u2426\u2440-\u244a\u2460-\u27ff\u2900-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2e00-\u2e44\u2ff0-\u2ffb\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303c-\u303f\u309b\u309c\u30a0\u30fb\u30fc\u3190-\u319f\u31c0-\u31e3\u3220-\u325f\u327f-\u32cf\u3358-\u33ff\u4dc0-\u4dff\ua700-\ua721\ua788-\ua78a\ua830-\ua839\ua92e\ua9cf\uab5b\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe66\ufe68-\ufe6b\ufeff\uff01-\uff20\uff3b-\uff40\uff5b-\uff65\uff70\uff9e\uff9f\uffe0-\uffe6\uffe8-\uffee\ufff9-\ufffd",astral:"\ud800[\udd00-\udd02\udd07-\udd33\udd37-\udd3f\udd90-\udd9b\uddd0-\uddfc\udee1-\udefb]|\ud82f[\udca0-\udca3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd66\udd6a-\udd7a\udd83\udd84\udd8c-\udda9\uddae-\udde8\udf00-\udf56\udf60-\udf71]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udfcb\udfce-\udfff]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd00-\udd0c\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\uddff\ude01\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|\udb40[\udc01\udc20-\udc7f]"},{name:"Coptic",bmp:"\u03e2-\u03ef\u2c80-\u2cf3\u2cf9-\u2cff"},{name:"Cuneiform",astral:"\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc70-\udc74\udc80-\udd43]"},{name:"Cypriot",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f]"},{name:"Cyrillic",bmp:"\u0400-\u0484\u0487-\u052f\u1c80-\u1c88\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f"},{name:"Deseret",astral:"\ud801[\udc00-\udc4f]"},{name:"Devanagari",bmp:"\u0900-\u0950\u0953-\u0963\u0966-\u097f\ua8e0-\ua8fd"},{name:"Duployan",astral:"\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9c-\udc9f]"},{name:"Egyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]"},{name:"Elbasan",astral:"\ud801[\udd00-\udd27]"},{name:"Ethiopic",bmp:"\u1200-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u137c\u1380-\u1399\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e"},{name:"Georgian",bmp:"\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u10ff\u2d00-\u2d25\u2d27\u2d2d"},{name:"Glagolitic",bmp:"\u2c00-\u2c2e\u2c30-\u2c5e",astral:"\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]"},{name:"Gothic",astral:"\ud800[\udf30-\udf4a]"},{name:"Grantha",astral:"\ud804[\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3c-\udf44\udf47\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]"},{name:"Greek",bmp:"\u0370-\u0373\u0375-\u0377\u037a-\u037d\u037f\u0384\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03e1\u03f0-\u03ff\u1d26-\u1d2a\u1d5d-\u1d61\u1d66-\u1d6a\u1dbf\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2126\uab65",astral:"\ud800[\udd40-\udd8e\udda0]|\ud834[\ude00-\ude45]"},{name:"Gujarati",bmp:"\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0af1\u0af9"},{name:"Gurmukhi",bmp:"\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75"},{name:"Han",bmp:"\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u3005\u3007\u3021-\u3029\u3038-\u303b\u3400-\u4db5\u4e00-\u9fd5\uf900-\ufa6d\ufa70-\ufad9",astral:"[\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Hangul",bmp:"\u1100-\u11ff\u302e\u302f\u3131-\u318e\u3200-\u321e\u3260-\u327e\ua960-\ua97c\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"},{name:"Hanunoo",bmp:"\u1720-\u1734"},{name:"Hatran",astral:"\ud802[\udce0-\udcf2\udcf4\udcf5\udcfb-\udcff]"},{name:"Hebrew",bmp:"\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufb4f"},{name:"Hiragana",bmp:"\u3041-\u3096\u309d-\u309f",astral:"\ud82c\udc01|\ud83c\ude00"},{name:"Imperial_Aramaic",astral:"\ud802[\udc40-\udc55\udc57-\udc5f]"},{name:"Inherited",bmp:"\u0300-\u036f\u0485\u0486\u064b-\u0655\u0670\u0951\u0952\u1ab0-\u1abe\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u200c\u200d\u20d0-\u20f0\u302a-\u302d\u3099\u309a\ufe00-\ufe0f\ufe20-\ufe2d",astral:"\ud800[\uddfd\udee0]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad]|\udb40[\udd00-\uddef]"},{name:"Inscriptional_Pahlavi",astral:"\ud802[\udf60-\udf72\udf78-\udf7f]"},{name:"Inscriptional_Parthian",astral:"\ud802[\udf40-\udf55\udf58-\udf5f]"},{name:"Javanese",bmp:"\ua980-\ua9cd\ua9d0-\ua9d9\ua9de\ua9df"},{name:"Kaithi",astral:"\ud804[\udc80-\udcc1]"},{name:"Kannada",bmp:"\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2"},{name:"Katakana",bmp:"\u30a1-\u30fa\u30fd-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff6f\uff71-\uff9d",astral:"\ud82c\udc00"},{name:"Kayah_Li",bmp:"\ua900-\ua92d\ua92f"},{name:"Kharoshthi",astral:"\ud802[\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f-\ude47\ude50-\ude58]"},{name:"Khmer",bmp:"\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9\u19e0-\u19ff"},{name:"Khojki",astral:"\ud804[\ude00-\ude11\ude13-\ude3e]"},{name:"Khudawadi",astral:"\ud804[\udeb0-\udeea\udef0-\udef9]"},{name:"Lao",bmp:"\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf"},{name:"Latin",bmp:"A-Za-z\xaa\xba\xc0-\xd6\xd8-\xf6\xf8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua7ff\uab30-\uab5a\uab5c-\uab64\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a"},{name:"Lepcha",bmp:"\u1c00-\u1c37\u1c3b-\u1c49\u1c4d-\u1c4f"},{name:"Limbu",bmp:"\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1940\u1944-\u194f"},{name:"Linear_A",astral:"\ud801[\ude00-\udf36\udf40-\udf55\udf60-\udf67]"},{name:"Linear_B",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa]"},{name:"Lisu",bmp:"\ua4d0-\ua4ff"},{name:"Lycian",astral:"\ud800[\ude80-\ude9c]"},{name:"Lydian",astral:"\ud802[\udd20-\udd39\udd3f]"},{name:"Mahajani",astral:"\ud804[\udd50-\udd76]"},{name:"Malayalam",bmp:"\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4f\u0d54-\u0d63\u0d66-\u0d7f"},{name:"Mandaic",bmp:"\u0840-\u085b\u085e"},{name:"Manichaean",astral:"\ud802[\udec0-\udee6\udeeb-\udef6]"},{name:"Marchen",astral:"\ud807[\udc70-\udc8f\udc92-\udca7\udca9-\udcb6]"},{name:"Meetei_Mayek",bmp:"\uaae0-\uaaf6\uabc0-\uabed\uabf0-\uabf9"},{name:"Mende_Kikakui",astral:"\ud83a[\udc00-\udcc4\udcc7-\udcd6]"},{name:"Meroitic_Cursive",astral:"\ud802[\udda0-\uddb7\uddbc-\uddcf\uddd2-\uddff]"},{name:"Meroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"Miao",astral:"\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]"},{name:"Modi",astral:"\ud805[\ude00-\ude44\ude50-\ude59]"},{name:"Mongolian",bmp:"\u1800\u1801\u1804\u1806-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18aa",astral:"\ud805[\ude60-\ude6c]"},{name:"Mro",astral:"\ud81a[\ude40-\ude5e\ude60-\ude69\ude6e\ude6f]"},{name:"Multani",astral:"\ud804[\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea9]"},{name:"Myanmar",bmp:"\u1000-\u109f\ua9e0-\ua9fe\uaa60-\uaa7f"},{name:"Nabataean",astral:"\ud802[\udc80-\udc9e\udca7-\udcaf]"},{name:"New_Tai_Lue",bmp:"\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de\u19df"},{name:"Newa",astral:"\ud805[\udc00-\udc59\udc5b\udc5d]"},{name:"Nko",bmp:"\u07c0-\u07fa"},{name:"Ogham",bmp:"\u1680-\u169c"},{name:"Ol_Chiki",bmp:"\u1c50-\u1c7f"},{name:"Old_Hungarian",astral:"\ud803[\udc80-\udcb2\udcc0-\udcf2\udcfa-\udcff]"},{name:"Old_Italic",astral:"\ud800[\udf00-\udf23]"},{name:"Old_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"Old_Permic",astral:"\ud800[\udf50-\udf7a]"},{name:"Old_Persian",astral:"\ud800[\udfa0-\udfc3\udfc8-\udfd5]"},{name:"Old_South_Arabian",astral:"\ud802[\ude60-\ude7f]"},{name:"Old_Turkic",astral:"\ud803[\udc00-\udc48]"},{name:"Oriya",bmp:"\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b77"},{name:"Osage",astral:"\ud801[\udcb0-\udcd3\udcd8-\udcfb]"},{name:"Osmanya",astral:"\ud801[\udc80-\udc9d\udca0-\udca9]"},{name:"Pahawh_Hmong",astral:"\ud81a[\udf00-\udf45\udf50-\udf59\udf5b-\udf61\udf63-\udf77\udf7d-\udf8f]"},{name:"Palmyrene",astral:"\ud802[\udc60-\udc7f]"},{name:"Pau_Cin_Hau",astral:"\ud806[\udec0-\udef8]"},{name:"Phags_Pa",bmp:"\ua840-\ua877"},{name:"Phoenician",astral:"\ud802[\udd00-\udd1b\udd1f]"},{name:"Psalter_Pahlavi",astral:"\ud802[\udf80-\udf91\udf99-\udf9c\udfa9-\udfaf]"},{name:"Rejang",bmp:"\ua930-\ua953\ua95f"},{name:"Runic",bmp:"\u16a0-\u16ea\u16ee-\u16f8"},{name:"Samaritan",bmp:"\u0800-\u082d\u0830-\u083e"},{name:"Saurashtra",bmp:"\ua880-\ua8c5\ua8ce-\ua8d9"},{name:"Sharada",astral:"\ud804[\udd80-\uddcd\uddd0-\udddf]"},{name:"Shavian",astral:"\ud801[\udc50-\udc7f]"},{name:"Siddham",astral:"\ud805[\udd80-\uddb5\uddb8-\udddd]"},{name:"SignWriting",astral:"\ud836[\udc00-\ude8b\ude9b-\ude9f\udea1-\udeaf]"},{name:"Sinhala",bmp:"\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4",astral:"\ud804[\udde1-\uddf4]"},{name:"Sora_Sompeng",astral:"\ud804[\udcd0-\udce8\udcf0-\udcf9]"},{name:"Sundanese",bmp:"\u1b80-\u1bbf\u1cc0-\u1cc7"},{name:"Syloti_Nagri",bmp:"\ua800-\ua82b"},{name:"Syriac",bmp:"\u0700-\u070d\u070f-\u074a\u074d-\u074f"},{name:"Tagalog",bmp:"\u1700-\u170c\u170e-\u1714"},{name:"Tagbanwa",bmp:"\u1760-\u176c\u176e-\u1770\u1772\u1773"},{name:"Tai_Le",bmp:"\u1950-\u196d\u1970-\u1974"},{name:"Tai_Tham",bmp:"\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad"},{name:"Tai_Viet",bmp:"\uaa80-\uaac2\uaadb-\uaadf"},{name:"Takri",astral:"\ud805[\ude80-\udeb7\udec0-\udec9]"},{name:"Tamil",bmp:"\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bfa"},{name:"Tangut",astral:"\ud81b\udfe0|[\ud81c-\ud820][\udc00-\udfff]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]"},{name:"Telugu",bmp:"\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f"},{name:"Thaana",bmp:"\u0780-\u07b1"},{name:"Thai",bmp:"\u0e01-\u0e3a\u0e40-\u0e5b"},{name:"Tibetan",bmp:"\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc\u0fce-\u0fd4\u0fd9\u0fda"},{name:"Tifinagh",bmp:"\u2d30-\u2d67\u2d6f\u2d70\u2d7f"},{name:"Tirhuta",astral:"\ud805[\udc80-\udcc7\udcd0-\udcd9]"},{name:"Ugaritic",astral:"\ud800[\udf80-\udf9d\udf9f]"},{name:"Vai",bmp:"\ua500-\ua62b"},{name:"Warang_Citi",astral:"\ud806[\udca0-\udcf2\udcff]"},{name:"Yi",bmp:"\ua000-\ua48c\ua490-\ua4c6"}])},e.exports=t.default},543:function(e,t,n){"use strict";var u=n(0),r=n.n(u);t.a=function(e){var t=e.text;return r.a.createElement("section",{className:"empty"},r.a.createElement("div",{className:"icon"},r.a.createElement("img",{src:"/img/logo-square.svg",alt:"The Qovery Logo"})),r.a.createElement("div",{className:"text"},t))}},544:function(e,t,n){"use strict";var u=n(545),r=n(555),a=n(511);e.exports={formats:a,parse:r,stringify:u}},545:function(e,t,n){"use strict";var u=n(546),r=n(518),a=n(511),d=Object.prototype.hasOwnProperty,o={brackets:function(e){return e+"[]"},comma:"comma",indices:function(e,t){return e+"["+t+"]"},repeat:function(e){return e}},i=Array.isArray,c=String.prototype.split,l=Array.prototype.push,f=function(e,t){l.apply(e,i(t)?t:[t])},s=Date.prototype.toISOString,p=a.default,m={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:r.encode,encodeValuesOnly:!1,format:p,formatter:a.formatters[p],indices:!1,serializeDate:function(e){return s.call(e)},skipNulls:!1,strictNullHandling:!1},h={},b=function e(t,n,a,d,o,l,s,p,b,v,g,y,_,E,w,D){for(var k,x=t,S=D,C=0,O=!1;void 0!==(S=S.get(h))&&!O;){var I=S.get(t);if(C+=1,void 0!==I){if(I===C)throw new RangeError("Cyclic object value");O=!0}void 0===S.get(h)&&(C=0)}if("function"==typeof p?x=p(n,x):x instanceof Date?x=g(x):"comma"===a&&i(x)&&(x=r.maybeMap(x,(function(e){return e instanceof Date?g(e):e}))),null===x){if(o)return s&&!E?s(n,m.encoder,w,"key",y):n;x=""}if("string"==typeof(k=x)||"number"==typeof k||"boolean"==typeof k||"symbol"==typeof k||"bigint"==typeof k||r.isBuffer(x)){if(s){var A=E?n:s(n,m.encoder,w,"key",y);if("comma"===a&&E){for(var j=c.call(String(x),","),N="",F=0;F0?x.join(",")||null:void 0}];else if(i(p))T=p;else{var M=Object.keys(x);T=b?M.sort(b):M}for(var R=d&&i(x)&&1===x.length?n+"[]":n,L=0;L0?E+_:""}},546:function(e,t,n){"use strict";var u=n(509),r=n(551),a=n(553),d=u("%TypeError%"),o=u("%WeakMap%",!0),i=u("%Map%",!0),c=r("WeakMap.prototype.get",!0),l=r("WeakMap.prototype.set",!0),f=r("WeakMap.prototype.has",!0),s=r("Map.prototype.get",!0),p=r("Map.prototype.set",!0),m=r("Map.prototype.has",!0),h=function(e,t){for(var n,u=e;null!==(n=u.next);u=n)if(n.key===t)return u.next=n.next,n.next=e.next,e.next=n,n};e.exports=function(){var e,t,n,u={assert:function(e){if(!u.has(e))throw new d("Side channel does not contain "+a(e))},get:function(u){if(o&&u&&("object"==typeof u||"function"==typeof u)){if(e)return c(e,u)}else if(i){if(t)return s(t,u)}else if(n)return function(e,t){var n=h(e,t);return n&&n.value}(n,u)},has:function(u){if(o&&u&&("object"==typeof u||"function"==typeof u)){if(e)return f(e,u)}else if(i){if(t)return m(t,u)}else if(n)return function(e,t){return!!h(e,t)}(n,u);return!1},set:function(u,r){o&&u&&("object"==typeof u||"function"==typeof u)?(e||(e=new o),l(e,u,r)):i?(t||(t=new i),p(t,u,r)):(n||(n={key:{},next:null}),function(e,t,n){var u=h(e,t);u?u.value=n:e.next={key:t,next:e.next,value:n}}(n,u,r))}};return u}},547:function(e,t,n){"use strict";var u="undefined"!=typeof Symbol&&Symbol,r=n(548);e.exports=function(){return"function"==typeof u&&("function"==typeof Symbol&&("symbol"==typeof u("foo")&&("symbol"==typeof Symbol("bar")&&r())))}},548:function(e,t,n){"use strict";e.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var e={},t=Symbol("test"),n=Object(t);if("string"==typeof t)return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;if("[object Symbol]"!==Object.prototype.toString.call(n))return!1;for(t in e[t]=42,e)return!1;if("function"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var u=Object.getOwnPropertySymbols(e);if(1!==u.length||u[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var r=Object.getOwnPropertyDescriptor(e,t);if(42!==r.value||!0!==r.enumerable)return!1}return!0}},549:function(e,t,n){"use strict";var u="Function.prototype.bind called on incompatible ",r=Array.prototype.slice,a=Object.prototype.toString;e.exports=function(e){var t=this;if("function"!=typeof t||"[object Function]"!==a.call(t))throw new TypeError(u+t);for(var n,d=r.call(arguments,1),o=function(){if(this instanceof n){var u=t.apply(this,d.concat(r.call(arguments)));return Object(u)===u?u:this}return t.apply(e,d.concat(r.call(arguments)))},i=Math.max(0,t.length-d.length),c=[],l=0;l-1?r(n):n}},552:function(e,t,n){"use strict";var u=n(510),r=n(509),a=r("%Function.prototype.apply%"),d=r("%Function.prototype.call%"),o=r("%Reflect.apply%",!0)||u.call(d,a),i=r("%Object.getOwnPropertyDescriptor%",!0),c=r("%Object.defineProperty%",!0),l=r("%Math.max%");if(c)try{c({},"a",{value:1})}catch(s){c=null}e.exports=function(e){var t=o(u,d,arguments);if(i&&c){var n=i(t,"length");n.configurable&&c(t,"length",{value:1+l(0,e.length-(arguments.length-1))})}return t};var f=function(){return o(u,a,arguments)};c?c(e.exports,"apply",{value:f}):e.exports.apply=f},553:function(e,t,n){var u="function"==typeof Map&&Map.prototype,r=Object.getOwnPropertyDescriptor&&u?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,a=u&&r&&"function"==typeof r.get?r.get:null,d=u&&Map.prototype.forEach,o="function"==typeof Set&&Set.prototype,i=Object.getOwnPropertyDescriptor&&o?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,c=o&&i&&"function"==typeof i.get?i.get:null,l=o&&Set.prototype.forEach,f="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,s="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,p="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,m=Boolean.prototype.valueOf,h=Object.prototype.toString,b=Function.prototype.toString,v=String.prototype.match,g=String.prototype.slice,y=String.prototype.replace,_=String.prototype.toUpperCase,E=String.prototype.toLowerCase,w=RegExp.prototype.test,D=Array.prototype.concat,k=Array.prototype.join,x=Array.prototype.slice,S=Math.floor,C="function"==typeof BigInt?BigInt.prototype.valueOf:null,O=Object.getOwnPropertySymbols,I="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,A="function"==typeof Symbol&&"object"==typeof Symbol.iterator,j="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===A||"symbol")?Symbol.toStringTag:null,N=Object.prototype.propertyIsEnumerable,F=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(e){return e.__proto__}:null);function T(e,t){if(e===1/0||e===-1/0||e!=e||e&&e>-1e3&&e<1e3||w.call(/e/,t))return t;var n=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof e){var u=e<0?-S(-e):S(e);if(u!==e){var r=String(u),a=g.call(t,r.length+1);return y.call(r,n,"$&_")+"."+y.call(y.call(a,/([0-9]{3})/g,"$&_"),/_$/,"")}}return y.call(t,n,"$&_")}var P=n(554),M=P.custom,R=W(M)?M:null;function L(e,t,n){var u="double"===(n.quoteStyle||t)?'"':"'";return u+e+u}function B(e){return y.call(String(e),/"/g,""")}function z(e){return!("[object Array]"!==q(e)||j&&"object"==typeof e&&j in e)}function U(e){return!("[object RegExp]"!==q(e)||j&&"object"==typeof e&&j in e)}function W(e){if(A)return e&&"object"==typeof e&&e instanceof Symbol;if("symbol"==typeof e)return!0;if(!e||"object"!=typeof e||!I)return!1;try{return I.call(e),!0}catch(t){}return!1}e.exports=function e(t,n,u,r){var o=n||{};if($(o,"quoteStyle")&&"single"!==o.quoteStyle&&"double"!==o.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if($(o,"maxStringLength")&&("number"==typeof o.maxStringLength?o.maxStringLength<0&&o.maxStringLength!==1/0:null!==o.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var i=!$(o,"customInspect")||o.customInspect;if("boolean"!=typeof i&&"symbol"!==i)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if($(o,"indent")&&null!==o.indent&&"\t"!==o.indent&&!(parseInt(o.indent,10)===o.indent&&o.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if($(o,"numericSeparator")&&"boolean"!=typeof o.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var h=o.numericSeparator;if(void 0===t)return"undefined";if(null===t)return"null";if("boolean"==typeof t)return t?"true":"false";if("string"==typeof t)return function e(t,n){if(t.length>n.maxStringLength){var u=t.length-n.maxStringLength,r="... "+u+" more character"+(u>1?"s":"");return e(g.call(t,0,n.maxStringLength),n)+r}return L(y.call(y.call(t,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,V),"single",n)}(t,o);if("number"==typeof t){if(0===t)return 1/0/t>0?"0":"-0";var _=String(t);return h?T(t,_):_}if("bigint"==typeof t){var w=String(t)+"n";return h?T(t,w):w}var S=void 0===o.depth?5:o.depth;if(void 0===u&&(u=0),u>=S&&S>0&&"object"==typeof t)return z(t)?"[Array]":"[Object]";var O=function(e,t){var n;if("\t"===e.indent)n="\t";else{if(!("number"==typeof e.indent&&e.indent>0))return null;n=k.call(Array(e.indent+1)," ")}return{base:n,prev:k.call(Array(t+1),n)}}(o,u);if(void 0===r)r=[];else if(G(r,t)>=0)return"[Circular]";function M(t,n,a){if(n&&(r=x.call(r)).push(n),a){var d={depth:o.depth};return $(o,"quoteStyle")&&(d.quoteStyle=o.quoteStyle),e(t,d,u+1,r)}return e(t,o,u+1,r)}if("function"==typeof t&&!U(t)){var H=function(e){if(e.name)return e.name;var t=v.call(b.call(e),/^function\s*([\w$]+)/);if(t)return t[1];return null}(t),Q=X(t,M);return"[Function"+(H?": "+H:" (anonymous)")+"]"+(Q.length>0?" { "+k.call(Q,", ")+" }":"")}if(W(t)){var ee=A?y.call(String(t),/^(Symbol\(.*\))_[^)]*$/,"$1"):I.call(t);return"object"!=typeof t||A?ee:K(ee)}if(function(e){if(!e||"object"!=typeof e)return!1;if("undefined"!=typeof HTMLElement&&e instanceof HTMLElement)return!0;return"string"==typeof e.nodeName&&"function"==typeof e.getAttribute}(t)){for(var te="<"+E.call(String(t.nodeName)),ne=t.attributes||[],ue=0;ue"}if(z(t)){if(0===t.length)return"[]";var re=X(t,M);return O&&!function(e){for(var t=0;t=0)return!1;return!0}(re)?"["+Y(re,O)+"]":"[ "+k.call(re,", ")+" ]"}if(function(e){return!("[object Error]"!==q(e)||j&&"object"==typeof e&&j in e)}(t)){var ae=X(t,M);return"cause"in Error.prototype||!("cause"in t)||N.call(t,"cause")?0===ae.length?"["+String(t)+"]":"{ ["+String(t)+"] "+k.call(ae,", ")+" }":"{ ["+String(t)+"] "+k.call(D.call("[cause]: "+M(t.cause),ae),", ")+" }"}if("object"==typeof t&&i){if(R&&"function"==typeof t[R]&&P)return P(t,{depth:S-u});if("symbol"!==i&&"function"==typeof t.inspect)return t.inspect()}if(function(e){if(!a||!e||"object"!=typeof e)return!1;try{a.call(e);try{c.call(e)}catch(te){return!0}return e instanceof Map}catch(t){}return!1}(t)){var de=[];return d.call(t,(function(e,n){de.push(M(n,t,!0)+" => "+M(e,t))})),J("Map",a.call(t),de,O)}if(function(e){if(!c||!e||"object"!=typeof e)return!1;try{c.call(e);try{a.call(e)}catch(t){return!0}return e instanceof Set}catch(n){}return!1}(t)){var oe=[];return l.call(t,(function(e){oe.push(M(e,t))})),J("Set",c.call(t),oe,O)}if(function(e){if(!f||!e||"object"!=typeof e)return!1;try{f.call(e,f);try{s.call(e,s)}catch(te){return!0}return e instanceof WeakMap}catch(t){}return!1}(t))return Z("WeakMap");if(function(e){if(!s||!e||"object"!=typeof e)return!1;try{s.call(e,s);try{f.call(e,f)}catch(te){return!0}return e instanceof WeakSet}catch(t){}return!1}(t))return Z("WeakSet");if(function(e){if(!p||!e||"object"!=typeof e)return!1;try{return p.call(e),!0}catch(t){}return!1}(t))return Z("WeakRef");if(function(e){return!("[object Number]"!==q(e)||j&&"object"==typeof e&&j in e)}(t))return K(M(Number(t)));if(function(e){if(!e||"object"!=typeof e||!C)return!1;try{return C.call(e),!0}catch(t){}return!1}(t))return K(M(C.call(t)));if(function(e){return!("[object Boolean]"!==q(e)||j&&"object"==typeof e&&j in e)}(t))return K(m.call(t));if(function(e){return!("[object String]"!==q(e)||j&&"object"==typeof e&&j in e)}(t))return K(M(String(t)));if(!function(e){return!("[object Date]"!==q(e)||j&&"object"==typeof e&&j in e)}(t)&&!U(t)){var ie=X(t,M),ce=F?F(t)===Object.prototype:t instanceof Object||t.constructor===Object,le=t instanceof Object?"":"null prototype",fe=!ce&&j&&Object(t)===t&&j in t?g.call(q(t),8,-1):le?"Object":"",se=(ce||"function"!=typeof t.constructor?"":t.constructor.name?t.constructor.name+" ":"")+(fe||le?"["+k.call(D.call([],fe||[],le||[]),": ")+"] ":"");return 0===ie.length?se+"{}":O?se+"{"+Y(ie,O)+"}":se+"{ "+k.call(ie,", ")+" }"}return String(t)};var H=Object.prototype.hasOwnProperty||function(e){return e in this};function $(e,t){return H.call(e,t)}function q(e){return h.call(e)}function G(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,u=e.length;n-1?e.split(","):e},c=function(e,t,n,u){if(e){var a=n.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e,d=/(\[[^[\]]*])/g,o=n.depth>0&&/(\[[^[\]]*])/.exec(a),c=o?a.slice(0,o.index):a,l=[];if(c){if(!n.plainObjects&&r.call(Object.prototype,c)&&!n.allowPrototypes)return;l.push(c)}for(var f=0;n.depth>0&&null!==(o=d.exec(a))&&f=0;--a){var d,o=e[a];if("[]"===o&&n.parseArrays)d=[].concat(r);else{d=n.plainObjects?Object.create(null):{};var c="["===o.charAt(0)&&"]"===o.charAt(o.length-1)?o.slice(1,-1):o,l=parseInt(c,10);n.parseArrays||""!==c?!isNaN(l)&&o!==c&&String(l)===c&&l>=0&&n.parseArrays&&l<=n.arrayLimit?(d=[])[l]=r:"__proto__"!==c&&(d[c]=r):d={0:r}}r=d}return r}(l,t,n,u)}};e.exports=function(e,t){var n=function(e){if(!e)return d;if(null!==e.decoder&&void 0!==e.decoder&&"function"!=typeof e.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var t=void 0===e.charset?d.charset:e.charset;return{allowDots:void 0===e.allowDots?d.allowDots:!!e.allowDots,allowPrototypes:"boolean"==typeof e.allowPrototypes?e.allowPrototypes:d.allowPrototypes,allowSparse:"boolean"==typeof e.allowSparse?e.allowSparse:d.allowSparse,arrayLimit:"number"==typeof e.arrayLimit?e.arrayLimit:d.arrayLimit,charset:t,charsetSentinel:"boolean"==typeof e.charsetSentinel?e.charsetSentinel:d.charsetSentinel,comma:"boolean"==typeof e.comma?e.comma:d.comma,decoder:"function"==typeof e.decoder?e.decoder:d.decoder,delimiter:"string"==typeof e.delimiter||u.isRegExp(e.delimiter)?e.delimiter:d.delimiter,depth:"number"==typeof e.depth||!1===e.depth?+e.depth:d.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof e.interpretNumericEntities?e.interpretNumericEntities:d.interpretNumericEntities,parameterLimit:"number"==typeof e.parameterLimit?e.parameterLimit:d.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:"boolean"==typeof e.plainObjects?e.plainObjects:d.plainObjects,strictNullHandling:"boolean"==typeof e.strictNullHandling?e.strictNullHandling:d.strictNullHandling}}(t);if(""===e||null==e)return n.plainObjects?Object.create(null):{};for(var l="string"==typeof e?function(e,t){var n,c={},l=t.ignoreQueryPrefix?e.replace(/^\?/,""):e,f=t.parameterLimit===1/0?void 0:t.parameterLimit,s=l.split(t.delimiter,f),p=-1,m=t.charset;if(t.charsetSentinel)for(n=0;n-1&&(b=a(b)?[b]:b),r.call(c,h)?c[h]=u.combine(c[h],b):c[h]=b}return c}(e,n):e,f=n.plainObjects?Object.create(null):{},s=Object.keys(l),p=0;p'},heart:{width:12,height:16,path:''},eye:{width:16,height:16,path:''},star:{width:14,height:16,path:''},"repo-forked":{width:10,height:16,path:''},"repo-template":{width:14,height:16,path:''},"issue-opened":{width:14,height:16,path:''},"cloud-download":{width:16,height:16,path:''}},g={},y=function(e,t){var n=g[e]||(g[e]=[]);if(!(n.push(t)>1)){var u=function(e){var t;return function(){t||(t=1,e.apply(this,arguments))}}((function(){for(delete g[e];t=n.shift();)t.apply(null,arguments)}));if(l){var r=new d;s(r,"abort",u),s(r,"error",u),s(r,"load",(function(){var e;try{e=JSON.parse(r.responseText)}catch(t){return void u(t)}u(200!==r.status,e)})),r.open("GET",e),r.send()}else{var a=this||window;a._=function(e){a._=null,u(200!==e.meta.status,e.data)};var i=o(a.document)("script",{async:!0,src:e+(/\?/.test(e)?"&":"?")+"callback=_"}),c=function(){a._&&a._({meta:{}})};s(i,"load",c),s(i,"error",c),i.readyState&&function(e,t,n){var u=function(r){if(t.test(e.readyState))return p(e,"readystatechange",u),n(r)};s(e,"readystatechange",u)}(i,/de|m/,c),a.document.getElementsByTagName("head")[0].appendChild(i)}}},E=function(e,t,n){var u=o(e.ownerDocument),r=e.appendChild(u("style",{type:"text/css"})),a="body{margin:0}a{text-decoration:none;outline:0}.widget{display:inline-block;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:0;white-space:nowrap}.btn,.social-count{position:relative;display:inline-block;height:14px;padding:2px 5px;font-size:11px;font-weight:600;line-height:14px;vertical-align:bottom;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-repeat:repeat-x;background-position:-1px -1px;background-size:110% 110%;border:1px solid}.btn{border-radius:.25em}.btn:not(:last-child){border-radius:.25em 0 0 .25em}.social-count{border-left:0;border-radius:0 .25em .25em 0}.widget-lg .btn,.widget-lg .social-count{height:20px;padding:3px 10px;font-size:12px;line-height:20px}.octicon{display:inline-block;vertical-align:text-top;fill:currentColor}"+b(t["data-color-scheme"]);r.styleSheet?r.styleSheet.cssText=a:r.appendChild(e.ownerDocument.createTextNode(a));var d,i,l=u("a",{className:"btn",href:t.href,target:"_blank",rel:"noopener",innerHTML:(d=t["data-icon"],i=/^large$/i.test(t["data-size"])?16:14,d=(""+d).toLowerCase().replace(/^octicon-/,""),c(v,d)||(d="mark-github"),'"),"aria-label":t["aria-label"]||void 0},[" ",u("span",{},[t["data-text"]||""])]),f=e.appendChild(u("div",{className:"widget"+(/^large$/i.test(t["data-size"])?" widget-lg":"")},[l])),s=l.hostname.split(".").reverse();if(""===s[0]&&s.shift(),"com"!==s[0]||"github"!==s[1])return l.href="#",l.target="_self",void n(f);var p=s.length,m=(" /"+l.pathname).split(/\/+/);if(((2===p||3===p&&"gist"===s[2])&&"archive"===m[3]||2===p&&"releases"===m[3]&&"download"===m[4]||3===p&&"codeload"===s[2])&&(l.target="_top"),/^true$/i.test(t["data-show-count"])&&2===p){var h,g;if(!m[2]&&m[1])h=g="followers";else if(!m[3]&&m[2])g="stargazers_count",h="stargazers";else if(m[4]||"subscription"!==m[3])if(m[4]||"fork"!==m[3]){if("issues"!==m[3])return void n(f);g="open_issues_count",h="issues"}else g="forks_count",h="network/members";else g="subscribers_count",h="watchers";var _=m[2]?"/repos/"+m[1]+"/"+m[2]:"/users/"+m[1];y.call(this,"https://api.github.com"+_,(function(e,t){if(!e){var r=t[g];f.appendChild(u("a",{className:"social-count",href:t.html_url+"/"+h,target:"_blank",rel:"noopener","aria-label":r+" "+g.replace(/_count$/,"").replace("_"," ").slice(0,r<2?-1:void 0)+" on GitHub"},[(""+r).replace(/\B(?=(\d{3})+(?!\d))/g,",")]))}n(f)}))}else n(f)},w=window.devicePixelRatio||1,D=function(e){return(w>1?r.ceil(r.round(e*w)/w*2)/2:r.ceil(e))||0},k=function(e,t){e.style.width=t[0]+"px",e.style.height=t[1]+"px"},x=function(e,t){if(null!=e&&null!=t)if(e.getAttribute&&(e=function(e){for(var t={href:e.href,title:e.title,"aria-label":e.getAttribute("aria-label")},n=["icon","color-scheme","text","size","show-count"],u=0,r=n.length;u0){var n=t[0];return{x:n.clientX,y:n.clientY}}var u=e.pageX;if(void 0!==u)return{x:u,y:e.pageY}}return{x:0,y:0}}},567:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(470),d=n(463),o=n.n(d);n(147);t.a=function(e){var t=e.className,n=e.previous,u=e.next;return r.a.createElement("nav",{className:o()("pagination-nav",t)},r.a.createElement("div",{className:"pagination-nav__item"},n&&r.a.createElement(a.a,{className:"pagination-nav__link",to:n.permalink},r.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Previous"),r.a.createElement("h4",{className:"pagination-nav__link--label"},"\xab ",n.title))),r.a.createElement("div",{className:"pagination-nav__item pagination-nav__item--next"},u&&r.a.createElement(a.a,{className:"pagination-nav__link",to:u.permalink},r.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Next"),r.a.createElement("h4",{className:"pagination-nav__link--label"},u.title," \xbb"))))}},568:function(e,t,n){"use strict";var u=n(0);t.a=function(e,t,n){var r=Object(u.useState)(void 0),a=r[0],d=r[1];Object(u.useEffect)((function(){var u=[],r=[];function o(){var o=function(){var e=0,t=null;for(u=document.getElementsByClassName("anchor");e=0&&a<=n&&(t=r),e+=1}return t}();if(o){var i=0,c=!1;for(r=document.getElementsByClassName(e);i0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var e=this,t="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[t?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=r()(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=r()(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":a(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function(){return this._target}}]),e}(),i=n(1),c=n.n(i),l=n(2),f=n.n(l),s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===s(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=f()(e,"click",(function(e){return t.onClick(e)}))}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new o({action:this.action(t),target:this.target(t),text:this.text(t),container:this.container,trigger:t,emitter:this})}},{key:"defaultAction",value:function(e){return h("action",e)}},{key:"defaultTarget",value:function(e){var t=h("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return h("text",e)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach((function(e){n=n&&!!document.queryCommandSupported(e)})),n}}]),t}(c.a);function h(e,t){var n="data-clipboard-"+e;if(t.hasAttribute(n))return t.getAttribute(n)}t.default=m}]).default},e.exports=u()},572:function(e,t){e.exports.parse=function(e){var t=e.split(",").map((function(e){return function(e){if(/^-?\d+$/.test(e))return parseInt(e,10);var t;if(t=e.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){var n=t[1],u=t[2],r=t[3];if(n&&r){var a=[],d=(n=parseInt(n))<(r=parseInt(r))?1:-1;"-"!=u&&".."!=u&&"\u2025"!=u||(r+=d);for(var o=n;o!=r;o+=d)a.push(o);return a}}return[]}(e)}));return 0===t.length?[]:1===t.length?Array.isArray(t[0])?t[0]:t:t.reduce((function(e,t){return Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]),e.concat(t)}))}},573:function(e,t){!function(e){function t(e){return RegExp("(^(?:"+e+"):[ \t]*(?![ \t]))[^]+","i")}e.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:e.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:t(/Content-Security-Policy/.source),lookbehind:!0,alias:["csp","languages-csp"],inside:e.languages.csp},{pattern:t(/Public-Key-Pins(?:-Report-Only)?/.source),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:e.languages.hpkp},{pattern:t(/Strict-Transport-Security/.source),lookbehind:!0,alias:["hsts","languages-hsts"],inside:e.languages.hsts},{pattern:t(/[^:]+/.source),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var n,u=e.languages,r={"application/javascript":u.javascript,"application/json":u.json||u.javascript,"application/xml":u.xml,"text/xml":u.xml,"text/html":u.html,"text/css":u.css,"text/plain":u.plain},a={"application/json":!0,"application/xml":!0};function d(e){var t=e.replace(/^[a-z]+\//,"");return"(?:"+e+"|"+("\\w+/(?:[\\w.-]+\\+)+"+t+"(?![+\\w.-])")+")"}for(var o in r)if(r[o]){n=n||{};var i=a[o]?d(o):o;n[o.replace(/\//g,"-")]={pattern:RegExp("("+/content-type:\s*/.source+i+/(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source+")"+/[^ \t\w-][\s\S]*/.source,"i"),lookbehind:!0,inside:r[o]}}n&&e.languages.insertBefore("http","header",n)}(Prism)},574:function(e,t){Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}},575:function(e,t){!function(e){var t=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};t.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:t},boolean:t.boolean,variable:t.variable}}(Prism)},576:function(e,t){!function(e){var t=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:t}},builtin:t,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism)},577:function(e,t){!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},578:function(e,t){!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},579:function(e,t){!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,u={pattern:RegExp(n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[u,{pattern:RegExp(n+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:u.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":u,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},580:function(e,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},581:function(e,t){!function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],u=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,r=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,a=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:u,operator:r,punctuation:a};var d={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:d}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:d}}];e.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:u,operator:r,punctuation:a}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){if(/<\?/.test(t.code)){e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(Prism)},582:function(e,t){!function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,u="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",r=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function d(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return u})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return u}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return u})).replace(/<>/g,(function(){return"(?:"+r+"|"+a+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:d(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:d(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:d(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:d(a),lookbehind:!0,greedy:!0},number:{pattern:d(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism)},583:function(e,t){e.exports={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]}},584:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.canUseDOM=void 0;var u,r=n(605);var a=((u=r)&&u.__esModule?u:{default:u}).default,d=a.canUseDOM?window.HTMLElement:{};t.canUseDOM=a.canUseDOM;t.default=d},585:function(e,t,n){"use strict";var u=n(28),r=n(57);e.exports=function(e,t,n){t in e?u.f(e,t,r(0,n)):e[t]=n}},586:function(e,t,n){"use strict";var u=n(28).f,r=n(89),a=n(82),d=n(30),o=n(80),i=n(81),c=n(61),l=n(88),f=n(94),s=n(10),p=n(531).fastKey,m=n(532),h=s?"_s":"size",b=function(e,t){var n,u=p(t);if("F"!==u)return e._i[u];for(n=e._f;n;n=n.n)if(n.k==t)return n};e.exports={getConstructor:function(e,t,n,c){var l=e((function(e,u){o(e,l,t,"_i"),e._t=t,e._i=r(null),e._f=void 0,e._l=void 0,e[h]=0,null!=u&&i(u,n,e[c],e)}));return a(l.prototype,{clear:function(){for(var e=m(this,t),n=e._i,u=e._f;u;u=u.n)u.r=!0,u.p&&(u.p=u.p.n=void 0),delete n[u.i];e._f=e._l=void 0,e[h]=0},delete:function(e){var n=m(this,t),u=b(n,e);if(u){var r=u.n,a=u.p;delete n._i[u.i],u.r=!0,a&&(a.n=r),r&&(r.p=a),n._f==u&&(n._f=r),n._l==u&&(n._l=a),n[h]--}return!!u},forEach:function(e){m(this,t);for(var n,u=d(e,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(u(n.v,n.k,this);n&&n.r;)n=n.p},has:function(e){return!!b(m(this,t),e)}}),s&&u(l.prototype,"size",{get:function(){return m(this,t)[h]}}),l},def:function(e,t,n){var u,r,a=b(e,t);return a?a.v=n:(e._l=a={i:r=p(t,!0),k:t,v:n,p:u=e._l,n:void 0,r:!1},e._f||(e._f=a),u&&(u.n=a),e[h]++,"F"!==r&&(e._i[r]=a)),e},getEntry:b,setStrong:function(e,t,n){c(e,t,(function(e,n){this._t=m(e,t),this._k=n,this._l=void 0}),(function(){for(var e=this._k,t=this._l;t&&t.r;)t=t.p;return this._t&&(this._l=t=t?t.n:this._t._f)?l(0,"keys"==e?t.k:"values"==e?t.v:[t.k,t.v]):(this._t=void 0,l(1))}),n?"entries":"values",!n,!0),f(t)}}},587:function(e,t,n){"use strict";var u=n(5),r=n(12),a=n(16),d=n(82),o=n(531),i=n(81),c=n(80),l=n(13),f=n(14),s=n(83),p=n(41),m=n(588);e.exports=function(e,t,n,h,b,v){var g=u[e],y=g,_=b?"set":"add",E=y&&y.prototype,w={},D=function(e){var t=E[e];a(E,e,"delete"==e||"has"==e?function(e){return!(v&&!l(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return v&&!l(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if("function"==typeof y&&(v||E.forEach&&!f((function(){(new y).entries().next()})))){var k=new y,x=k[_](v?{}:-0,1)!=k,S=f((function(){k.has(1)})),C=s((function(e){new y(e)})),O=!v&&f((function(){for(var e=new y,t=5;t--;)e[_](t,t);return!e.has(-0)}));C||((y=t((function(t,n){c(t,y,e);var u=m(new g,t,y);return null!=n&&i(n,b,u[_],u),u}))).prototype=E,E.constructor=y),(S||O)&&(D("delete"),D("has"),b&&D("get")),(O||x)&&D(_),v&&E.clear&&delete E.clear}else y=h.getConstructor(t,e,b,_),d(y.prototype,n),o.NEED=!0;return p(y,e),w[e]=y,r(r.G+r.W+r.F*(y!=g),w),v||h.setStrong(y,e,b),y}},588:function(e,t,n){var u=n(13),r=n(589).set;e.exports=function(e,t,n){var a,d=t.constructor;return d!==n&&"function"==typeof d&&(a=d.prototype)!==n.prototype&&u(a)&&r&&r(e,a),e}},589:function(e,t,n){var u=n(13),r=n(8),a=function(e,t){if(r(e),!u(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,u){try{(u=n(30)(Function.call,n(590).f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(r){t=!0}return function(e,n){return a(e,n),t?e.__proto__=n:u(e,n),e}}({},!1):void 0),check:a}},590:function(e,t,n){var u=n(62),r=n(57),a=n(33),d=n(87),o=n(31),i=n(86),c=Object.getOwnPropertyDescriptor;t.f=n(10)?c:function(e,t){if(e=a(e),t=d(t,!0),i)try{return c(e,t)}catch(n){}if(o(e,t))return r(!u.f.call(e,t),e[t])}},591:function(e,t,n){"use strict";var u=n(12),r=n(32),a=n(27),d=n(14),o=[].sort,i=[1,2,3];u(u.P+u.F*(d((function(){i.sort(void 0)}))||!d((function(){i.sort(null)}))||!n(592)(o)),"Array",{sort:function(e){return void 0===e?o.call(a(this)):o.call(a(this),r(e))}})},592:function(e,t,n){"use strict";var u=n(14);e.exports=function(e,t){return!!e&&u((function(){t?e.call(null,(function(){}),1):e.call(null)}))}},601:function(e,t,n){"use strict";n(529),n(79),n(530),n(591),n(29),n(22),n(21),n(85),n(481);var u=n(1),r=(n(488),n(489),n(77),n(468),n(0)),a=n.n(r),d=n(521),o=n.n(d);n(150);var i=function(e){var t=e.humanize,n=e.icon,u=e.values,r=e.currentState,d=e.setState;if(0==u.size)return null;var i=Array.from(u);return a.a.createElement(a.a.Fragment,null,i.map((function(e,u){var i="string"==typeof e&&t?o()(e):e;return a.a.createElement("label",{key:u},a.a.createElement("input",{type:"checkbox",onChange:function(t){var n=new Set(r);t.currentTarget.checked?n.add(e):n.delete(e),d(n)},checked:r.has(e)}),i&&a.a.createElement(a.a.Fragment,null,n?a.a.createElement("i",{className:"feather icon-"+n}):""," ",i))})))},c=n(543),l=n(473),f=n(470),s=(n(484),n(491)),p=n.n(s),m=n(463),h=n.n(m),b=n(544),v=n.n(b),g=n(476);n(151);function y(e){var t=e.delivery_guarantee,n=e.description,u=e.event_types,r=e.function_category,d=(e.logo_path,e.name),o=e.pathTemplate,i=e.status,c=e.title,l=e.type,s=o;s||("source"==l&&(s="/docs/reference/sources//"),"transform"==l&&(s="/docs/reference/transforms//"),"sink"==l&&(s="/docs/reference/sinks//"));var p=s.replace("",d);return a.a.createElement(f.a,{to:p,className:"qovery-component",title:n},a.a.createElement("div",{className:"qovery-component--header"},a.a.createElement("div",{className:"qovery-component--name"},c)),a.a.createElement("div",{className:"qovery-component--badges"},"beta"==i?a.a.createElement("span",{className:"badge badge--warning",title:"This component is in beta and is not recommended for production environments"},a.a.createElement("i",{className:"feather icon-alert-triangle"})):a.a.createElement("span",{className:"badge badge--primary",title:"This component has passed reliability standards that make it production ready"},a.a.createElement("i",{className:"feather icon-award"})),"best_effort"==t?a.a.createElement("span",{className:"badge badge--warning",title:"This component makes a best-effort delivery guarantee, and in rare cases can lose data"},a.a.createElement("i",{className:"feather icon-shield-off"})):a.a.createElement("span",{className:"badge badge--primary",title:"This component offers an at-least-once delivery guarantee"},a.a.createElement("i",{className:"feather icon-shield"})),u.includes("log")?a.a.createElement("span",{className:"badge badge--primary",title:"This component works with log event types"},"log"):"",u.includes("metric")?a.a.createElement("span",{className:"badge badge--primary",title:"This component works with metric event types"},"metric"):"",a.a.createElement("span",{className:"badge badge--primary"},r)))}function _(e){var t=e.components,n=e.headingLevel,r=e.pathTemplate,d=e.titles,o=t.filter((function(e){return"source"==e.type})),i=t.filter((function(e){return"transform"==e.type})),f=t.filter((function(e){return"sink"==e.type})),s="h"+(n||3);return t.length>0?a.a.createElement(a.a.Fragment,null,o.length>0?a.a.createElement(a.a.Fragment,null,d&&a.a.createElement(s,null,o.length," Sources"),a.a.createElement("div",{className:"qovery-components--grid"},o.map((function(e,t){return a.a.createElement(y,Object(u.a)({key:t,pathTemplate:r},e))})))):"",i.length>0?a.a.createElement(a.a.Fragment,null,d&&a.a.createElement(s,null,i.length," Transforms"),a.a.createElement("div",{className:"qovery-components--grid"},i.map((function(e,t){return a.a.createElement(y,Object(u.a)({key:t,pathTemplate:r},e))})))):"",f.length>0?a.a.createElement(a.a.Fragment,null,d&&a.a.createElement(s,null,f.length," Sinks"),a.a.createElement("div",{className:"qovery-components--grid"},f.map((function(e,t){return a.a.createElement(y,Object(u.a)({key:t,pathTemplate:r},e))})))):"",a.a.createElement("hr",null),a.a.createElement(l.a,{to:"https://github.com/qovery/documentation/issues/new?labels=type%3A+new+feature",target:"_blank",rightIcon:"plus-circle"},"Request a new component")):a.a.createElement(c.a,{text:"no components found"})}t.a=function(e){var t=Object(g.a)().siteConfig.customFields.metadata,n=t.sources,u=t.transforms,d=t.sinks,o=e.titles||null==e.titles,c=1==e.filterColumn,l=e.pathTemplate,s=e.location?v.a.parse(e.location.search,{ignoreQueryPrefix:!0}):{},m=[];(e.sources||null==e.sources)&&(m=m.concat(Object.values(n))),(e.transforms||null==e.transforms)&&(m=m.concat(Object.values(u))),(e.sinks||null==e.sinks)&&(m=m.concat(Object.values(d))),m=m.sort((function(e,t){return e.name>t.name?1:-1}));var b=Object(r.useState)("true"==s["at-least-once"]),y=b[0],E=b[1],w=Object(r.useState)(new Set(s["event-types"]||e.eventTypes)),D=w[0],k=w[1],x=Object(r.useState)(new Set(s.functions)),S=x[0],C=x[1],O=Object(r.useState)(new Set(s["operating-systems"])),I=O[0],A=O[1],j=Object(r.useState)("true"==s["prod-ready"]),N=j[0],F=j[1],T=Object(r.useState)(new Set(s.providers)),P=T[0],M=T[1],R=Object(r.useState)(s.search),L=R[0],B=R[1];L&&(m=m.filter((function(e){return(e.name.toLowerCase()+" "+e.type.toLowerCase()).includes(L.toLowerCase())}))),y&&(m=m.filter((function(e){return"at_least_once"==e.delivery_guarantee}))),D.size>0&&(m=m.filter((function(e){return Array.from(D).some((function(t){return e.event_types.includes(t)}))}))),S.size>0&&(m=m.filter((function(e){return S.has(e.function_category)}))),I.size>0&&(m=m.filter((function(e){return Array.from(I).every((function(t){return e.operating_systems.includes(t)}))}))),N&&(m=m.filter((function(e){return"prod-ready"==e.status}))),P.size>0&&(m=m.filter((function(e){return Array.from(P).every((function(t){return e.service_providers&&e.service_providers.includes(t)}))}))),e.exceptNames&&e.exceptNames.length>0&&(m=m.filter((function(t){return!e.exceptNames.includes(t.name)}))),e.exceptFunctions&&e.exceptFunctions.length>0&&(m=m.filter((function(t){return!e.exceptFunctions.includes(t.function_category)})));var z=D.size>0?D:new Set(p()(m).map((function(e){return e.event_types})).flatten().uniq().compact().sort().value()),U=new Set(p()(m).map((function(e){return e.operating_systems})).flatten().uniq().compact().sort().value()),W=new Set(p()(m).map((function(e){return e.service_providers})).flatten().uniq().compact().sort().value()),H=new Set(p()(m).filter((function(e){return"source"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),$=new Set(p()(m).filter((function(e){return"transform"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),q=new Set(p()(m).filter((function(e){return"sink"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value());return a.a.createElement("div",{className:h()("qovery-components",{"qovery-components--cols":c})},a.a.createElement("div",{className:"filters"},a.a.createElement("div",{className:"search"},a.a.createElement("input",{className:"input--text input--lg",type:"text",onChange:function(e){return B(e.currentTarget.value)},placeholder:"\ud83d\udd0d Search..."})),a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},a.a.createElement(f.a,{to:"/docs/getting-started/data-model/",title:"Learn more about Qovery's event types"},"Event types ",a.a.createElement("i",{className:"feather icon-info"}))),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Event Types",icon:"database",values:z,humanize:!0,currentState:D,setState:k}))),a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},a.a.createElement(f.a,{to:"/docs/getting-started/whats-next/",title:"Learn more about Qovery's guarantees"},"Guarantees ",a.a.createElement("i",{className:"feather icon-info"}))),a.a.createElement("div",{className:"filter--choices"},a.a.createElement("label",{title:"Show only components that offer an at-least-once delivery guarantee."},a.a.createElement("input",{type:"checkbox",onChange:function(e){return E(e.currentTarget.checked)},checked:y}),a.a.createElement("i",{className:"feather icon-shield"})," At-least-once"),a.a.createElement("label",{title:"Show only production ready components."},a.a.createElement("input",{type:"checkbox",onChange:function(e){return F(e.currentTarget.checked)},checked:N}),a.a.createElement("i",{className:"feather icon-award"})," Prod-ready"))),H.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Source Functions"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Functions",icon:"settings",values:H,humanize:!0,currentState:S,setState:C}))),$.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Transform Functions"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Functions",icon:"settings",values:$,humanize:!0,currentState:S,setState:C}))),q.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Sink Functions"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Functions",icon:"settings",values:q,humanize:!0,currentState:S,setState:C}))),W.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Providers"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Providers",icon:"cloud",values:W,currentState:P,setState:M}))),U.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},a.a.createElement(f.a,{to:"/docs/setup/installation/operating-systems/",title:"Learn more about Qovery's operating systems"},"Operating Systems")),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Operating Systems",icon:"cpu",values:U,currentState:I,setState:A})))),a.a.createElement("div",{className:"qovery-components--results"},a.a.createElement(_,{components:m,headingLevel:e.headingLevel,pathTemplate:l,titles:o})))}},603:function(e,t,n){"use strict";n.d(t,"b",(function(){return d}));var u=n(53),r={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","at-rule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},a=n(0),d={Prism:u.a,theme:r};function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return(i=Object.assign||function(e){for(var t=1;t0&&e[n-1]===t?e:e.concat(t)},s=function(e,t){var n=e.plain,u=Object.create(null),r=e.styles.reduce((function(e,n){var u=n.languages,r=n.style;return u&&!u.includes(t)||n.types.forEach((function(t){var n=i({},e[t],r);e[t]=n})),e}),u);return r.root=n,r.plain=i({},n,{backgroundColor:null}),r};function p(e,t){var n={};for(var u in e)Object.prototype.hasOwnProperty.call(e,u)&&-1===t.indexOf(u)&&(n[u]=e[u]);return n}var m=function(e){function t(){for(var t=this,n=[],u=arguments.length;u--;)n[u]=arguments[u];e.apply(this,n),o(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?s(e.theme,e.language):void 0;return t.themeDict=n})),o(this,"getLineProps",(function(e){var n=e.key,u=e.className,r=e.style,a=i({},p(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),d=t.getThemeDict(t.props);return void 0!==d&&(a.style=d.plain),void 0!==r&&(a.style=void 0!==a.style?i({},a.style,r):r),void 0!==n&&(a.key=n),u&&(a.className+=" "+u),a})),o(this,"getStyleForToken",(function(e){var n=e.types,u=e.empty,r=n.length,a=t.getThemeDict(t.props);if(void 0!==a){if(1===r&&"plain"===n[0])return u?{display:"inline-block"}:void 0;if(1===r&&!u)return a[n[0]];var d=u?{display:"inline-block"}:{},o=n.map((function(e){return a[e]}));return Object.assign.apply(Object,[d].concat(o))}})),o(this,"getTokenProps",(function(e){var n=e.key,u=e.className,r=e.style,a=e.token,d=i({},p(e,["key","className","style","token"]),{className:"token "+a.types.join(" "),children:a.content,style:t.getStyleForToken(a),key:void 0});return void 0!==r&&(d.style=void 0!==d.style?i({},d.style,r):r),void 0!==n&&(d.key=n),u&&(d.className+=" "+u),d}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,u=e.code,r=e.children,a=this.getThemeDict(this.props),d=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],u=[0],r=[e.length],a=0,d=0,o=[],i=[o];d>-1;){for(;(a=u[d]++)0?p:["plain"],s=m):(p=f(p,m.type),m.alias&&(p=f(p,m.alias)),s=m.content),"string"==typeof s){var h=s.split(c),b=h.length;o.push({types:p,content:h[0]});for(var v=1;v=0)&&a(e,!n)}e.exports=t.default},608:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.assertNodeList=i,t.setElement=function(e){var t=e;if("string"==typeof t&&d.canUseDOM){var n=document.querySelectorAll(t);i(n,t),t="length"in n?n[0]:n}return o=t||o},t.validateElement=c,t.hide=function(e){c(e)&&(e||o).setAttribute("aria-hidden","true")},t.show=function(e){c(e)&&(e||o).removeAttribute("aria-hidden")},t.documentNotReadyOrSSRTesting=function(){o=null},t.resetForTesting=function(){o=null};var u,r=n(633),a=(u=r)&&u.__esModule?u:{default:u},d=n(584);var o=null;function i(e,t){if(!e||!e.length)throw new Error("react-modal: No elements were found for selector "+t+".")}function c(e){return!(!e&&!o)||((0,a.default)(!1,["react-modal: App element is not defined.","Please use `Modal.setAppElement(el)` or set `appElement={el}`.","This is needed so screen readers don't see main content","when modal is opened. It is not recommended, but you can opt-out","by setting `ariaHideApp={false}`."].join(" ")),!1)}},609:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=new function e(){var t=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.register=function(e){-1===t.openInstances.indexOf(e)&&(t.openInstances.push(e),t.emit("register"))},this.deregister=function(e){var n=t.openInstances.indexOf(e);-1!==n&&(t.openInstances.splice(n,1),t.emit("deregister"))},this.subscribe=function(e){t.subscribers.push(e)},this.emit=function(e){t.subscribers.forEach((function(n){return n(e,t.openInstances.slice())}))},this.openInstances=[],this.subscribers=[]};t.default=u,e.exports=t.default},628:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u,r=n(629),a=(u=r)&&u.__esModule?u:{default:u};t.default=a.default,e.exports=t.default},629:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.bodyOpenClassName=t.portalClassName=void 0;var u=Object.assign||function(e){for(var t=1;t0&&0===(g-=1)&&f.show(t),n.props.shouldFocusAfterRender&&(n.props.shouldReturnFocusAfterClose?(c.returnFocus(),c.teardownScopedFocus()):c.popWithoutFocus()),n.props.onAfterClose&&n.props.onAfterClose(),m.default.deregister(n)},n.open=function(){n.beforeOpen(),n.state.afterOpen&&n.state.beforeClose?(clearTimeout(n.closeTimer),n.setState({beforeClose:!1})):(n.props.shouldFocusAfterRender&&(c.setupScopedFocus(n.node),c.markForFocusLater()),n.setState({isOpen:!0},(function(){n.setState({afterOpen:!0}),n.props.isOpen&&n.props.onAfterOpen&&n.props.onAfterOpen({overlayEl:n.overlay,contentEl:n.content})})))},n.close=function(){n.props.closeTimeoutMS>0?n.closeWithTimeout():n.closeWithoutTimeout()},n.focusContent=function(){return n.content&&!n.contentHasFocus()&&n.content.focus()},n.closeWithTimeout=function(){var e=Date.now()+n.props.closeTimeoutMS;n.setState({beforeClose:!0,closesAt:e},(function(){n.closeTimer=setTimeout(n.closeWithoutTimeout,n.state.closesAt-Date.now())}))},n.closeWithoutTimeout=function(){n.setState({beforeClose:!1,isOpen:!1,afterOpen:!1,closesAt:null},n.afterClose)},n.handleKeyDown=function(e){9===e.keyCode&&(0,l.default)(n.content,e),n.props.shouldCloseOnEsc&&27===e.keyCode&&(e.stopPropagation(),n.requestClose(e))},n.handleOverlayOnClick=function(e){null===n.shouldClose&&(n.shouldClose=!0),n.shouldClose&&n.props.shouldCloseOnOverlayClick&&(n.ownerHandlesClose()?n.requestClose(e):n.focusContent()),n.shouldClose=null},n.handleContentOnMouseUp=function(){n.shouldClose=!1},n.handleOverlayOnMouseDown=function(e){n.props.shouldCloseOnOverlayClick||e.target!=n.overlay||e.preventDefault()},n.handleContentOnClick=function(){n.shouldClose=!1},n.handleContentOnMouseDown=function(){n.shouldClose=!1},n.requestClose=function(e){return n.ownerHandlesClose()&&n.props.onRequestClose(e)},n.ownerHandlesClose=function(){return n.props.onRequestClose},n.shouldBeClosed=function(){return!n.state.isOpen&&!n.state.beforeClose},n.contentHasFocus=function(){return document.activeElement===n.content||n.content.contains(document.activeElement)},n.buildClassName=function(e,t){var u="object"===(void 0===t?"undefined":r(t))?t:{base:v[e],afterOpen:v[e]+"--after-open",beforeClose:v[e]+"--before-close"},a=u.base;return n.state.afterOpen&&(a=a+" "+u.afterOpen),n.state.beforeClose&&(a=a+" "+u.beforeClose),"string"==typeof t&&t?a+" "+t:a},n.attributesFromObject=function(e,t){return Object.keys(t).reduce((function(n,u){return n[e+"-"+u]=t[u],n}),{})},n.state={afterOpen:!1,beforeClose:!1},n.shouldClose=null,n.moveFromContentToOverlay=null,n}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),a(t,[{key:"componentDidMount",value:function(){this.props.isOpen&&this.open()}},{key:"componentDidUpdate",value:function(e,t){this.props.isOpen&&!e.isOpen?this.open():!this.props.isOpen&&e.isOpen&&this.close(),this.props.shouldFocusAfterRender&&this.state.isOpen&&!t.isOpen&&this.focusContent()}},{key:"componentWillUnmount",value:function(){this.state.isOpen&&this.afterClose(),clearTimeout(this.closeTimer)}},{key:"beforeOpen",value:function(){var e=this.props,t=e.appElement,n=e.ariaHideApp,u=e.htmlOpenClassName,r=e.bodyOpenClassName;r&&s.add(document.body,r),u&&s.add(document.getElementsByTagName("html")[0],u),n&&(g+=1,f.hide(t)),m.default.register(this)}},{key:"render",value:function(){var e=this.props,t=e.id,n=e.className,r=e.overlayClassName,a=e.defaultStyles,d=n?{}:a.content,i=r?{}:a.overlay;return this.shouldBeClosed()?null:o.default.createElement("div",{ref:this.setOverlayRef,className:this.buildClassName("overlay",r),style:u({},i,this.props.style.overlay),onClick:this.handleOverlayOnClick,onMouseDown:this.handleOverlayOnMouseDown},o.default.createElement("div",u({id:t,ref:this.setContentRef,style:u({},d,this.props.style.content),className:this.buildClassName("content",n),tabIndex:"-1",onKeyDown:this.handleKeyDown,onMouseDown:this.handleContentOnMouseDown,onMouseUp:this.handleContentOnMouseUp,onClick:this.handleContentOnClick,role:this.props.role,"aria-label":this.props.contentLabel},this.attributesFromObject("aria",this.props.aria||{}),this.attributesFromObject("data",this.props.data||{}),{"data-testid":this.props.testId}),this.props.children))}}]),t}(d.Component);y.defaultProps={style:{overlay:{},content:{}},defaultStyles:{}},y.propTypes={isOpen:i.default.bool.isRequired,defaultStyles:i.default.shape({content:i.default.object,overlay:i.default.object}),style:i.default.shape({content:i.default.object,overlay:i.default.object}),className:i.default.oneOfType([i.default.string,i.default.object]),overlayClassName:i.default.oneOfType([i.default.string,i.default.object]),bodyOpenClassName:i.default.string,htmlOpenClassName:i.default.string,ariaHideApp:i.default.bool,appElement:i.default.instanceOf(p.default),onAfterOpen:i.default.func,onAfterClose:i.default.func,onRequestClose:i.default.func,closeTimeoutMS:i.default.number,shouldFocusAfterRender:i.default.bool,shouldCloseOnOverlayClick:i.default.bool,shouldReturnFocusAfterClose:i.default.bool,role:i.default.string,contentLabel:i.default.string,aria:i.default.object,data:i.default.object,children:i.default.node,shouldCloseOnEsc:i.default.bool,overlayRef:i.default.func,contentRef:i.default.func,id:i.default.string,testId:i.default.string},t.default=y,e.exports=t.default},631:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.handleBlur=c,t.handleFocus=l,t.markForFocusLater=function(){d.push(document.activeElement)},t.returnFocus=function(){var e=null;try{return void(0!==d.length&&(e=d.pop()).focus())}catch(t){console.warn(["You tried to return focus to",e,"but it is not in the DOM anymore"].join(" "))}},t.popWithoutFocus=function(){d.length>0&&d.pop()},t.setupScopedFocus=function(e){o=e,window.addEventListener?(window.addEventListener("blur",c,!1),document.addEventListener("focus",l,!0)):(window.attachEvent("onBlur",c),document.attachEvent("onFocus",l))},t.teardownScopedFocus=function(){o=null,window.addEventListener?(window.removeEventListener("blur",c),document.removeEventListener("focus",l)):(window.detachEvent("onBlur",c),document.detachEvent("onFocus",l))};var u,r=n(607),a=(u=r)&&u.__esModule?u:{default:u};var d=[],o=null,i=!1;function c(){i=!0}function l(){if(i){if(i=!1,!o)return;setTimeout((function(){o.contains(document.activeElement)||((0,a.default)(o)[0]||o).focus()}),0)}}},632:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n=(0,a.default)(e);if(!n.length)return void t.preventDefault();var u=void 0,r=t.shiftKey,d=n[0],o=n[n.length-1];if(e===document.activeElement){if(!r)return;u=o}o!==document.activeElement||r||(u=d);d===document.activeElement&&r&&(u=o);if(u)return t.preventDefault(),void u.focus();var i=/(\bChrome\b|\bSafari\b)\//.exec(navigator.userAgent);if(null==i||"Chrome"==i[1]||null!=/\biPod\b|\biPad\b/g.exec(navigator.userAgent))return;var c=n.indexOf(document.activeElement);c>-1&&(c+=r?-1:1);if(void 0===(u=n[c]))return t.preventDefault(),void(u=r?o:d).focus();t.preventDefault(),u.focus()};var u,r=n(607),a=(u=r)&&u.__esModule?u:{default:u};e.exports=t.default},633:function(e,t,n){"use strict";var u=function(){};e.exports=u},634:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.dumpClassLists=function(){0};var u={},r={};t.add=function(e,t){return n=e.classList,a="html"==e.nodeName.toLowerCase()?u:r,void t.split(" ").forEach((function(e){!function(e,t){e[t]||(e[t]=0),e[t]+=1}(a,e),n.add(e)}));var n,a},t.remove=function(e,t){return n=e.classList,a="html"==e.nodeName.toLowerCase()?u:r,void t.split(" ").forEach((function(e){!function(e,t){e[t]&&(e[t]-=1)}(a,e),0===a[e]&&n.remove(e)}));var n,a}},635:function(e,t,n){"use strict";var u,r=n(609),a=(u=r)&&u.__esModule?u:{default:u};var d=void 0,o=void 0,i=[];function c(){0!==i.length&&i[i.length-1].focusContent()}a.default.subscribe((function(e,t){d&&o||((d=document.createElement("div")).setAttribute("data-react-modal-body-trap",""),d.style.position="absolute",d.style.opacity="0",d.setAttribute("tabindex","0"),d.addEventListener("focus",c),(o=d.cloneNode()).addEventListener("focus",c)),(i=t).length>0?(document.body.firstChild!==d&&document.body.insertBefore(d,document.body.firstChild),document.body.lastChild!==o&&document.body.appendChild(o)):(d.parentElement&&d.parentElement.removeChild(d),o.parentElement&&o.parentElement.removeChild(o))}))},636:function(e,t,n){"use strict";function u(){var e=this.constructor.getDerivedStateFromProps(this.props,this.state);null!=e&&this.setState(e)}function r(e){this.setState(function(t){var n=this.constructor.getDerivedStateFromProps(e,t);return null!=n?n:null}.bind(this))}function a(e,t){try{var n=this.props,u=this.state;this.props=e,this.state=t,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(n,u)}finally{this.props=n,this.state=u}}function d(e){var t=e.prototype;if(!t||!t.isReactComponent)throw new Error("Can only polyfill class components");if("function"!=typeof e.getDerivedStateFromProps&&"function"!=typeof t.getSnapshotBeforeUpdate)return e;var n=null,d=null,o=null;if("function"==typeof t.componentWillMount?n="componentWillMount":"function"==typeof t.UNSAFE_componentWillMount&&(n="UNSAFE_componentWillMount"),"function"==typeof t.componentWillReceiveProps?d="componentWillReceiveProps":"function"==typeof t.UNSAFE_componentWillReceiveProps&&(d="UNSAFE_componentWillReceiveProps"),"function"==typeof t.componentWillUpdate?o="componentWillUpdate":"function"==typeof t.UNSAFE_componentWillUpdate&&(o="UNSAFE_componentWillUpdate"),null!==n||null!==d||null!==o){var i=e.displayName||e.name,c="function"==typeof e.getDerivedStateFromProps?"getDerivedStateFromProps()":"getSnapshotBeforeUpdate()";throw Error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n"+i+" uses "+c+" but also contains the following legacy lifecycles:"+(null!==n?"\n "+n:"")+(null!==d?"\n "+d:"")+(null!==o?"\n "+o:"")+"\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://fb.me/react-async-component-lifecycle-hooks")}if("function"==typeof e.getDerivedStateFromProps&&(t.componentWillMount=u,t.componentWillReceiveProps=r),"function"==typeof t.getSnapshotBeforeUpdate){if("function"!=typeof t.componentDidUpdate)throw new Error("Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype");t.componentWillUpdate=a;var l=t.componentDidUpdate;t.componentDidUpdate=function(e,t,n){var u=this.__reactInternalSnapshotFlag?this.__reactInternalSnapshot:n;l.call(this,e,t,u)}}return e}n.r(t),n.d(t,"polyfill",(function(){return d})),u.__suppressDeprecationWarning=!0,r.__suppressDeprecationWarning=!0,a.__suppressDeprecationWarning=!0},637:function(e,t,n){var u;!function(r){"use strict";var a,d,o,i=(a=/d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZWN]|"[^"]*"|'[^']*'/g,d=/\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,o=/[^-+\dA-Z]/g,function(e,t,n,u){if(1!==arguments.length||"string"!==s(e)||/\d/.test(e)||(t=e,e=void 0),(e=e||new Date)instanceof Date||(e=new Date(e)),isNaN(e))throw TypeError("Invalid date");var r=(t=String(i.masks[t]||t||i.masks.default)).slice(0,4);"UTC:"!==r&&"GMT:"!==r||(t=t.slice(4),n=!0,"GMT:"===r&&(u=!0));var p=n?"getUTC":"get",m=e[p+"Date"](),h=e[p+"Day"](),b=e[p+"Month"](),v=e[p+"FullYear"](),g=e[p+"Hours"](),y=e[p+"Minutes"](),_=e[p+"Seconds"](),E=e[p+"Milliseconds"](),w=n?0:e.getTimezoneOffset(),D=l(e),k=f(e),x={d:m,dd:c(m),ddd:i.i18n.dayNames[h],dddd:i.i18n.dayNames[h+7],m:b+1,mm:c(b+1),mmm:i.i18n.monthNames[b],mmmm:i.i18n.monthNames[b+12],yy:String(v).slice(2),yyyy:v,h:g%12||12,hh:c(g%12||12),H:g,HH:c(g),M:y,MM:c(y),s:_,ss:c(_),l:c(E,3),L:c(Math.round(E/10)),t:g<12?i.i18n.timeNames[0]:i.i18n.timeNames[1],tt:g<12?i.i18n.timeNames[2]:i.i18n.timeNames[3],T:g<12?i.i18n.timeNames[4]:i.i18n.timeNames[5],TT:g<12?i.i18n.timeNames[6]:i.i18n.timeNames[7],Z:u?"GMT":n?"UTC":(String(e).match(d)||[""]).pop().replace(o,""),o:(w>0?"-":"+")+c(100*Math.floor(Math.abs(w)/60)+Math.abs(w)%60,4),S:["th","st","nd","rd"][m%10>3?0:(m%100-m%10!=10)*m%10],W:D,N:k};return t.replace(a,(function(e){return e in x?x[e]:e.slice(1,e.length-1)}))});function c(e,t){for(e=String(e),t=t||2;e.length/":G?V="/guides/integrate/sources/"+G.name+"//":H&&(V="/guides/integrate/sinks//");var K=H?"/guides/integrate/sources//"+H.name+"/":"/guides/integrate/sources//",Z=Object(u.useState)(!1),J=Z[0],Y=Z[1],X=Object(u.useState)(!1),Q=X[0],ee=X[1];return Object(O.a)("contents__link","contents__link--active",100),r.a.createElement(l.a,{title:v,description:v+", in minutes, for free"},J&&r.a.createElement(p.a,{className:"modal",onRequestClose:function(){return Y(!1)},overlayClassName:"modal-overlay",isOpen:null!==J,contentLabel:"Minimal Modal Example"},r.a.createElement("header",null,r.a.createElement("h1",null,"Where do you receive your data from?")),r.a.createElement(_.a,{exceptFunctions:["test"],exceptNames:[G&&G.name,"docker","qovery"],eventTypes:H&&H.event_types,pathTemplate:K,titles:!1,sources:!0,transforms:!1,sinks:!1})),Q&&r.a.createElement(p.a,{className:"modal",onRequestClose:function(){return ee(!1)},overlayClassName:"modal-overlay",isOpen:null!==Q,contentLabel:"Minimal Modal Example"},r.a.createElement("header",null,r.a.createElement("h1",null,"Where do you want to send your data?")),r.a.createElement(_.a,{exceptFunctions:["test"],exceptNames:[H&&H.name,"qovery"],eventTypes:G&&G.event_types,pathTemplate:V,titles:!1,sources:!1,transforms:!1,sinks:!0})),r.a.createElement("header",{className:"hero domain-bg domain-bg--"+M},r.a.createElement("div",{className:"container"},(z||G||H)&&r.a.createElement("div",{className:"component-icons"},z&&r.a.createElement("div",{className:"icon panel"},z.logo_path?r.a.createElement(g.a,{src:z.logo_path,alt:z.title+" Logo"}):r.a.createElement("i",{className:"feather icon-server"})),G&&!z&&r.a.createElement("div",{className:"icon panel link",title:"Change your source",onClick:function(e){return Y(!0)}},G.logo_path?r.a.createElement(g.a,{src:G.logo_path,alt:G.title+" Logo"}):r.a.createElement("i",{className:"feather icon-server"})),!G&&!z&&r.a.createElement("div",{className:"icon panel link",title:"Select a source",onClick:function(e){return Y(!0)}},r.a.createElement("i",{className:"feather icon-plus"})),H&&r.a.createElement("div",{className:"icon panel link",title:"Change your destination",onClick:function(e){return ee(!0)}},H.logo_path?r.a.createElement(g.a,{src:H.logo_path,alt:H.title+" Logo"}):r.a.createElement("i",{className:"feather icon-database"})),!H&&r.a.createElement("div",{className:"icon panel link",title:"Select a destination",onClick:function(e){return ee(!0)}},r.a.createElement("i",{className:"feather icon-plus"}))),!z&&!G&&!H&&r.a.createElement("div",{className:"hero--category"},r.a.createElement(f.a,{to:E[0].permalink+"/"},E[0].name)),r.a.createElement("h1",{className:C.a.header},v),r.a.createElement("div",{className:"hero--subtitle"},n.description),r.a.createElement(y.a,{colorProfile:"guides",tags:D}))),r.a.createElement("main",{className:d()("container","container--l",C.a.container)},r.a.createElement("aside",{className:C.a.sidebar},r.a.createElement("section",{className:C.a.avatar},r.a.createElement(i,{bio:!0,github:c,size:"lg",rel:"author",subTitle:!1,vertical:!0})),r.a.createElement("section",{className:d()("table-of-contents",C.a.tableOfContents)},r.a.createElement("div",{className:"section"},r.a.createElement("div",{className:"title"},"Stats"),r.a.createElement("div",{className:"text--secondary text--bold"},r.a.createElement("i",{className:"feather icon-book"})," ",w),r.a.createElement("div",{className:"text--secondary text--bold"},r.a.createElement("i",{className:"feather icon-clock"})," Updated ",r.a.createElement("time",{pubdate:"pubdate",dateTime:s},k()(R,"mmm dS, yyyy")))),t.rightToc.length>0&&r.a.createElement("div",{className:"section"},r.a.createElement("div",{className:"title"},"Contents"),r.a.createElement(I,{headings:t.rightToc})))),r.a.createElement("div",{className:C.a.article},r.a.createElement("article",null,r.a.createElement("div",{className:"markdown"},r.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"anchor",id:"overview"}),r.a.createElement(h.a,{components:m.a},r.a.createElement(t,null)))),!n.hide_pagination&&r.a.createElement(b.a,{previous:a.prevItem,next:a.nextItem,className:C.a.paginator}))))}},464:function(e,t,n){"use strict";n(466);var u=n(0),r=n.n(u),a=n(463),d=n.n(a);n(132);t.a=function(e){var t=e.children,n=e.classNames,u=e.fill,a=e.icon,o=e.type,i=null;switch(o){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return r.a.createElement("div",{className:d()(n,"alert","alert--"+o,{"alert--fill":u,"alert--icon":!1!==a}),role:"alert"},!1!==a&&r.a.createElement("i",{className:d()("feather","icon-"+(a||i))}),t)}},468:function(e,t,n){var u=n(28).f,r=Function.prototype,a=/^\s*function ([^ (]*)/;"name"in r||n(10)&&u(r,"name",{configurable:!0,get:function(){try{return(""+this).match(a)[1]}catch(e){return""}}})},473:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(470),d=n(463),o=n.n(d);n(134);t.a=function(e){var t=e.children,n=e.className,u=e.badge,d=e.leftIcon,i=e.rightIcon,c=e.size,l=e.target,f=e.to,s=o()("jump-to","jump-to--"+c,n),p=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},d&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+d})),r.a.createElement("div",{className:"jump-to--main"},u?r.a.createElement("span",{className:"badge badge--primary badge--right"},u):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(i||"chevron-right")+" arrow"}))));return l?r.a.createElement("a",{href:f,target:l,className:s},p):r.a.createElement(a.a,{to:f,className:s},p)}},477:function(e,t,n){"use strict";var u=n(1),r=(n(480),n(479),n(52),n(29),n(22),n(21),n(0)),a=n.n(r),d=n(483),o=n(463),i=n.n(o),c=n(471),l=n.n(c),f=n(482),s=37,p=39;function m(e){var t=e.block,n=e.centered,u=e.changeSelectedValue,r=e.className,d=e.handleKeydown,o=e.style,c=e.values,l=e.selectedValue,f=e.tabRefs;return a.a.createElement("div",{className:n?"tabs--centered":null},a.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",r,{"tabs--block":t}),style:o},c.map((function(e){var t=e.value,n=e.label;return a.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":l===t,className:i()("tab-item",{"tab-item--active":l===t}),key:t,ref:function(e){return f.push(e)},onKeyDown:function(e){return d(f,e.target,e)},onFocus:function(){return u(t)},onClick:function(){return u(t)}},n)}))))}function h(e){var t=e.placeholder,n=e.selectedValue,u=e.changeSelectedValue,r=e.size,o=e.values,i=o;if(i[0].group){var c=_.groupBy(i,"group");i=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return a.a.createElement(d.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:i,isClearable:n,placeholder:t,value:o.find((function(e){return e.value==n})),onChange:function(e){return u(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,d=e.groupId,o=e.label,i=e.placeholder,c=e.select,b=e.size,v=(e.style,e.values),g=e.urlKey,y=Object(f.a)(),_=y.tabGroupChoices,E=y.setTabGroupChoices,w=Object(r.useState)(n),D=w[0],k=w[1];if(null!=d){var x=_[d];null!=x&&x!==D&&k(x)}var S=function(e){k(e),null!=d&&E(d,e)},C=[],O=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case s:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=l.a.parse(window.location.search);e[g]&&k(e[g])}}),[]),a.a.createElement(a.a.Fragment,null,a.a.createElement("div",{className:"margin-bottom--"+(b||"md")},o&&a.a.createElement("div",{className:"margin-vert--sm"},o),v.length>1&&(c?a.a.createElement(h,Object(u.a)({changeSelectedValue:S,handleKeydown:O,placeholder:i,selectedValue:D,size:b,tabRefs:C},e)):a.a.createElement(m,Object(u.a)({changeSelectedValue:S,handleKeydown:O,selectedValue:D,tabRefs:C},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===D}))[0])}},478:function(e,t,n){"use strict";var u=n(0),r=n.n(u);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}},485:function(e,t,n){"use strict";var u=n(0),r=n(525);t.a=function(){return Object(u.useContext)(r.a)}},487:function(e,t,n){"use strict";n(497);var u=n(0),r=n.n(u),a=n(498),d=n(486),o=n(1),i=(n(488),n(489),n(499),n(470)),c=n(500),l=n(484),f=n.n(l),s=n(501),p=n.n(s),m=n(476),h=n(463),b=n.n(h),v=n(135),g=n.n(v),y=function(){return r.a.createElement("span",{className:b()(g.a.toggle,g.a.moon)})},_=function(){return r.a.createElement("span",{className:b()(g.a.toggle,g.a.sun)})},E=function(e){var t=Object(m.a)().isClient;return r.a.createElement(p.a,Object(o.a)({disabled:!t,icons:{checked:r.a.createElement(y,null),unchecked:r.a.createElement(_,null)}},e))};function w(){var e=Object(m.a)().siteConfig,t=(void 0===e?{}:e).customFields.metadata.latest_post,n=Date.parse(t.date),u=new Date,r=Math.abs(u-n),a=Math.ceil(r/864e5),d=null;return"undefined"!=typeof window&&(d=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),a<30&&(!d||d0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(f.a,{className:"navbar__logo",src:p,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),i.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(M,e))}))):null)}))),(l||d)&&r.a.createElement("div",{className:"text--center"},l&&l.src&&r.a.createElement("div",{className:"margin-bottom--sm"},l.href?r.a.createElement("a",{href:l.href,target:"_blank",rel:"noopener noreferrer",className:P.a.footerLogoLink},r.a.createElement(R,{alt:l.alt,url:s})):r.a.createElement(R,{alt:l.alt,url:s})),r.a.createElement("small",null,d),r.a.createElement("br",null))))},B=n(502),z=n(503),U=n(3);n(138);t.a=function(e){var t=Object(m.a)().siteConfig,n=void 0===t?{}:t,u=n.title,o=n.themeConfig.image,i=n.url,c=e.children,l=e.title,f=e.noFooter,s=e.description,p=e.image,h=e.keywords,b=e.version,v=l?l+" | "+u:u,g=p||o,y=i+Object(k.a)(g),_=Object(U.h)(),E=_?"https://docs.qovery.com"+(_.pathname.endsWith("/")?_.pathname:_.pathname+"/"):null;return r.a.createElement(z.a,null,r.a.createElement(B.a,null,r.a.createElement(d.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),v&&r.a.createElement("title",null,v),v&&r.a.createElement("meta",{property:"og:title",content:v}),r.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),r.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),r.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),r.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),r.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),r.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),s&&r.a.createElement("meta",{name:"description",content:s}),s&&r.a.createElement("meta",{property:"og:description",content:s}),b&&r.a.createElement("meta",{name:"docsearch:version",content:b}),h&&h.length&&r.a.createElement("meta",{name:"keywords",content:h.join(",")}),g&&r.a.createElement("meta",{property:"og:image",content:y}),g&&r.a.createElement("meta",{property:"twitter:image",content:y}),g&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+v}),E&&r.a.createElement("meta",{property:"og:url",content:E}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),E&&r.a.createElement("link",{rel:"canonical",href:E})),r.a.createElement(a.a,null),r.a.createElement(N,null),r.a.createElement("div",{className:"main-wrapper"},c),!f&&r.a.createElement(L,null)))}},490:function(e,t,n){"use strict";var u=n(9),r=n(0),a=n.n(r),d=n(463),o=n.n(d),i=n(476),c=(n(139),n(140)),l=n.n(c);t.a=function(e){return function(t){var n,r=t.id,d=Object(u.a)(t,["id"]),c=Object(i.a)().siteConfig,f=(c=void 0===c?{}:c).themeConfig,s=(f=void 0===f?{}:f).navbar,p=(s=void 0===s?{}:s).hideOnScroll,m=void 0!==p&&p;return r?a.a.createElement(e,d,a.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:o()("anchor",(n={},n[l.a.enhancedAnchor]=!m,n)),id:r}),a.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),d.children):a.a.createElement(e,d)}}},491:function(e,t,n){(function(e,u){var r;(function(){var a="Expected a function",d="__lodash_placeholder__",o=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],i="[object Arguments]",c="[object Array]",l="[object Boolean]",f="[object Date]",s="[object Error]",p="[object Function]",m="[object GeneratorFunction]",h="[object Map]",b="[object Number]",v="[object Object]",g="[object RegExp]",y="[object Set]",_="[object String]",E="[object Symbol]",w="[object WeakMap]",D="[object ArrayBuffer]",k="[object DataView]",x="[object Float32Array]",S="[object Float64Array]",C="[object Int8Array]",O="[object Int16Array]",I="[object Int32Array]",A="[object Uint8Array]",j="[object Uint16Array]",N="[object Uint32Array]",F=/\b__p \+= '';/g,T=/\b(__p \+=) '' \+/g,P=/(__e\(.*?\)|\b__t\)) \+\n'';/g,M=/&(?:amp|lt|gt|quot|#39);/g,R=/[&<>"']/g,L=RegExp(M.source),B=RegExp(R.source),z=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,W=/<%=([\s\S]+?)%>/g,H=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,$=/^\w*$/,q=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,G=/[\\^$.*+?()[\]{}|]/g,V=RegExp(G.source),K=/^\s+|\s+$/g,Z=/^\s+/,J=/\s+$/,Y=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,X=/\{\n\/\* \[wrapped with (.+)\] \*/,Q=/,? & /,ee=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,te=/\\(\\)?/g,ne=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ue=/\w*$/,re=/^[-+]0x[0-9a-f]+$/i,ae=/^0b[01]+$/i,de=/^\[object .+?Constructor\]$/,oe=/^0o[0-7]+$/i,ie=/^(?:0|[1-9]\d*)$/,ce=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,le=/($^)/,fe=/['\n\r\u2028\u2029\\]/g,se="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",pe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",me="[\\ud800-\\udfff]",he="["+pe+"]",be="["+se+"]",ve="\\d+",ge="[\\u2700-\\u27bf]",ye="[a-z\\xdf-\\xf6\\xf8-\\xff]",_e="[^\\ud800-\\udfff"+pe+ve+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",Ee="\\ud83c[\\udffb-\\udfff]",we="[^\\ud800-\\udfff]",De="(?:\\ud83c[\\udde6-\\uddff]){2}",ke="[\\ud800-\\udbff][\\udc00-\\udfff]",xe="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Se="(?:"+ye+"|"+_e+")",Ce="(?:"+xe+"|"+_e+")",Oe="(?:"+be+"|"+Ee+")"+"?",Ie="[\\ufe0e\\ufe0f]?"+Oe+("(?:\\u200d(?:"+[we,De,ke].join("|")+")[\\ufe0e\\ufe0f]?"+Oe+")*"),Ae="(?:"+[ge,De,ke].join("|")+")"+Ie,je="(?:"+[we+be+"?",be,De,ke,me].join("|")+")",Ne=RegExp("['\u2019]","g"),Fe=RegExp(be,"g"),Te=RegExp(Ee+"(?="+Ee+")|"+je+Ie,"g"),Pe=RegExp([xe+"?"+ye+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[he,xe,"$"].join("|")+")",Ce+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[he,xe+Se,"$"].join("|")+")",xe+"?"+Se+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",xe+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ve,Ae].join("|"),"g"),Me=RegExp("[\\u200d\\ud800-\\udfff"+se+"\\ufe0e\\ufe0f]"),Re=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Le=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Be=-1,ze={};ze[x]=ze[S]=ze[C]=ze[O]=ze[I]=ze[A]=ze["[object Uint8ClampedArray]"]=ze[j]=ze[N]=!0,ze[i]=ze[c]=ze[D]=ze[l]=ze[k]=ze[f]=ze[s]=ze[p]=ze[h]=ze[b]=ze[v]=ze[g]=ze[y]=ze[_]=ze[w]=!1;var Ue={};Ue[i]=Ue[c]=Ue[D]=Ue[k]=Ue[l]=Ue[f]=Ue[x]=Ue[S]=Ue[C]=Ue[O]=Ue[I]=Ue[h]=Ue[b]=Ue[v]=Ue[g]=Ue[y]=Ue[_]=Ue[E]=Ue[A]=Ue["[object Uint8ClampedArray]"]=Ue[j]=Ue[N]=!0,Ue[s]=Ue[p]=Ue[w]=!1;var We={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},He=parseFloat,$e=parseInt,qe="object"==typeof e&&e&&e.Object===Object&&e,Ge="object"==typeof self&&self&&self.Object===Object&&self,Ve=qe||Ge||Function("return this")(),Ke=t&&!t.nodeType&&t,Ze=Ke&&"object"==typeof u&&u&&!u.nodeType&&u,Je=Ze&&Ze.exports===Ke,Ye=Je&&qe.process,Xe=function(){try{var e=Ze&&Ze.require&&Ze.require("util").types;return e||Ye&&Ye.binding&&Ye.binding("util")}catch(t){}}(),Qe=Xe&&Xe.isArrayBuffer,et=Xe&&Xe.isDate,tt=Xe&&Xe.isMap,nt=Xe&&Xe.isRegExp,ut=Xe&&Xe.isSet,rt=Xe&&Xe.isTypedArray;function at(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function dt(e,t,n,u){for(var r=-1,a=null==e?0:e.length;++r-1}function st(e,t,n){for(var u=-1,r=null==e?0:e.length;++u-1;);return n}function Tt(e,t){for(var n=e.length;n--&&Et(t,e[n],0)>-1;);return n}function Pt(e,t){for(var n=e.length,u=0;n--;)e[n]===t&&++u;return u}var Mt=St({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Rt=St({"&":"&","<":"<",">":">",'"':""","'":"'"});function Lt(e){return"\\"+We[e]}function Bt(e){return Me.test(e)}function zt(e){var t=-1,n=Array(e.size);return e.forEach((function(e,u){n[++t]=[u,e]})),n}function Ut(e,t){return function(n){return e(t(n))}}function Wt(e,t){for(var n=-1,u=e.length,r=0,a=[];++n",""":'"',"'":"'"});var Kt=function e(t){var n,u=(t=null==t?Ve:Kt.defaults(Ve.Object(),t,Kt.pick(Ve,Le))).Array,r=t.Date,se=t.Error,pe=t.Function,me=t.Math,he=t.Object,be=t.RegExp,ve=t.String,ge=t.TypeError,ye=u.prototype,_e=pe.prototype,Ee=he.prototype,we=t["__core-js_shared__"],De=_e.toString,ke=Ee.hasOwnProperty,xe=0,Se=(n=/[^.]+$/.exec(we&&we.keys&&we.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",Ce=Ee.toString,Oe=De.call(he),Ie=Ve._,Ae=be("^"+De.call(ke).replace(G,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),je=Je?t.Buffer:void 0,Te=t.Symbol,Me=t.Uint8Array,We=je?je.allocUnsafe:void 0,qe=Ut(he.getPrototypeOf,he),Ge=he.create,Ke=Ee.propertyIsEnumerable,Ze=ye.splice,Ye=Te?Te.isConcatSpreadable:void 0,Xe=Te?Te.iterator:void 0,gt=Te?Te.toStringTag:void 0,St=function(){try{var e=Qr(he,"defineProperty");return e({},"",{}),e}catch(t){}}(),Zt=t.clearTimeout!==Ve.clearTimeout&&t.clearTimeout,Jt=r&&r.now!==Ve.Date.now&&r.now,Yt=t.setTimeout!==Ve.setTimeout&&t.setTimeout,Xt=me.ceil,Qt=me.floor,en=he.getOwnPropertySymbols,tn=je?je.isBuffer:void 0,nn=t.isFinite,un=ye.join,rn=Ut(he.keys,he),an=me.max,dn=me.min,on=r.now,cn=t.parseInt,ln=me.random,fn=ye.reverse,sn=Qr(t,"DataView"),pn=Qr(t,"Map"),mn=Qr(t,"Promise"),hn=Qr(t,"Set"),bn=Qr(t,"WeakMap"),vn=Qr(he,"create"),gn=bn&&new bn,yn={},_n=Sa(sn),En=Sa(pn),wn=Sa(mn),Dn=Sa(hn),kn=Sa(bn),xn=Te?Te.prototype:void 0,Sn=xn?xn.valueOf:void 0,Cn=xn?xn.toString:void 0;function On(e){if(Hd(e)&&!Nd(e)&&!(e instanceof Nn)){if(e instanceof jn)return e;if(ke.call(e,"__wrapped__"))return Ca(e)}return new jn(e)}var In=function(){function e(){}return function(t){if(!Wd(t))return{};if(Ge)return Ge(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();function An(){}function jn(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Nn(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Fn(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t=t?e:t)),e}function Jn(e,t,n,u,r,a){var d,o=1&t,c=2&t,s=4&t;if(n&&(d=r?n(e,u,r,a):n(e)),void 0!==d)return d;if(!Wd(e))return e;var w=Nd(e);if(w){if(d=function(e){var t=e.length,n=new e.constructor(t);t&&"string"==typeof e[0]&&ke.call(e,"index")&&(n.index=e.index,n.input=e.input);return n}(e),!o)return vr(e,d)}else{var F=na(e),T=F==p||F==m;if(Md(e))return fr(e,o);if(F==v||F==i||T&&!r){if(d=c||T?{}:ra(e),!o)return c?function(e,t){return gr(e,ta(e),t)}(e,function(e,t){return e&&gr(t,Eo(t),e)}(d,e)):function(e,t){return gr(e,ea(e),t)}(e,Gn(d,e))}else{if(!Ue[F])return r?e:{};d=function(e,t,n){var u=e.constructor;switch(t){case D:return sr(e);case l:case f:return new u(+e);case k:return function(e,t){var n=t?sr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}(e,n);case x:case S:case C:case O:case I:case A:case"[object Uint8ClampedArray]":case j:case N:return pr(e,n);case h:return new u;case b:case _:return new u(e);case g:return function(e){var t=new e.constructor(e.source,ue.exec(e));return t.lastIndex=e.lastIndex,t}(e);case y:return new u;case E:return r=e,Sn?he(Sn.call(r)):{}}var r}(e,F,o)}}a||(a=new Rn);var P=a.get(e);if(P)return P;a.set(e,d),Kd(e)?e.forEach((function(u){d.add(Jn(u,t,n,u,e,a))})):$d(e)&&e.forEach((function(u,r){d.set(r,Jn(u,t,n,r,e,a))}));var M=w?void 0:(s?c?Gr:qr:c?Eo:_o)(e);return ot(M||e,(function(u,r){M&&(u=e[r=u]),Hn(d,r,Jn(u,t,n,r,e,a))})),d}function Yn(e,t,n){var u=n.length;if(null==e)return!u;for(e=he(e);u--;){var r=n[u],a=t[r],d=e[r];if(void 0===d&&!(r in e)||!a(d))return!1}return!0}function Xn(e,t,n){if("function"!=typeof e)throw new ge(a);return ya((function(){e.apply(void 0,n)}),t)}function Qn(e,t,n,u){var r=-1,a=ft,d=!0,o=e.length,i=[],c=t.length;if(!o)return i;n&&(t=pt(t,At(n))),u?(a=st,d=!1):t.length>=200&&(a=Nt,d=!1,t=new Mn(t));e:for(;++r-1},Tn.prototype.set=function(e,t){var n=this.__data__,u=$n(n,e);return u<0?(++this.size,n.push([e,t])):n[u][1]=t,this},Pn.prototype.clear=function(){this.size=0,this.__data__={hash:new Fn,map:new(pn||Tn),string:new Fn}},Pn.prototype.delete=function(e){var t=Yr(this,e).delete(e);return this.size-=t?1:0,t},Pn.prototype.get=function(e){return Yr(this,e).get(e)},Pn.prototype.has=function(e){return Yr(this,e).has(e)},Pn.prototype.set=function(e,t){var n=Yr(this,e),u=n.size;return n.set(e,t),this.size+=n.size==u?0:1,this},Mn.prototype.add=Mn.prototype.push=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},Mn.prototype.has=function(e){return this.__data__.has(e)},Rn.prototype.clear=function(){this.__data__=new Tn,this.size=0},Rn.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},Rn.prototype.get=function(e){return this.__data__.get(e)},Rn.prototype.has=function(e){return this.__data__.has(e)},Rn.prototype.set=function(e,t){var n=this.__data__;if(n instanceof Tn){var u=n.__data__;if(!pn||u.length<199)return u.push([e,t]),this.size=++n.size,this;n=this.__data__=new Pn(u)}return n.set(e,t),this.size=n.size,this};var eu=Er(iu),tu=Er(cu,!0);function nu(e,t){var n=!0;return eu(e,(function(e,u,r){return n=!!t(e,u,r)})),n}function uu(e,t,n){for(var u=-1,r=e.length;++u0&&n(o)?t>1?au(o,t-1,n,u,r):mt(r,o):u||(r[r.length]=o)}return r}var du=wr(),ou=wr(!0);function iu(e,t){return e&&du(e,t,_o)}function cu(e,t){return e&&ou(e,t,_o)}function lu(e,t){return lt(t,(function(t){return Bd(e[t])}))}function fu(e,t){for(var n=0,u=(t=or(t,e)).length;null!=e&&nt}function hu(e,t){return null!=e&&ke.call(e,t)}function bu(e,t){return null!=e&&t in he(e)}function vu(e,t,n){for(var r=n?st:ft,a=e[0].length,d=e.length,o=d,i=u(d),c=1/0,l=[];o--;){var f=e[o];o&&t&&(f=pt(f,At(t))),c=dn(f.length,c),i[o]=!n&&(t||a>=120&&f.length>=120)?new Mn(o&&f):void 0}f=e[0];var s=-1,p=i[0];e:for(;++s=o)return i;var c=n[u];return i*("desc"==c?-1:1)}}return e.index-t.index}(e,t,n)}))}function Fu(e,t,n){for(var u=-1,r=t.length,a={};++u-1;)o!==e&&Ze.call(o,i,1),Ze.call(e,i,1);return e}function Pu(e,t){for(var n=e?t.length:0,u=n-1;n--;){var r=t[n];if(n==u||r!==a){var a=r;da(r)?Ze.call(e,r,1):Qu(e,r)}}return e}function Mu(e,t){return e+Qt(ln()*(t-e+1))}function Ru(e,t){var n="";if(!e||t<1||t>9007199254740991)return n;do{t%2&&(n+=e),(t=Qt(t/2))&&(e+=e)}while(t);return n}function Lu(e,t){return _a(ma(e,t,Go),e+"")}function Bu(e){return Bn(Io(e))}function zu(e,t){var n=Io(e);return Da(n,Zn(t,0,n.length))}function Uu(e,t,n,u){if(!Wd(e))return e;for(var r=-1,a=(t=or(t,e)).length,d=a-1,o=e;null!=o&&++ra?0:a+t),(n=n>a?a:n)<0&&(n+=a),a=t>n?0:n-t>>>0,t>>>=0;for(var d=u(a);++r>>1,d=e[a];null!==d&&!Jd(d)&&(n?d<=t:d=200){var c=t?null:Rr(e);if(c)return Ht(c);d=!1,r=Nt,i=new Mn}else i=t?[]:o;e:for(;++u=u?e:qu(e,t,n)}var lr=Zt||function(e){return Ve.clearTimeout(e)};function fr(e,t){if(t)return e.slice();var n=e.length,u=We?We(n):new e.constructor(n);return e.copy(u),u}function sr(e){var t=new e.constructor(e.byteLength);return new Me(t).set(new Me(e)),t}function pr(e,t){var n=t?sr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}function mr(e,t){if(e!==t){var n=void 0!==e,u=null===e,r=e==e,a=Jd(e),d=void 0!==t,o=null===t,i=t==t,c=Jd(t);if(!o&&!c&&!a&&e>t||a&&d&&i&&!o&&!c||u&&d&&i||!n&&i||!r)return 1;if(!u&&!a&&!c&&e1?n[r-1]:void 0,d=r>2?n[2]:void 0;for(a=e.length>3&&"function"==typeof a?(r--,a):void 0,d&&oa(n[0],n[1],d)&&(a=r<3?void 0:a,r=1),t=he(t);++u-1?r[a?t[d]:d]:void 0}}function Cr(e){return $r((function(t){var n=t.length,u=n,r=jn.prototype.thru;for(e&&t.reverse();u--;){var d=t[u];if("function"!=typeof d)throw new ge(a);if(r&&!o&&"wrapper"==Kr(d))var o=new jn([],!0)}for(u=o?u:n;++u1&&y.reverse(),f&&co))return!1;var c=a.get(e);if(c&&a.get(t))return c==t;var l=-1,f=!0,s=2&n?new Mn:void 0;for(a.set(e,t),a.set(t,e);++l-1&&e%1==0&&e1?"& ":"")+t[u],t=t.join(n>2?", ":" "),e.replace(Y,"{\n/* [wrapped with "+t+"] */\n")}(u,function(e,t){return ot(o,(function(n){var u="_."+n[0];t&n[1]&&!ft(e,u)&&e.push(u)})),e.sort()}(function(e){var t=e.match(X);return t?t[1].split(Q):[]}(u),n)))}function wa(e){var t=0,n=0;return function(){var u=on(),r=16-(u-n);if(n=u,r>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function Da(e,t){var n=-1,u=e.length,r=u-1;for(t=void 0===t?u:t;++n1?e[t-1]:void 0;return n="function"==typeof n?(e.pop(),n):void 0,Va(e,n)}));function ed(e){var t=On(e);return t.__chain__=!0,t}function td(e,t){return t(e)}var nd=$r((function(e){var t=e.length,n=t?e[0]:0,u=this.__wrapped__,r=function(t){return Kn(t,e)};return!(t>1||this.__actions__.length)&&u instanceof Nn&&da(n)?((u=u.slice(n,+n+(t?1:0))).__actions__.push({func:td,args:[r],thisArg:void 0}),new jn(u,this.__chain__).thru((function(e){return t&&!e.length&&e.push(void 0),e}))):this.thru(r)}));var ud=yr((function(e,t,n){ke.call(e,n)?++e[n]:Vn(e,n,1)}));var rd=Sr(ja),ad=Sr(Na);function dd(e,t){return(Nd(e)?ot:eu)(e,Jr(t,3))}function od(e,t){return(Nd(e)?it:tu)(e,Jr(t,3))}var id=yr((function(e,t,n){ke.call(e,n)?e[n].push(t):Vn(e,n,[t])}));var cd=Lu((function(e,t,n){var r=-1,a="function"==typeof t,d=Td(e)?u(e.length):[];return eu(e,(function(e){d[++r]=a?at(t,e,n):gu(e,t,n)})),d})),ld=yr((function(e,t,n){Vn(e,n,t)}));function fd(e,t){return(Nd(e)?pt:Cu)(e,Jr(t,3))}var sd=yr((function(e,t,n){e[n?0:1].push(t)}),(function(){return[[],[]]}));var pd=Lu((function(e,t){if(null==e)return[];var n=t.length;return n>1&&oa(e,t[0],t[1])?t=[]:n>2&&oa(t[0],t[1],t[2])&&(t=[t[0]]),Nu(e,au(t,1),[])})),md=Jt||function(){return Ve.Date.now()};function hd(e,t,n){return t=n?void 0:t,Br(e,128,void 0,void 0,void 0,void 0,t=e&&null==t?e.length:t)}function bd(e,t){var n;if("function"!=typeof t)throw new ge(a);return e=no(e),function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=void 0),n}}var vd=Lu((function(e,t,n){var u=1;if(n.length){var r=Wt(n,Zr(vd));u|=32}return Br(e,u,t,n,r)})),gd=Lu((function(e,t,n){var u=3;if(n.length){var r=Wt(n,Zr(gd));u|=32}return Br(t,u,e,n,r)}));function yd(e,t,n){var u,r,d,o,i,c,l=0,f=!1,s=!1,p=!0;if("function"!=typeof e)throw new ge(a);function m(t){var n=u,a=r;return u=r=void 0,l=t,o=e.apply(a,n)}function h(e){return l=e,i=ya(v,t),f?m(e):o}function b(e){var n=e-c;return void 0===c||n>=t||n<0||s&&e-l>=d}function v(){var e=md();if(b(e))return g(e);i=ya(v,function(e){var n=t-(e-c);return s?dn(n,d-(e-l)):n}(e))}function g(e){return i=void 0,p&&u?m(e):(u=r=void 0,o)}function y(){var e=md(),n=b(e);if(u=arguments,r=this,c=e,n){if(void 0===i)return h(c);if(s)return lr(i),i=ya(v,t),m(c)}return void 0===i&&(i=ya(v,t)),o}return t=ro(t)||0,Wd(n)&&(f=!!n.leading,d=(s="maxWait"in n)?an(ro(n.maxWait)||0,t):d,p="trailing"in n?!!n.trailing:p),y.cancel=function(){void 0!==i&&lr(i),l=0,u=c=r=i=void 0},y.flush=function(){return void 0===i?o:g(md())},y}var _d=Lu((function(e,t){return Xn(e,1,t)})),Ed=Lu((function(e,t,n){return Xn(e,ro(t)||0,n)}));function wd(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new ge(a);var n=function(){var u=arguments,r=t?t.apply(this,u):u[0],a=n.cache;if(a.has(r))return a.get(r);var d=e.apply(this,u);return n.cache=a.set(r,d)||a,d};return n.cache=new(wd.Cache||Pn),n}function Dd(e){if("function"!=typeof e)throw new ge(a);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}wd.Cache=Pn;var kd=ir((function(e,t){var n=(t=1==t.length&&Nd(t[0])?pt(t[0],At(Jr())):pt(au(t,1),At(Jr()))).length;return Lu((function(u){for(var r=-1,a=dn(u.length,n);++r=t})),jd=yu(function(){return arguments}())?yu:function(e){return Hd(e)&&ke.call(e,"callee")&&!Ke.call(e,"callee")},Nd=u.isArray,Fd=Qe?At(Qe):function(e){return Hd(e)&&pu(e)==D};function Td(e){return null!=e&&Ud(e.length)&&!Bd(e)}function Pd(e){return Hd(e)&&Td(e)}var Md=tn||ai,Rd=et?At(et):function(e){return Hd(e)&&pu(e)==f};function Ld(e){if(!Hd(e))return!1;var t=pu(e);return t==s||"[object DOMException]"==t||"string"==typeof e.message&&"string"==typeof e.name&&!Gd(e)}function Bd(e){if(!Wd(e))return!1;var t=pu(e);return t==p||t==m||"[object AsyncFunction]"==t||"[object Proxy]"==t}function zd(e){return"number"==typeof e&&e==no(e)}function Ud(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}function Wd(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function Hd(e){return null!=e&&"object"==typeof e}var $d=tt?At(tt):function(e){return Hd(e)&&na(e)==h};function qd(e){return"number"==typeof e||Hd(e)&&pu(e)==b}function Gd(e){if(!Hd(e)||pu(e)!=v)return!1;var t=qe(e);if(null===t)return!0;var n=ke.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&De.call(n)==Oe}var Vd=nt?At(nt):function(e){return Hd(e)&&pu(e)==g};var Kd=ut?At(ut):function(e){return Hd(e)&&na(e)==y};function Zd(e){return"string"==typeof e||!Nd(e)&&Hd(e)&&pu(e)==_}function Jd(e){return"symbol"==typeof e||Hd(e)&&pu(e)==E}var Yd=rt?At(rt):function(e){return Hd(e)&&Ud(e.length)&&!!ze[pu(e)]};var Xd=Tr(Su),Qd=Tr((function(e,t){return e<=t}));function eo(e){if(!e)return[];if(Td(e))return Zd(e)?Gt(e):vr(e);if(Xe&&e[Xe])return function(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}(e[Xe]());var t=na(e);return(t==h?zt:t==y?Ht:Io)(e)}function to(e){return e?(e=ro(e))===1/0||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function no(e){var t=to(e),n=t%1;return t==t?n?t-n:t:0}function uo(e){return e?Zn(no(e),0,4294967295):0}function ro(e){if("number"==typeof e)return e;if(Jd(e))return NaN;if(Wd(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Wd(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(K,"");var n=ae.test(e);return n||oe.test(e)?$e(e.slice(2),n?2:8):re.test(e)?NaN:+e}function ao(e){return gr(e,Eo(e))}function oo(e){return null==e?"":Yu(e)}var io=_r((function(e,t){if(fa(t)||Td(t))gr(t,_o(t),e);else for(var n in t)ke.call(t,n)&&Hn(e,n,t[n])})),co=_r((function(e,t){gr(t,Eo(t),e)})),lo=_r((function(e,t,n,u){gr(t,Eo(t),e,u)})),fo=_r((function(e,t,n,u){gr(t,_o(t),e,u)})),so=$r(Kn);var po=Lu((function(e,t){e=he(e);var n=-1,u=t.length,r=u>2?t[2]:void 0;for(r&&oa(t[0],t[1],r)&&(u=1);++n1),t})),gr(e,Gr(e),n),u&&(n=Jn(n,7,Wr));for(var r=t.length;r--;)Qu(n,t[r]);return n}));var xo=$r((function(e,t){return null==e?{}:function(e,t){return Fu(e,t,(function(t,n){return bo(e,n)}))}(e,t)}));function So(e,t){if(null==e)return{};var n=pt(Gr(e),(function(e){return[e]}));return t=Jr(t),Fu(e,n,(function(e,n){return t(e,n[0])}))}var Co=Lr(_o),Oo=Lr(Eo);function Io(e){return null==e?[]:jt(e,_o(e))}var Ao=kr((function(e,t,n){return t=t.toLowerCase(),e+(n?jo(t):t)}));function jo(e){return Bo(oo(e).toLowerCase())}function No(e){return(e=oo(e))&&e.replace(ce,Mt).replace(Fe,"")}var Fo=kr((function(e,t,n){return e+(n?"-":"")+t.toLowerCase()})),To=kr((function(e,t,n){return e+(n?" ":"")+t.toLowerCase()})),Po=Dr("toLowerCase");var Mo=kr((function(e,t,n){return e+(n?"_":"")+t.toLowerCase()}));var Ro=kr((function(e,t,n){return e+(n?" ":"")+Bo(t)}));var Lo=kr((function(e,t,n){return e+(n?" ":"")+t.toUpperCase()})),Bo=Dr("toUpperCase");function zo(e,t,n){return e=oo(e),void 0===(t=n?void 0:t)?function(e){return Re.test(e)}(e)?function(e){return e.match(Pe)||[]}(e):function(e){return e.match(ee)||[]}(e):e.match(t)||[]}var Uo=Lu((function(e,t){try{return at(e,void 0,t)}catch(n){return Ld(n)?n:new se(n)}})),Wo=$r((function(e,t){return ot(t,(function(t){t=xa(t),Vn(e,t,vd(e[t],e))})),e}));function Ho(e){return function(){return e}}var $o=Cr(),qo=Cr(!0);function Go(e){return e}function Vo(e){return Du("function"==typeof e?e:Jn(e,1))}var Ko=Lu((function(e,t){return function(n){return gu(n,e,t)}})),Zo=Lu((function(e,t){return function(n){return gu(e,n,t)}}));function Jo(e,t,n){var u=_o(t),r=lu(t,u);null!=n||Wd(t)&&(r.length||!u.length)||(n=t,t=e,e=this,r=lu(t,_o(t)));var a=!(Wd(n)&&"chain"in n&&!n.chain),d=Bd(e);return ot(r,(function(n){var u=t[n];e[n]=u,d&&(e.prototype[n]=function(){var t=this.__chain__;if(a||t){var n=e(this.__wrapped__),r=n.__actions__=vr(this.__actions__);return r.push({func:u,args:arguments,thisArg:e}),n.__chain__=t,n}return u.apply(e,mt([this.value()],arguments))})})),e}function Yo(){}var Xo=jr(pt),Qo=jr(ct),ei=jr(vt);function ti(e){return ia(e)?xt(xa(e)):function(e){return function(t){return fu(t,e)}}(e)}var ni=Fr(),ui=Fr(!0);function ri(){return[]}function ai(){return!1}var di=Ar((function(e,t){return e+t}),0),oi=Mr("ceil"),ii=Ar((function(e,t){return e/t}),1),ci=Mr("floor");var li,fi=Ar((function(e,t){return e*t}),1),si=Mr("round"),pi=Ar((function(e,t){return e-t}),0);return On.after=function(e,t){if("function"!=typeof t)throw new ge(a);return e=no(e),function(){if(--e<1)return t.apply(this,arguments)}},On.ary=hd,On.assign=io,On.assignIn=co,On.assignInWith=lo,On.assignWith=fo,On.at=so,On.before=bd,On.bind=vd,On.bindAll=Wo,On.bindKey=gd,On.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return Nd(e)?e:[e]},On.chain=ed,On.chunk=function(e,t,n){t=(n?oa(e,t,n):void 0===t)?1:an(no(t),0);var r=null==e?0:e.length;if(!r||t<1)return[];for(var a=0,d=0,o=u(Xt(r/t));ar?0:r+n),(u=void 0===u||u>r?r:no(u))<0&&(u+=r),u=n>u?0:uo(u);n>>0)?(e=oo(e))&&("string"==typeof t||null!=t&&!Vd(t))&&!(t=Yu(t))&&Bt(e)?cr(Gt(e),0,n):e.split(t,n):[]},On.spread=function(e,t){if("function"!=typeof e)throw new ge(a);return t=null==t?0:an(no(t),0),Lu((function(n){var u=n[t],r=cr(n,0,t);return u&&mt(r,u),at(e,this,r)}))},On.tail=function(e){var t=null==e?0:e.length;return t?qu(e,1,t):[]},On.take=function(e,t,n){return e&&e.length?qu(e,0,(t=n||void 0===t?1:no(t))<0?0:t):[]},On.takeRight=function(e,t,n){var u=null==e?0:e.length;return u?qu(e,(t=u-(t=n||void 0===t?1:no(t)))<0?0:t,u):[]},On.takeRightWhile=function(e,t){return e&&e.length?tr(e,Jr(t,3),!1,!0):[]},On.takeWhile=function(e,t){return e&&e.length?tr(e,Jr(t,3)):[]},On.tap=function(e,t){return t(e),e},On.throttle=function(e,t,n){var u=!0,r=!0;if("function"!=typeof e)throw new ge(a);return Wd(n)&&(u="leading"in n?!!n.leading:u,r="trailing"in n?!!n.trailing:r),yd(e,t,{leading:u,maxWait:t,trailing:r})},On.thru=td,On.toArray=eo,On.toPairs=Co,On.toPairsIn=Oo,On.toPath=function(e){return Nd(e)?pt(e,xa):Jd(e)?[e]:vr(ka(oo(e)))},On.toPlainObject=ao,On.transform=function(e,t,n){var u=Nd(e),r=u||Md(e)||Yd(e);if(t=Jr(t,4),null==n){var a=e&&e.constructor;n=r?u?new a:[]:Wd(e)&&Bd(a)?In(qe(e)):{}}return(r?ot:iu)(e,(function(e,u,r){return t(n,e,u,r)})),n},On.unary=function(e){return hd(e,1)},On.union=Ha,On.unionBy=$a,On.unionWith=qa,On.uniq=function(e){return e&&e.length?Xu(e):[]},On.uniqBy=function(e,t){return e&&e.length?Xu(e,Jr(t,2)):[]},On.uniqWith=function(e,t){return t="function"==typeof t?t:void 0,e&&e.length?Xu(e,void 0,t):[]},On.unset=function(e,t){return null==e||Qu(e,t)},On.unzip=Ga,On.unzipWith=Va,On.update=function(e,t,n){return null==e?e:er(e,t,dr(n))},On.updateWith=function(e,t,n,u){return u="function"==typeof u?u:void 0,null==e?e:er(e,t,dr(n),u)},On.values=Io,On.valuesIn=function(e){return null==e?[]:jt(e,Eo(e))},On.without=Ka,On.words=zo,On.wrap=function(e,t){return xd(dr(t),e)},On.xor=Za,On.xorBy=Ja,On.xorWith=Ya,On.zip=Xa,On.zipObject=function(e,t){return rr(e||[],t||[],Hn)},On.zipObjectDeep=function(e,t){return rr(e||[],t||[],Uu)},On.zipWith=Qa,On.entries=Co,On.entriesIn=Oo,On.extend=co,On.extendWith=lo,Jo(On,On),On.add=di,On.attempt=Uo,On.camelCase=Ao,On.capitalize=jo,On.ceil=oi,On.clamp=function(e,t,n){return void 0===n&&(n=t,t=void 0),void 0!==n&&(n=(n=ro(n))==n?n:0),void 0!==t&&(t=(t=ro(t))==t?t:0),Zn(ro(e),t,n)},On.clone=function(e){return Jn(e,4)},On.cloneDeep=function(e){return Jn(e,5)},On.cloneDeepWith=function(e,t){return Jn(e,5,t="function"==typeof t?t:void 0)},On.cloneWith=function(e,t){return Jn(e,4,t="function"==typeof t?t:void 0)},On.conformsTo=function(e,t){return null==t||Yn(e,t,_o(t))},On.deburr=No,On.defaultTo=function(e,t){return null==e||e!=e?t:e},On.divide=ii,On.endsWith=function(e,t,n){e=oo(e),t=Yu(t);var u=e.length,r=n=void 0===n?u:Zn(no(n),0,u);return(n-=t.length)>=0&&e.slice(n,r)==t},On.eq=Od,On.escape=function(e){return(e=oo(e))&&B.test(e)?e.replace(R,Rt):e},On.escapeRegExp=function(e){return(e=oo(e))&&V.test(e)?e.replace(G,"\\$&"):e},On.every=function(e,t,n){var u=Nd(e)?ct:nu;return n&&oa(e,t,n)&&(t=void 0),u(e,Jr(t,3))},On.find=rd,On.findIndex=ja,On.findKey=function(e,t){return yt(e,Jr(t,3),iu)},On.findLast=ad,On.findLastIndex=Na,On.findLastKey=function(e,t){return yt(e,Jr(t,3),cu)},On.floor=ci,On.forEach=dd,On.forEachRight=od,On.forIn=function(e,t){return null==e?e:du(e,Jr(t,3),Eo)},On.forInRight=function(e,t){return null==e?e:ou(e,Jr(t,3),Eo)},On.forOwn=function(e,t){return e&&iu(e,Jr(t,3))},On.forOwnRight=function(e,t){return e&&cu(e,Jr(t,3))},On.get=ho,On.gt=Id,On.gte=Ad,On.has=function(e,t){return null!=e&&ua(e,t,hu)},On.hasIn=bo,On.head=Ta,On.identity=Go,On.includes=function(e,t,n,u){e=Td(e)?e:Io(e),n=n&&!u?no(n):0;var r=e.length;return n<0&&(n=an(r+n,0)),Zd(e)?n<=r&&e.indexOf(t,n)>-1:!!r&&Et(e,t,n)>-1},On.indexOf=function(e,t,n){var u=null==e?0:e.length;if(!u)return-1;var r=null==n?0:no(n);return r<0&&(r=an(u+r,0)),Et(e,t,r)},On.inRange=function(e,t,n){return t=to(t),void 0===n?(n=t,t=0):n=to(n),function(e,t,n){return e>=dn(t,n)&&e=-9007199254740991&&e<=9007199254740991},On.isSet=Kd,On.isString=Zd,On.isSymbol=Jd,On.isTypedArray=Yd,On.isUndefined=function(e){return void 0===e},On.isWeakMap=function(e){return Hd(e)&&na(e)==w},On.isWeakSet=function(e){return Hd(e)&&"[object WeakSet]"==pu(e)},On.join=function(e,t){return null==e?"":un.call(e,t)},On.kebabCase=Fo,On.last=La,On.lastIndexOf=function(e,t,n){var u=null==e?0:e.length;if(!u)return-1;var r=u;return void 0!==n&&(r=(r=no(n))<0?an(u+r,0):dn(r,u-1)),t==t?function(e,t,n){for(var u=n+1;u--;)if(e[u]===t)return u;return u}(e,t,r):_t(e,Dt,r,!0)},On.lowerCase=To,On.lowerFirst=Po,On.lt=Xd,On.lte=Qd,On.max=function(e){return e&&e.length?uu(e,Go,mu):void 0},On.maxBy=function(e,t){return e&&e.length?uu(e,Jr(t,2),mu):void 0},On.mean=function(e){return kt(e,Go)},On.meanBy=function(e,t){return kt(e,Jr(t,2))},On.min=function(e){return e&&e.length?uu(e,Go,Su):void 0},On.minBy=function(e,t){return e&&e.length?uu(e,Jr(t,2),Su):void 0},On.stubArray=ri,On.stubFalse=ai,On.stubObject=function(){return{}},On.stubString=function(){return""},On.stubTrue=function(){return!0},On.multiply=fi,On.nth=function(e,t){return e&&e.length?ju(e,no(t)):void 0},On.noConflict=function(){return Ve._===this&&(Ve._=Ie),this},On.noop=Yo,On.now=md,On.pad=function(e,t,n){e=oo(e);var u=(t=no(t))?qt(e):0;if(!t||u>=t)return e;var r=(t-u)/2;return Nr(Qt(r),n)+e+Nr(Xt(r),n)},On.padEnd=function(e,t,n){e=oo(e);var u=(t=no(t))?qt(e):0;return t&&ut){var u=e;e=t,t=u}if(n||e%1||t%1){var r=ln();return dn(e+r*(t-e+He("1e-"+((r+"").length-1))),t)}return Mu(e,t)},On.reduce=function(e,t,n){var u=Nd(e)?ht:Ct,r=arguments.length<3;return u(e,Jr(t,4),n,r,eu)},On.reduceRight=function(e,t,n){var u=Nd(e)?bt:Ct,r=arguments.length<3;return u(e,Jr(t,4),n,r,tu)},On.repeat=function(e,t,n){return t=(n?oa(e,t,n):void 0===t)?1:no(t),Ru(oo(e),t)},On.replace=function(){var e=arguments,t=oo(e[0]);return e.length<3?t:t.replace(e[1],e[2])},On.result=function(e,t,n){var u=-1,r=(t=or(t,e)).length;for(r||(r=1,e=void 0);++u9007199254740991)return[];var n=4294967295,u=dn(e,4294967295);e-=4294967295;for(var r=It(u,t=Jr(t));++n=a)return e;var o=n-qt(u);if(o<1)return u;var i=d?cr(d,0,o).join(""):e.slice(0,o);if(void 0===r)return i+u;if(d&&(o+=i.length-o),Vd(r)){if(e.slice(o).search(r)){var c,l=i;for(r.global||(r=be(r.source,oo(ue.exec(r))+"g")),r.lastIndex=0;c=r.exec(l);)var f=c.index;i=i.slice(0,void 0===f?o:f)}}else if(e.indexOf(Yu(r),o)!=o){var s=i.lastIndexOf(r);s>-1&&(i=i.slice(0,s))}return i+u},On.unescape=function(e){return(e=oo(e))&&L.test(e)?e.replace(M,Vt):e},On.uniqueId=function(e){var t=++xe;return oo(e)+t},On.upperCase=Lo,On.upperFirst=Bo,On.each=dd,On.eachRight=od,On.first=Ta,Jo(On,(li={},iu(On,(function(e,t){ke.call(On.prototype,t)||(li[t]=e)})),li),{chain:!1}),On.VERSION="4.17.15",ot(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){On[e].placeholder=On})),ot(["drop","take"],(function(e,t){Nn.prototype[e]=function(n){n=void 0===n?1:an(no(n),0);var u=this.__filtered__&&!t?new Nn(this):this.clone();return u.__filtered__?u.__takeCount__=dn(n,u.__takeCount__):u.__views__.push({size:dn(n,4294967295),type:e+(u.__dir__<0?"Right":"")}),u},Nn.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}})),ot(["filter","map","takeWhile"],(function(e,t){var n=t+1,u=1==n||3==n;Nn.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:Jr(e,3),type:n}),t.__filtered__=t.__filtered__||u,t}})),ot(["head","last"],(function(e,t){var n="take"+(t?"Right":"");Nn.prototype[e]=function(){return this[n](1).value()[0]}})),ot(["initial","tail"],(function(e,t){var n="drop"+(t?"":"Right");Nn.prototype[e]=function(){return this.__filtered__?new Nn(this):this[n](1)}})),Nn.prototype.compact=function(){return this.filter(Go)},Nn.prototype.find=function(e){return this.filter(e).head()},Nn.prototype.findLast=function(e){return this.reverse().find(e)},Nn.prototype.invokeMap=Lu((function(e,t){return"function"==typeof e?new Nn(this):this.map((function(n){return gu(n,e,t)}))})),Nn.prototype.reject=function(e){return this.filter(Dd(Jr(e)))},Nn.prototype.slice=function(e,t){e=no(e);var n=this;return n.__filtered__&&(e>0||t<0)?new Nn(n):(e<0?n=n.takeRight(-e):e&&(n=n.drop(e)),void 0!==t&&(n=(t=no(t))<0?n.dropRight(-t):n.take(t-e)),n)},Nn.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},Nn.prototype.toArray=function(){return this.take(4294967295)},iu(Nn.prototype,(function(e,t){var n=/^(?:filter|find|map|reject)|While$/.test(t),u=/^(?:head|last)$/.test(t),r=On[u?"take"+("last"==t?"Right":""):t],a=u||/^find/.test(t);r&&(On.prototype[t]=function(){var t=this.__wrapped__,d=u?[1]:arguments,o=t instanceof Nn,i=d[0],c=o||Nd(t),l=function(e){var t=r.apply(On,mt([e],d));return u&&f?t[0]:t};c&&n&&"function"==typeof i&&1!=i.length&&(o=c=!1);var f=this.__chain__,s=!!this.__actions__.length,p=a&&!f,m=o&&!s;if(!a&&c){t=m?t:new Nn(this);var h=e.apply(t,d);return h.__actions__.push({func:td,args:[l],thisArg:void 0}),new jn(h,f)}return p&&m?e.apply(this,d):(h=this.thru(l),p?u?h.value()[0]:h.value():h)})})),ot(["pop","push","shift","sort","splice","unshift"],(function(e){var t=ye[e],n=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",u=/^(?:pop|shift)$/.test(e);On.prototype[e]=function(){var e=arguments;if(u&&!this.__chain__){var r=this.value();return t.apply(Nd(r)?r:[],e)}return this[n]((function(n){return t.apply(Nd(n)?n:[],e)}))}})),iu(Nn.prototype,(function(e,t){var n=On[t];if(n){var u=n.name+"";ke.call(yn,u)||(yn[u]=[]),yn[u].push({name:t,func:n})}})),yn[Or(void 0,2).name]=[{name:"wrapper",func:void 0}],Nn.prototype.clone=function(){var e=new Nn(this.__wrapped__);return e.__actions__=vr(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=vr(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=vr(this.__views__),e},Nn.prototype.reverse=function(){if(this.__filtered__){var e=new Nn(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},Nn.prototype.value=function(){var e=this.__wrapped__.value(),t=this.__dir__,n=Nd(e),u=t<0,r=n?e.length:0,a=function(e,t,n){var u=-1,r=n.length;for(;++u=this.__values__.length;return{done:e,value:e?void 0:this.__values__[this.__index__++]}},On.prototype.plant=function(e){for(var t,n=this;n instanceof An;){var u=Ca(n);u.__index__=0,u.__values__=void 0,t?r.__wrapped__=u:t=u;var r=u;n=n.__wrapped__}return r.__wrapped__=e,t},On.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof Nn){var t=e;return this.__actions__.length&&(t=new Nn(this)),(t=t.reverse()).__actions__.push({func:td,args:[Wa],thisArg:void 0}),new jn(t,this.__chain__)}return this.thru(Wa)},On.prototype.toJSON=On.prototype.valueOf=On.prototype.value=function(){return nr(this.__wrapped__,this.__actions__)},On.prototype.first=On.prototype.head,Xe&&(On.prototype[Xe]=function(){return this}),On}();Ve._=Kt,void 0===(r=function(){return Kt}.call(t,n,t,u))||(u.exports=r)}).call(this)}).call(this,n(76),n(496)(e))},492:function(e,t,n){"use strict";var u=n(0);t.a=function(e){void 0===e&&(e=!0),Object(u.useEffect)((function(){return document.body.style.overflow=e?"hidden":"visible",function(){document.body.style.overflow="visible"}}),[e])}},493:function(e,t,n){"use strict";var u=n(476),r=n(485),a=n(481),d=n(474);t.a=function(){var e=Object(u.a)().siteConfig,t=(e=void 0===e?{}:e).baseUrl,n=e.themeConfig.navbar,o=(n=void 0===n?{}:n).logo,i=void 0===o?{}:o,c=Object(r.a)().isDarkTheme,l=i.href||t,f={};i.target?f={target:i.target}:Object(d.a)(l)||(f={rel:"noopener noreferrer",target:"_blank"});var s=i.srcDark&&c?i.srcDark:i.src;return{logoLink:l,logoLinkProps:f,logoImageUrl:Object(a.a)(s),logoAlt:i.alt}}},495:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));n(77),n(513),n(479),n(78);var u=n(515),r=n.n(u);function a(e,t){var n=new r.a;return e.map((function(e){var u=e;return"string"==typeof e&&(u={label:e,permalink:"/blog/tags/"+n.slug(e)}),function(e,t){var n=e.label.split(": ",2),u=n[0],r=n[1],a="primary";switch(t){case"blog":case"guides":a=function(e){switch(e){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(u)}return{category:u,count:e.count,label:e.label,permalink:e.permalink,style:a,value:r}}(u,t)}))}},496:function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},497:function(e,t,n){"use strict";var u=n(12),r=n(26),a=n(557),d="".endsWith;u(u.P+u.F*n(558)("endsWith"),"String",{endsWith:function(e){var t=a(this,e,"endsWith"),n=arguments.length>1?arguments[1]:void 0,u=r(t.length),o=void 0===n?u:Math.min(r(n),u),i=String(e);return d?d.call(t,i,o):t.slice(o-i.length,o)===i}})},498:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(476),d=n(145),o=n.n(d);t.a=function(){var e=Object(a.a)().siteConfig,t=(e=void 0===e?{}:e).themeConfig.announcementBar,n=void 0===t?{}:t,d=n.id,i=n.content,c=n.backgroundColor,l=n.textColor,f=Object(u.useState)(!0),s=f[0],p=f[1];return Object(u.useEffect)((function(){var e=localStorage.getItem("docusaurus.announcement.id"),t=d!==e;localStorage.setItem("docusaurus.announcement.id",d),t&&localStorage.setItem("docusaurus.announcement.dismiss",!1),(t||"false"===localStorage.getItem("docusaurus.announcement.dismiss"))&&p(!1)}),[]),!i||s?null:r.a.createElement("div",{className:o.a.announcementBar,style:{backgroundColor:c,color:l},role:"banner"},r.a.createElement("div",{className:o.a.announcementBarContent,dangerouslySetInnerHTML:{__html:i}}),r.a.createElement("button",{type:"button",className:o.a.announcementBarClose,onClick:function(){localStorage.setItem("docusaurus.announcement.dismiss",!0),p(!0)},"aria-label":"Close"},r.a.createElement("span",{"aria-hidden":"true"},"\xd7")))}},499:function(e,t,n){"use strict";var u=n(0);u.PureComponent},500:function(e,t,n){"use strict";n(58),n(29),n(22),n(21),n(79);var u=n(0),r=n.n(u),a=n(463),d=n.n(a),o=n(476),i=n(512);n(146);t.a=function(e){var t=Object(u.useState)(!1),a=t[0],c=t[1],l=Object(u.useRef)(null),f=Object(o.a)().siteConfig,s=(void 0===f?{}:f).themeConfig.algolia,p=Object(i.c)();var m=function(e){void 0===e&&(e=!0),a||Promise.all([n.e(309).then(n.t.bind(null,610,7)),n.e(209).then(n.t.bind(null,623,7))]).then((function(t){var n=t[0].default;c(!0),window.docsearch=n,function(e){window.docsearch({appId:s.appId,apiKey:s.apiKey,indexName:s.indexName,inputSelector:"#search_input_react",algoliaOptions:s.algoliaOptions,handleSelected:function(e,t,n){var u=document.createElement("a");u.href=n.url;var r="#__docusaurus"===u.hash?""+u.pathname:""+u.pathname+u.hash;p.push(r)}}),e&&l.current.focus()}(e)}))},h=Object(u.useCallback)((function(){m(),a&&l.current.focus(),e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]),b=Object(u.useCallback)((function(){e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]),v=Object(u.useCallback)((function(e){var t="mouseover"!==e.type;m(t)}));return r.a.createElement("div",{className:"navbar__search",key:"search-box"},r.a.createElement("span",{"aria-label":"expand searchbar",role:"button",className:d()("search-icon",{"search-icon-hidden":e.isSearchBarExpanded}),onClick:h,onKeyDown:h,tabIndex:0}),r.a.createElement("input",{id:"search_input_react",type:"search",placeholder:"Search","aria-label":"Search",className:d()("navbar__search-input",{"search-bar-expanded":e.isSearchBarExpanded},{"search-bar":!e.isSearchBarExpanded}),onMouseOver:v,onFocus:v,onBlur:b,ref:l}))}},501:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=Object.assign||function(e){for(var t=1;tthis.startX&&(this.setState({checked:!0}),this.startX=t,this.activated=tn?this.previouslyChecked!==this.state.checked&&(this.setState({checked:!1}),this.previouslyChecked=this.state.checked,t.click()):this.startX-4=0||Object.prototype.hasOwnProperty.call(e,u)&&(n[u]=e[u]);return n}(t,["className","icons"])),a=(0,o.default)("react-toggle",{"react-toggle--checked":this.state.checked,"react-toggle--focus":this.state.hasFocus,"react-toggle--disabled":this.props.disabled},n);return d.default.createElement("div",{className:a,onClick:this.handleClick,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEnd},d.default.createElement("div",{className:"react-toggle-track"},d.default.createElement("div",{className:"react-toggle-track-check"},this.getIcon("checked")),d.default.createElement("div",{className:"react-toggle-track-x"},this.getIcon("unchecked"))),d.default.createElement("div",{className:"react-toggle-thumb"}),d.default.createElement("input",u({},r,{ref:function(t){e.input=t},onFocus:this.handleFocus,onBlur:this.handleBlur,className:"react-toggle-screenreader-only",type:"checkbox"})))}}]),t}(a.PureComponent);t.default=p,p.displayName="Toggle",p.defaultProps={icons:{checked:d.default.createElement(c.default,null),unchecked:d.default.createElement(l.default,null)}},p.propTypes={checked:i.default.bool,disabled:i.default.bool,defaultChecked:i.default.bool,onChange:i.default.func,onFocus:i.default.func,onBlur:i.default.func,className:i.default.string,name:i.default.string,value:i.default.string,id:i.default.string,"aria-labelledby":i.default.string,"aria-label":i.default.string,icons:i.default.oneOfType([i.default.bool,i.default.shape({checked:i.default.node,unchecked:i.default.node})])}},502:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=(n(84),n(513),function(){var e=Object(u.useState)({}),t=e[0],n=e[1],r=Object(u.useCallback)((function(e,t){try{localStorage.setItem("docusaurus.tab."+e,t)}catch(n){console.error(n)}}),[]);return Object(u.useEffect)((function(){try{for(var e={},t=0;t=f?d(!1):e+n1&&"boolean"!=typeof t)throw new a('"allowMissing" argument must be a boolean');if(null===w(/^%?[^%]*%?$/,e))throw new u("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var n=x(e),r=n.length>0?n[0]:"",d=S("%"+r+"%",t),i=d.name,c=d.value,l=!1,f=d.alias;f&&(r=f[0],y(n,g([0,1],f)));for(var s=1,p=!0;s=n.length){var D=o(c,h);c=(p=!!D)&&"get"in D&&!("originalValue"in D.get)?D.get:c[h]}else p=v(c,h),c=c[h];p&&!l&&(m[i]=c)}}return c}},510:function(e,t,n){"use strict";var u=n(549);e.exports=Function.prototype.bind||u},511:function(e,t,n){"use strict";var u=String.prototype.replace,r=/%20/g,a="RFC1738",d="RFC3986";e.exports={default:d,formatters:{RFC1738:function(e){return u.call(e,r,"+")},RFC3986:function(e){return String(e)}},RFC1738:a,RFC3986:d}},512:function(e,t,n){"use strict";var u=n(39);n.d(t,"a",(function(){return u.c})),n.d(t,"b",(function(){return u.d})),n.d(t,"c",(function(){return u.e})),n.d(t,"d",(function(){return u.f}))},514:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(470),d=n(463),o=n.n(d);t.a=function(e){var t=e.count,n=e.label,u=e.permalink,d=e.style,i=e.value,c=e.valueOnly;return r.a.createElement(a.a,{to:u+"/",className:o()("badge","badge--rounded","badge--"+d)},c?i:n,t&&r.a.createElement(r.a.Fragment,null," (",t,")"))}},515:function(e,t,n){var u=n(516);e.exports=o;var r=Object.hasOwnProperty,a=/\s/g,d=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function o(){if(!(this instanceof o))return new o;this.reset()}function i(e,t){return"string"!=typeof e?"":(t||(e=e.toLowerCase()),e.trim().replace(d,"").replace(u(),"").replace(a,"-"))}o.prototype.slug=function(e,t){for(var n=i(e,!0===t),u=n;r.call(this.occurrences,n);)this.occurrences[u]++,n=u+"-"+this.occurrences[u];return this.occurrences[n]=0,n},o.prototype.reset=function(){this.occurrences=Object.create(null)},o.slug=i},516:function(e,t){e.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},518:function(e,t,n){"use strict";var u=n(511),r=Object.prototype.hasOwnProperty,a=Array.isArray,d=function(){for(var e=[],t=0;t<256;++t)e.push("%"+((t<16?"0":"")+t.toString(16)).toUpperCase());return e}(),o=function(e,t){for(var n=t&&t.plainObjects?Object.create(null):{},u=0;u1;){var t=e.pop(),n=t.obj[t.prop];if(a(n)){for(var u=[],r=0;r=48&&l<=57||l>=65&&l<=90||l>=97&&l<=122||a===u.RFC1738&&(40===l||41===l)?i+=o.charAt(c):l<128?i+=d[l]:l<2048?i+=d[192|l>>6]+d[128|63&l]:l<55296||l>=57344?i+=d[224|l>>12]+d[128|l>>6&63]+d[128|63&l]:(c+=1,l=65536+((1023&l)<<10|1023&o.charCodeAt(c)),i+=d[240|l>>18]+d[128|l>>12&63]+d[128|l>>6&63]+d[128|63&l])}return i},isBuffer:function(e){return!(!e||"object"!=typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},maybeMap:function(e,t){if(a(e)){for(var n=[],u=0;u{if("string"!=typeof e)throw new TypeError("Expected a string");return e=(e=(e=u(e)).toLowerCase().replace(/[_-]+/g," ").replace(/\s{2,}/g," ").trim()).charAt(0).toUpperCase()+e.slice(1)};e.exports=r,e.exports.default=r},525:function(e,t,n){"use strict";var u=n(0),r=n.n(u).a.createContext({isDarkTheme:!1,setLightTheme:function(){},setDarkTheme:function(){}});t.a=r},527:function(e,t,n){"use strict";(function(e){var u=n(1),r=(n(488),n(489),n(78),n(77),n(570),n(0)),a=n.n(r),d=n(571),o=n.n(d),i=n(603),c=n(53),l=n(463),f=n.n(l),s=n(583),p=n.n(s),m=n(572),h=n.n(m),b=n(476),v=n(485),g=n(148),y=n.n(g);(void 0!==e?e:window).Prism=c.a,n(573),n(574),n(575),n(576),n(90),n(577),n(578),n(579),n(580),n(581),n(582);var _=/{([\d,-]+)}/,E=/title=".*"/;t.a=function(e){var t=e.children,n=e.className,d=e.metastring,c=Object(b.a)().siteConfig.themeConfig.prism,l=void 0===c?{}:c,s=Object(r.useState)(!1),m=s[0],g=s[1],w=Object(r.useState)(!1),D=w[0],k=w[1];Object(r.useEffect)((function(){k(!0)}),[]);var x=Object(r.useRef)(null),S=Object(r.useRef)(null),C=[],O="",I=Object(v.a)().isDarkTheme,A=l.theme||p.a,j=l.darkTheme||A,N=I?j:A;if(d&&_.test(d)){var F=d.match(_)[1];C=h.a.parse(F).filter((function(e){return e>0}))}d&&E.test(d)&&(O=d.match(E)[0].split("title=")[1].replace(/"+/g,"")),Object(r.useEffect)((function(){var e;return S.current&&(e=new o.a(S.current,{target:function(){return x.current}})),function(){e&&e.destroy()}}),[S.current,x.current]);var T=n&&n.replace(/language-/,"");!T&&l.defaultLanguage&&(T=l.defaultLanguage);var P=function(){window.getSelection().empty(),g(!0),setTimeout((function(){return g(!1)}),2e3)};return a.a.createElement(i.a,Object(u.a)({},i.b,{key:D,theme:N,code:t.trim(),language:T}),(function(e){var t,n,r=e.className,d=e.style,o=e.tokens,i=e.getLineProps,c=e.getTokenProps;return a.a.createElement(a.a.Fragment,null,O&&a.a.createElement("div",{style:d,className:y.a.codeBlockTitle},O),a.a.createElement("div",{className:y.a.codeBlockContent},a.a.createElement("button",{ref:S,type:"button","aria-label":"Copy code to clipboard",className:f()(y.a.copyButton,(t={},t[y.a.copyButtonWithTitle]=O,t)),onClick:P},m?"Copied":"Copy"),a.a.createElement("pre",{className:f()(r,y.a.codeBlock,(n={},n[y.a.codeBlockWithTitle]=O,n))},a.a.createElement("div",{ref:x,className:y.a.codeBlockLines,style:d},o.map((function(e,t){1===e.length&&""===e[0].content&&(e[0].content="\n");var n=i({line:e,key:t});return C.includes(t+1)&&(n.className=n.className+" docusaurus-highlight-code-line"),a.a.createElement("div",Object(u.a)({key:t},n),e.map((function(e,t){return a.a.createElement("span",Object(u.a)({key:t},c({token:e,key:t})))})))}))))))}))}}).call(this,n(76))},528:function(e,t,n){"use strict";var u=n(0),r=n.n(u);n(464),n(144);t.a=function(e){var t=e.children,n=Object(u.useState)(!1),a=n[0],d=n[1];return a?r.a.createElement("div",{className:"code-explanation code-explanation--expanded"},t,r.a.createElement("div",{className:"code-explanation--toggle",onClick:function(){return d(!a)}},r.a.createElement("i",{className:"feather icon-arrow-up-circle"})," hide")):r.a.createElement("div",{className:"code-explanation code-explanation--collapsed"},r.a.createElement("div",{className:"code-explanation--toggle",onClick:function(){return d(!a)}},r.a.createElement("i",{className:"feather icon-info"})," explain this command"))}},529:function(e,t,n){"use strict";var u=n(30),r=n(12),a=n(27),d=n(91),o=n(92),i=n(26),c=n(585),l=n(93);r(r.S+r.F*!n(83)((function(e){Array.from(e)})),"Array",{from:function(e){var t,n,r,f,s=a(e),p="function"==typeof this?this:Array,m=arguments.length,h=m>1?arguments[1]:void 0,b=void 0!==h,v=0,g=l(s);if(b&&(h=u(h,m>2?arguments[2]:void 0,2)),null==g||p==Array&&o(g))for(n=new p(t=i(s.length));t>v;v++)c(n,v,b?h(s[v],v):s[v]);else for(f=g.call(s),n=new p;!(r=f.next()).done;v++)c(n,v,b?d(f,h,[r.value,v],!0):r.value);return n.length=v,n}})},530:function(e,t,n){"use strict";var u=n(586),r=n(532);e.exports=n(587)("Set",(function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(e){return u.def(r(this,"Set"),e=0===e?0:e,e)}},u)},531:function(e,t,n){var u=n(40)("meta"),r=n(13),a=n(31),d=n(28).f,o=0,i=Object.isExtensible||function(){return!0},c=!n(14)((function(){return i(Object.preventExtensions({}))})),l=function(e){d(e,u,{value:{i:"O"+ ++o,w:{}}})},f=e.exports={KEY:u,NEED:!1,fastKey:function(e,t){if(!r(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,u)){if(!i(e))return"F";if(!t)return"E";l(e)}return e[u].i},getWeak:function(e,t){if(!a(e,u)){if(!i(e))return!0;if(!t)return!1;l(e)}return e[u].w},onFreeze:function(e){return c&&f.NEED&&i(e)&&!a(e,u)&&l(e),e}}},532:function(e,t,n){var u=n(13);e.exports=function(e,t){if(!u(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}},533:function(e,t,n){"use strict";const u=n(534);e.exports=(e,t)=>{if("string"!=typeof e)throw new TypeError("Expected a string");t=void 0===t?"_":t;const n=u("([\\p{Ll}\\d])(\\p{Lu})","g"),r=u("(\\p{Lu}+)(\\p{Lu}[\\p{Ll}\\d]+)","g");return e.replace(n,`$1${t}$2`).replace(r,`$1${t}$2`).toLowerCase()}},534:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=f(n(535)),r=f(n(536)),a=f(n(537)),d=f(n(538)),o=f(n(539)),i=f(n(540)),c=f(n(541)),l=f(n(542));function f(e){return e&&e.__esModule?e:{default:e}}(0,r.default)(u.default),(0,a.default)(u.default),(0,d.default)(u.default),(0,o.default)(u.default),(0,i.default)(u.default),(0,c.default)(u.default),(0,l.default)(u.default),t.default=u.default,e.exports=t.default},535:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u={astral:!1},r={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},a={},d={},o={},i=[],c={default:/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,class:/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},l=/\$(?:{([\w$]+)}|<([\w$]+)>|(\d\d?|[\s\S]))/g,f=void 0===r.exec.call(/()??/,"")[1],s=void 0!==/x/.flags,p={}.toString;function m(e){var t=!0;try{new RegExp("",e)}catch(n){t=!1}return t}var h=m("u"),b=m("y"),v={g:!0,i:!0,m:!0,u:h,y:b};function g(e,t,n,u,r){var a=void 0;if(e.xregexp={captureNames:t},r)return e;if(e.__proto__)e.__proto__=j.prototype;else for(a in j.prototype)e[a]=j.prototype[a];return e.xregexp.source=n,e.xregexp.flags=u?u.split("").sort().join(""):u,e}function y(e){return r.replace.call(e,/([\s\S])(?=[\s\S]*\1)/g,"")}function _(e,t){if(!j.isRegExp(e))throw new TypeError("Type RegExp expected");var n=e.xregexp||{},u=function(e){return s?e.flags:r.exec.call(/\/([a-z]*)$/i,RegExp.prototype.toString.call(e))[1]}(e),a="",d="",o=null,i=null;return(t=t||{}).removeG&&(d+="g"),t.removeY&&(d+="y"),d&&(u=r.replace.call(u,new RegExp("["+d+"]+","g"),"")),t.addG&&(a+="g"),t.addY&&(a+="y"),a&&(u=y(u+a)),t.isInternalOnly||(void 0!==n.source&&(o=n.source),null!=n.flags&&(i=a?y(n.flags+a):n.flags)),e=g(new RegExp(t.source||e.source,u),function(e){return!(!e.xregexp||!e.xregexp.captureNames)}(e)?n.captureNames.slice(0):null,o,i,t.isInternalOnly)}function E(e){return parseInt(e,16)}function w(e,t,n){return"("===e.input[e.index-1]||")"===e.input[e.index+e[0].length]||function(e,t,n){return r.test.call(-1!==n.indexOf("x")?/^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/,e.slice(t))}(e.input,e.index+e[0].length,n)?"":"(?:)"}function D(e){return parseInt(e,10).toString(16)}function k(e,t){return p.call(e)==="[object "+t+"]"}function x(e){for(;e.length<4;)e="0"+e;return e}function S(e){var t={};return k(e,"String")?(j.forEach(e,/[^\s,]+/,(function(e){t[e]=!0})),t):e}function C(e){if(!/^[\w$]$/.test(e))throw new Error("Flag must be a single character A-Za-z0-9_$");v[e]=!0}function O(e,t,n,u,r){for(var a=i.length,d=e[n],o=null,c=void 0,l=void 0;a--;)if(!((l=i[a]).leadChar&&l.leadChar!==d||l.scope!==u&&"all"!==l.scope||l.flag&&-1===t.indexOf(l.flag))&&(c=j.exec(e,l.regex,n,"sticky"))){o={matchLength:c[0].length,output:l.handler.call(r,c,u,t),reparse:l.reparse};break}return o}function I(e){u.astral=e}function A(e){if(null==e)throw new TypeError("Cannot convert null or undefined to object");return e}function j(e,t){if(j.isRegExp(e)){if(void 0!==t)throw new TypeError("Cannot supply flags when copying a RegExp");return _(e)}if(e=void 0===e?"":String(e),t=void 0===t?"":String(t),j.isInstalled("astral")&&-1===t.indexOf("A")&&(t+="A"),o[e]||(o[e]={}),!o[e][t]){for(var n={hasNamedCapture:!1,captureNames:[]},u="default",a="",d=0,i=void 0,l=function(e,t){var n=void 0;if(y(t)!==t)throw new SyntaxError("Invalid duplicate regex flag "+t);for(e=r.replace.call(e,/^\(\?([\w$]+)\)/,(function(e,n){if(r.test.call(/[gy]/,n))throw new SyntaxError("Cannot use flag g or y in mode modifier "+e);return t=y(t+n),""})),n=0;n"}else if(n)return"\\"+(+n+d);return e}if(!k(e,"Array")||!e.length)throw new TypeError("Must provide a nonempty array of patterns to merge");for(var c=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,l=[],f=void 0,s=0;s1&&-1!==n.indexOf("")){var u=_(this,{removeG:!0,isInternalOnly:!0});r.replace.call(String(e).slice(n.index),u,(function(){for(var e=arguments.length,t=Array(e),u=0;un.index&&(this.lastIndex=n.index)}return this.global||(this.lastIndex=t),n},a.test=function(e){return!!a.exec.call(this,e)},a.match=function(e){if(j.isRegExp(e)){if(e.global){var t=r.match.apply(this,arguments);return e.lastIndex=0,t}}else e=new RegExp(e);return a.exec.call(e,A(this))},a.replace=function(e,t){var n=j.isRegExp(e),u=void 0,a=void 0,d=void 0;return n?(e.xregexp&&(a=e.xregexp.captureNames),u=e.lastIndex):e+="",d=k(t,"Function")?r.replace.call(String(this),e,(function(){for(var u=arguments.length,r=Array(u),d=0;dn.length-3)throw new SyntaxError("Backreference to undefined group "+e);return n[r]||""}throw new SyntaxError("Invalid token "+e)}})),n&&(e.global?e.lastIndex=0:e.lastIndex=u),d},a.split=function(e,t){if(!j.isRegExp(e))return r.split.apply(this,arguments);var n=String(this),u=[],a=e.lastIndex,d=0,o=void 0;return t=(void 0===t?-1:t)>>>0,j.forEach(n,e,(function(e){e.index+e[0].length>d&&(u.push(n.slice(d,e.index)),e.length>1&&e.indext?u.slice(0,t):u},j.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,(function(e,t){if("B"===e[1]&&"default"===t)return e[0];throw new SyntaxError("Invalid escape "+e[0])}),{scope:"all",leadChar:"\\"}),j.addToken(/\\u{([\dA-Fa-f]+)}/,(function(e,t,n){var u=E(e[1]);if(u>1114111)throw new SyntaxError("Invalid Unicode code point "+e[0]);if(u<=65535)return"\\u"+x(D(u));if(h&&-1!==n.indexOf("u"))return e[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u")}),{scope:"all",leadChar:"\\"}),j.addToken(/\[(\^?)\]/,(function(e){return e[1]?"[\\s\\S]":"\\b\\B"}),{leadChar:"["}),j.addToken(/\(\?#[^)]*\)/,w,{leadChar:"("}),j.addToken(/\s+|#[^\n]*\n?/,w,{flag:"x"}),j.addToken(/\./,(function(){return"[\\s\\S]"}),{flag:"s",leadChar:"."}),j.addToken(/\\k<([\w$]+)>/,(function(e){var t=isNaN(e[1])?this.captureNames.indexOf(e[1])+1:+e[1],n=e.index+e[0].length;if(!t||t>this.captureNames.length)throw new SyntaxError("Backreference to undefined group "+e[0]);return"\\"+t+(n===e.input.length||isNaN(e.input[n])?"":"(?:)")}),{leadChar:"\\"}),j.addToken(/\\(\d+)/,(function(e,t){if(!("default"===t&&/^[1-9]/.test(e[1])&&+e[1]<=this.captureNames.length)&&"0"!==e[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group "+e[0]);return e[0]}),{scope:"all",leadChar:"\\"}),j.addToken(/\(\?P?<([\w$]+)>/,(function(e){if(!isNaN(e[1]))throw new SyntaxError("Cannot use integer as capture name "+e[0]);if("length"===e[1]||"__proto__"===e[1])throw new SyntaxError("Cannot use reserved word as capture name "+e[0]);if(-1!==this.captureNames.indexOf(e[1]))throw new SyntaxError("Cannot use same name for multiple groups "+e[0]);return this.captureNames.push(e[1]),this.hasNamedCapture=!0,"("}),{leadChar:"("}),j.addToken(/\((?!\?)/,(function(e,t,n){return-1!==n.indexOf("n")?"(?:":(this.captureNames.push(null),"(")}),{optionalFlags:"n",leadChar:"("}),t.default=j,e.exports=t.default},536:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,n=e.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,t],"g",{conjunction:"or"});function u(e){var t=/^(?:\(\?:\))*\^/,n=/\$(?:\(\?:\))*$/;return t.test(e)&&n.test(e)&&n.test(e.replace(/\\[\s\S]/g,""))?e.replace(t,"").replace(n,""):e}function r(t,n){var u=n?"x":"";return e.isRegExp(t)?t.xregexp&&t.xregexp.captureNames?t:e(t.source,u):e(t,u)}function a(t){return t instanceof RegExp?t:e.escape(t)}function d(e,t,n){return e["subpattern"+n]=t,e}function o(e,t,n){return e+(t1?u-1:0),i=1;i"):i="(?:",h=m,""+i+l[d].pattern.replace(t,(function(e,t,n){if(t){if(o=l[d].names[m-h],++m,o)return"(?<"+o+">"}else if(n)return c=+n-1,l[d].names[c]?"\\k<"+l[d].names[c]+">":"\\"+(+n+h);return e}))+")"}if(r){if(o=g[b],v[++b]=++m,o)return"(?<"+o+">"}else if(a)return g[c=+a-1]?"\\k<"+g[c]+">":"\\"+v[+a];return e}));return e(y,o)}},e.exports=t.default},537:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){function t(e,t,n,u){return{name:e,value:t,start:n,end:u}}e.matchRecursive=function(n,u,r,a,d){d=d||{};var o=-1!==(a=a||"").indexOf("g"),i=-1!==a.indexOf("y"),c=a.replace(/y/g,""),l=d.escapeChar,f=d.valueNames,s=[],p=0,m=0,h=0,b=0,v=void 0,g=void 0,y=void 0,_=void 0,E=void 0;if(u=e(u,c),r=e(r,c),l){if(l.length>1)throw new Error("Cannot use more than one escape character");l=e.escape(l),E=new RegExp("(?:"+l+"[\\S\\s]|(?:(?!"+e.union([u,r],"",{conjunction:"or"}).source+")[^"+l+"])+)+",a.replace(/[^imu]+/g,""))}for(;;){if(l&&(h+=(e.exec(n,E,h,"sticky")||[""])[0].length),y=e.exec(n,u,h),_=e.exec(n,r,h),y&&_&&(y.index<=_.index?_=null:y=null),y||_)h=(m=(y||_).index)+(y||_)[0].length;else if(!p)break;if(i&&!p&&m>b)break;if(y)p||(v=m,g=h),++p;else{if(!_||!p)throw new Error("Unbalanced delimiter found in string");if(!--p&&(f?(f[0]&&v>b&&s.push(t(f[0],n.slice(b,v),b,v)),f[1]&&s.push(t(f[1],n.slice(v,g),v,g)),f[2]&&s.push(t(f[2],n.slice(g,m),g,m)),f[3]&&s.push(t(f[3],n.slice(m,h),m,h))):s.push(n.slice(g,m)),b=h,!o))break}m===h&&++h}return o&&!i&&f&&f[0]&&n.length>b&&s.push(t(f[0],n.slice(b),b,n.length)),s}},e.exports=t.default},538:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t={},n=e._dec,u=e._hex,r=e._pad4;function a(e){return e.replace(/[- _]+/g,"").toLowerCase()}function d(e){var t=/^\\[xu](.+)/.exec(e);return t?n(t[1]):e.charCodeAt("\\"===e[0]?1:0)}function o(n){var a,o,i;return t[n]["b!"]||(t[n]["b!"]=(a=t[n].bmp,o="",i=-1,e.forEach(a,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,(function(e){var t=d(e[1]);t>i+1&&(o+="\\u"+r(u(i+1)),t>i+2&&(o+="-\\u"+r(u(t-1)))),i=d(e[2]||e[1])})),i<65535&&(o+="\\u"+r(u(i+1)),i<65534&&(o+="-\\uFFFF")),o))}function i(e,n){var u=n?"a!":"a=";return t[e][u]||(t[e][u]=function(e,n){var u=t[e],r="";return u.bmp&&!u.isBmpLast&&(r="["+u.bmp+"]"+(u.astral?"|":"")),u.astral&&(r+=u.astral),u.isBmpLast&&u.bmp&&(r+=(u.astral?"|":"")+"["+u.bmp+"]"),n?"(?:(?!"+r+")(?:[\ud800-\udbff][\udc00-\udfff]|[\0-\uffff]))":"(?:"+r+")"}(e,n))}e.addToken(/\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/,(function(e,n,u){var r="P"===e[1]||!!e[2],d=-1!==u.indexOf("A"),c=a(e[4]||e[3]),l=t[c];if("P"===e[1]&&e[2])throw new SyntaxError("Invalid double negation "+e[0]);if(!t.hasOwnProperty(c))throw new SyntaxError("Unknown Unicode token "+e[0]);if(l.inverseOf){if(c=a(l.inverseOf),!t.hasOwnProperty(c))throw new ReferenceError("Unicode token missing data "+e[0]+" -> "+l.inverseOf);l=t[c],r=!r}if(!l.bmp&&!d)throw new SyntaxError("Astral mode required for Unicode token "+e[0]);if(d){if("class"===n)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");return i(c,r)}return"class"===n?r?o(c):l.bmp:(r?"[^":"[")+l.bmp+"]"}),{scope:"all",optionalFlags:"A",leadChar:"\\"}),e.addUnicodeData=function(n){for(var u=void 0,r=0;r\\x5E`\\x7C~\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20be\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83b[\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\x24\xa2-\xa5\u058f\u060b\u09f2\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20be\ua838\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\x5E`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u309b\u309c\ua700-\ua716\ua720\ua721\ua789\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3",astral:"\ud83c[\udffb-\udfff]"},{name:"Sm",alias:"Math_Symbol",bmp:"\\x2B<->\\x7C~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec",astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"\xa6\xa9\xae\xb0\u0482\u058d\u058e\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u214a\u214c\u214d\u214f\u218a\u218b\u2195-\u2199\u219c-\u219f\u21a1\u21a2\u21a4\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udffa]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Z",alias:"Separator",bmp:" \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:" \xa0\u1680\u2000-\u200a\u202f\u205f\u3000"}])},e.exports=t.default},541:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");var t=[{name:"ASCII",bmp:"\0-\x7f"},{name:"Alphabetic",bmp:"A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0345\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05b0-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0657\u0659-\u065f\u066e-\u06d3\u06d5-\u06dc\u06e1-\u06e8\u06ed-\u06ef\u06fa-\u06fc\u06ff\u0710-\u073f\u074d-\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0817\u081a-\u082c\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08df\u08e3-\u08e9\u08f0-\u093b\u093d-\u094c\u094e-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c4\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac5\u0ac7-\u0ac9\u0acb\u0acc\u0ad0\u0ae0-\u0ae3\u0af9\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d-\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4c\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccc\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e46\u0e4d\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ecd\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f71-\u0f81\u0f88-\u0f97\u0f99-\u0fbc\u1000-\u1036\u1038\u103b-\u103f\u1050-\u1062\u1065-\u1068\u106e-\u1086\u108e\u109c\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135f\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17b3\u17b6-\u17c8\u17d7\u17dc\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u1938\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a61-\u1a74\u1aa7\u1b00-\u1b33\u1b35-\u1b43\u1b45-\u1b4b\u1b80-\u1ba9\u1bac-\u1baf\u1bba-\u1be5\u1be7-\u1bf1\u1c00-\u1c35\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1de7-\u1df4\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua674-\ua67b\ua67f-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua827\ua840-\ua873\ua880-\ua8c3\ua8c5\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua92a\ua930-\ua952\ua960-\ua97c\ua980-\ua9b2\ua9b4-\ua9bf\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a\uaa7e-\uaabe\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc00-\udc45\udc82-\udcb8\udcd0-\udce8\udd00-\udd32\udd50-\udd72\udd76\udd80-\uddbf\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude34\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udee8\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d-\udf44\udf47\udf48\udf4b\udf4c\udf50\udf57\udf5d-\udf63]|\ud805[\udc00-\udc41\udc43-\udc45\udc47-\udc4a\udc80-\udcc1\udcc4\udcc5\udcc7\udd80-\uddb5\uddb8-\uddbe\uddd8-\udddd\ude00-\ude3e\ude40\ude44\ude80-\udeb5\udf00-\udf19\udf1d-\udf2a]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc3e\udc40\udc72-\udc8f\udc92-\udca7\udca9-\udcb6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf36\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9e]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd47]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Any",isBmpLast:!0,bmp:"\0-\uffff",astral:"[\ud800-\udbff][\udc00-\udfff]"},{name:"Default_Ignorable_Code_Point",bmp:"\xad\u034f\u061c\u115f\u1160\u17b4\u17b5\u180b-\u180e\u200b-\u200f\u202a-\u202e\u2060-\u206f\u3164\ufe00-\ufe0f\ufeff\uffa0\ufff0-\ufff8",astral:"\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|[\udb40-\udb43][\udc00-\udfff]"},{name:"Lowercase",bmp:"a-z\xaa\xb5\xba\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02b8\u02c0\u02c1\u02e0-\u02e4\u0345\u0371\u0373\u0377\u037a-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0561-\u0587\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1dbf\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u2071\u207f\u2090-\u209c\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2170-\u217f\u2184\u24d0-\u24e9\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7d\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b-\ua69d\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7b5\ua7b7\ua7f8-\ua7fa\uab30-\uab5a\uab5c-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a",astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud83a[\udd22-\udd43]"},{name:"Noncharacter_Code_Point",bmp:"\ufdd0-\ufdef\ufffe\uffff",astral:"[\ud83f\ud87f\ud8bf\ud8ff\ud93f\ud97f\ud9bf\ud9ff\uda3f\uda7f\udabf\udaff\udb3f\udb7f\udbbf\udbff][\udffe\udfff]"},{name:"Uppercase",bmp:"A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2160-\u216f\u2183\u24b6-\u24cf\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\uff21-\uff3a",astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]"},{name:"White_Space",bmp:"\t-\r \x85\xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"}];t.push({name:"Assigned",inverseOf:"Cn"}),e.addUnicodeData(t)},e.exports=t.default},542:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");e.addUnicodeData([{name:"Adlam",astral:"\ud83a[\udd00-\udd4a\udd50-\udd59\udd5e\udd5f]"},{name:"Ahom",astral:"\ud805[\udf00-\udf19\udf1d-\udf2b\udf30-\udf3f]"},{name:"Anatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude46]"},{name:"Arabic",bmp:"\u0600-\u0604\u0606-\u060b\u060d-\u061a\u061e\u0620-\u063f\u0641-\u064a\u0656-\u066f\u0671-\u06dc\u06de-\u06ff\u0750-\u077f\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08e1\u08e3-\u08ff\ufb50-\ufbc1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfd\ufe70-\ufe74\ufe76-\ufefc",astral:"\ud803[\ude60-\ude7e]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb\udef0\udef1]"},{name:"Armenian",bmp:"\u0531-\u0556\u0559-\u055f\u0561-\u0587\u058a\u058d-\u058f\ufb13-\ufb17"},{name:"Avestan",astral:"\ud802[\udf00-\udf35\udf39-\udf3f]"},{name:"Balinese",bmp:"\u1b00-\u1b4b\u1b50-\u1b7c"},{name:"Bamum",bmp:"\ua6a0-\ua6f7",astral:"\ud81a[\udc00-\ude38]"},{name:"Bassa_Vah",astral:"\ud81a[\uded0-\udeed\udef0-\udef5]"},{name:"Batak",bmp:"\u1bc0-\u1bf3\u1bfc-\u1bff"},{name:"Bengali",bmp:"\u0980-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09fb"},{name:"Bhaiksuki",astral:"\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc45\udc50-\udc6c]"},{name:"Bopomofo",bmp:"\u02ea\u02eb\u3105-\u312d\u31a0-\u31ba"},{name:"Brahmi",astral:"\ud804[\udc00-\udc4d\udc52-\udc6f\udc7f]"},{name:"Braille",bmp:"\u2800-\u28ff"},{name:"Buginese",bmp:"\u1a00-\u1a1b\u1a1e\u1a1f"},{name:"Buhid",bmp:"\u1740-\u1753"},{name:"Canadian_Aboriginal",bmp:"\u1400-\u167f\u18b0-\u18f5"},{name:"Carian",astral:"\ud800[\udea0-\uded0]"},{name:"Caucasian_Albanian",astral:"\ud801[\udd30-\udd63\udd6f]"},{name:"Chakma",astral:"\ud804[\udd00-\udd34\udd36-\udd43]"},{name:"Cham",bmp:"\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f"},{name:"Cherokee",bmp:"\u13a0-\u13f5\u13f8-\u13fd\uab70-\uabbf"},{name:"Common",bmp:"\0-@\\x5B-`\\x7B-\xa9\xab-\xb9\xbb-\xbf\xd7\xf7\u02b9-\u02df\u02e5-\u02e9\u02ec-\u02ff\u0374\u037e\u0385\u0387\u0589\u0605\u060c\u061b\u061c\u061f\u0640\u06dd\u08e2\u0964\u0965\u0e3f\u0fd5-\u0fd8\u10fb\u16eb-\u16ed\u1735\u1736\u1802\u1803\u1805\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u2000-\u200b\u200e-\u2064\u2066-\u2070\u2074-\u207e\u2080-\u208e\u20a0-\u20be\u2100-\u2125\u2127-\u2129\u212c-\u2131\u2133-\u214d\u214f-\u215f\u2189-\u218b\u2190-\u23fe\u2400-\u2426\u2440-\u244a\u2460-\u27ff\u2900-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2e00-\u2e44\u2ff0-\u2ffb\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303c-\u303f\u309b\u309c\u30a0\u30fb\u30fc\u3190-\u319f\u31c0-\u31e3\u3220-\u325f\u327f-\u32cf\u3358-\u33ff\u4dc0-\u4dff\ua700-\ua721\ua788-\ua78a\ua830-\ua839\ua92e\ua9cf\uab5b\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe66\ufe68-\ufe6b\ufeff\uff01-\uff20\uff3b-\uff40\uff5b-\uff65\uff70\uff9e\uff9f\uffe0-\uffe6\uffe8-\uffee\ufff9-\ufffd",astral:"\ud800[\udd00-\udd02\udd07-\udd33\udd37-\udd3f\udd90-\udd9b\uddd0-\uddfc\udee1-\udefb]|\ud82f[\udca0-\udca3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd66\udd6a-\udd7a\udd83\udd84\udd8c-\udda9\uddae-\udde8\udf00-\udf56\udf60-\udf71]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udfcb\udfce-\udfff]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd00-\udd0c\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\uddff\ude01\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|\udb40[\udc01\udc20-\udc7f]"},{name:"Coptic",bmp:"\u03e2-\u03ef\u2c80-\u2cf3\u2cf9-\u2cff"},{name:"Cuneiform",astral:"\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc70-\udc74\udc80-\udd43]"},{name:"Cypriot",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f]"},{name:"Cyrillic",bmp:"\u0400-\u0484\u0487-\u052f\u1c80-\u1c88\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f"},{name:"Deseret",astral:"\ud801[\udc00-\udc4f]"},{name:"Devanagari",bmp:"\u0900-\u0950\u0953-\u0963\u0966-\u097f\ua8e0-\ua8fd"},{name:"Duployan",astral:"\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9c-\udc9f]"},{name:"Egyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]"},{name:"Elbasan",astral:"\ud801[\udd00-\udd27]"},{name:"Ethiopic",bmp:"\u1200-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u137c\u1380-\u1399\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e"},{name:"Georgian",bmp:"\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u10ff\u2d00-\u2d25\u2d27\u2d2d"},{name:"Glagolitic",bmp:"\u2c00-\u2c2e\u2c30-\u2c5e",astral:"\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]"},{name:"Gothic",astral:"\ud800[\udf30-\udf4a]"},{name:"Grantha",astral:"\ud804[\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3c-\udf44\udf47\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]"},{name:"Greek",bmp:"\u0370-\u0373\u0375-\u0377\u037a-\u037d\u037f\u0384\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03e1\u03f0-\u03ff\u1d26-\u1d2a\u1d5d-\u1d61\u1d66-\u1d6a\u1dbf\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2126\uab65",astral:"\ud800[\udd40-\udd8e\udda0]|\ud834[\ude00-\ude45]"},{name:"Gujarati",bmp:"\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0af1\u0af9"},{name:"Gurmukhi",bmp:"\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75"},{name:"Han",bmp:"\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u3005\u3007\u3021-\u3029\u3038-\u303b\u3400-\u4db5\u4e00-\u9fd5\uf900-\ufa6d\ufa70-\ufad9",astral:"[\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Hangul",bmp:"\u1100-\u11ff\u302e\u302f\u3131-\u318e\u3200-\u321e\u3260-\u327e\ua960-\ua97c\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"},{name:"Hanunoo",bmp:"\u1720-\u1734"},{name:"Hatran",astral:"\ud802[\udce0-\udcf2\udcf4\udcf5\udcfb-\udcff]"},{name:"Hebrew",bmp:"\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufb4f"},{name:"Hiragana",bmp:"\u3041-\u3096\u309d-\u309f",astral:"\ud82c\udc01|\ud83c\ude00"},{name:"Imperial_Aramaic",astral:"\ud802[\udc40-\udc55\udc57-\udc5f]"},{name:"Inherited",bmp:"\u0300-\u036f\u0485\u0486\u064b-\u0655\u0670\u0951\u0952\u1ab0-\u1abe\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u200c\u200d\u20d0-\u20f0\u302a-\u302d\u3099\u309a\ufe00-\ufe0f\ufe20-\ufe2d",astral:"\ud800[\uddfd\udee0]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad]|\udb40[\udd00-\uddef]"},{name:"Inscriptional_Pahlavi",astral:"\ud802[\udf60-\udf72\udf78-\udf7f]"},{name:"Inscriptional_Parthian",astral:"\ud802[\udf40-\udf55\udf58-\udf5f]"},{name:"Javanese",bmp:"\ua980-\ua9cd\ua9d0-\ua9d9\ua9de\ua9df"},{name:"Kaithi",astral:"\ud804[\udc80-\udcc1]"},{name:"Kannada",bmp:"\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2"},{name:"Katakana",bmp:"\u30a1-\u30fa\u30fd-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff6f\uff71-\uff9d",astral:"\ud82c\udc00"},{name:"Kayah_Li",bmp:"\ua900-\ua92d\ua92f"},{name:"Kharoshthi",astral:"\ud802[\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f-\ude47\ude50-\ude58]"},{name:"Khmer",bmp:"\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9\u19e0-\u19ff"},{name:"Khojki",astral:"\ud804[\ude00-\ude11\ude13-\ude3e]"},{name:"Khudawadi",astral:"\ud804[\udeb0-\udeea\udef0-\udef9]"},{name:"Lao",bmp:"\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf"},{name:"Latin",bmp:"A-Za-z\xaa\xba\xc0-\xd6\xd8-\xf6\xf8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua7ff\uab30-\uab5a\uab5c-\uab64\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a"},{name:"Lepcha",bmp:"\u1c00-\u1c37\u1c3b-\u1c49\u1c4d-\u1c4f"},{name:"Limbu",bmp:"\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1940\u1944-\u194f"},{name:"Linear_A",astral:"\ud801[\ude00-\udf36\udf40-\udf55\udf60-\udf67]"},{name:"Linear_B",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa]"},{name:"Lisu",bmp:"\ua4d0-\ua4ff"},{name:"Lycian",astral:"\ud800[\ude80-\ude9c]"},{name:"Lydian",astral:"\ud802[\udd20-\udd39\udd3f]"},{name:"Mahajani",astral:"\ud804[\udd50-\udd76]"},{name:"Malayalam",bmp:"\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4f\u0d54-\u0d63\u0d66-\u0d7f"},{name:"Mandaic",bmp:"\u0840-\u085b\u085e"},{name:"Manichaean",astral:"\ud802[\udec0-\udee6\udeeb-\udef6]"},{name:"Marchen",astral:"\ud807[\udc70-\udc8f\udc92-\udca7\udca9-\udcb6]"},{name:"Meetei_Mayek",bmp:"\uaae0-\uaaf6\uabc0-\uabed\uabf0-\uabf9"},{name:"Mende_Kikakui",astral:"\ud83a[\udc00-\udcc4\udcc7-\udcd6]"},{name:"Meroitic_Cursive",astral:"\ud802[\udda0-\uddb7\uddbc-\uddcf\uddd2-\uddff]"},{name:"Meroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"Miao",astral:"\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]"},{name:"Modi",astral:"\ud805[\ude00-\ude44\ude50-\ude59]"},{name:"Mongolian",bmp:"\u1800\u1801\u1804\u1806-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18aa",astral:"\ud805[\ude60-\ude6c]"},{name:"Mro",astral:"\ud81a[\ude40-\ude5e\ude60-\ude69\ude6e\ude6f]"},{name:"Multani",astral:"\ud804[\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea9]"},{name:"Myanmar",bmp:"\u1000-\u109f\ua9e0-\ua9fe\uaa60-\uaa7f"},{name:"Nabataean",astral:"\ud802[\udc80-\udc9e\udca7-\udcaf]"},{name:"New_Tai_Lue",bmp:"\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de\u19df"},{name:"Newa",astral:"\ud805[\udc00-\udc59\udc5b\udc5d]"},{name:"Nko",bmp:"\u07c0-\u07fa"},{name:"Ogham",bmp:"\u1680-\u169c"},{name:"Ol_Chiki",bmp:"\u1c50-\u1c7f"},{name:"Old_Hungarian",astral:"\ud803[\udc80-\udcb2\udcc0-\udcf2\udcfa-\udcff]"},{name:"Old_Italic",astral:"\ud800[\udf00-\udf23]"},{name:"Old_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"Old_Permic",astral:"\ud800[\udf50-\udf7a]"},{name:"Old_Persian",astral:"\ud800[\udfa0-\udfc3\udfc8-\udfd5]"},{name:"Old_South_Arabian",astral:"\ud802[\ude60-\ude7f]"},{name:"Old_Turkic",astral:"\ud803[\udc00-\udc48]"},{name:"Oriya",bmp:"\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b77"},{name:"Osage",astral:"\ud801[\udcb0-\udcd3\udcd8-\udcfb]"},{name:"Osmanya",astral:"\ud801[\udc80-\udc9d\udca0-\udca9]"},{name:"Pahawh_Hmong",astral:"\ud81a[\udf00-\udf45\udf50-\udf59\udf5b-\udf61\udf63-\udf77\udf7d-\udf8f]"},{name:"Palmyrene",astral:"\ud802[\udc60-\udc7f]"},{name:"Pau_Cin_Hau",astral:"\ud806[\udec0-\udef8]"},{name:"Phags_Pa",bmp:"\ua840-\ua877"},{name:"Phoenician",astral:"\ud802[\udd00-\udd1b\udd1f]"},{name:"Psalter_Pahlavi",astral:"\ud802[\udf80-\udf91\udf99-\udf9c\udfa9-\udfaf]"},{name:"Rejang",bmp:"\ua930-\ua953\ua95f"},{name:"Runic",bmp:"\u16a0-\u16ea\u16ee-\u16f8"},{name:"Samaritan",bmp:"\u0800-\u082d\u0830-\u083e"},{name:"Saurashtra",bmp:"\ua880-\ua8c5\ua8ce-\ua8d9"},{name:"Sharada",astral:"\ud804[\udd80-\uddcd\uddd0-\udddf]"},{name:"Shavian",astral:"\ud801[\udc50-\udc7f]"},{name:"Siddham",astral:"\ud805[\udd80-\uddb5\uddb8-\udddd]"},{name:"SignWriting",astral:"\ud836[\udc00-\ude8b\ude9b-\ude9f\udea1-\udeaf]"},{name:"Sinhala",bmp:"\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4",astral:"\ud804[\udde1-\uddf4]"},{name:"Sora_Sompeng",astral:"\ud804[\udcd0-\udce8\udcf0-\udcf9]"},{name:"Sundanese",bmp:"\u1b80-\u1bbf\u1cc0-\u1cc7"},{name:"Syloti_Nagri",bmp:"\ua800-\ua82b"},{name:"Syriac",bmp:"\u0700-\u070d\u070f-\u074a\u074d-\u074f"},{name:"Tagalog",bmp:"\u1700-\u170c\u170e-\u1714"},{name:"Tagbanwa",bmp:"\u1760-\u176c\u176e-\u1770\u1772\u1773"},{name:"Tai_Le",bmp:"\u1950-\u196d\u1970-\u1974"},{name:"Tai_Tham",bmp:"\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad"},{name:"Tai_Viet",bmp:"\uaa80-\uaac2\uaadb-\uaadf"},{name:"Takri",astral:"\ud805[\ude80-\udeb7\udec0-\udec9]"},{name:"Tamil",bmp:"\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bfa"},{name:"Tangut",astral:"\ud81b\udfe0|[\ud81c-\ud820][\udc00-\udfff]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]"},{name:"Telugu",bmp:"\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f"},{name:"Thaana",bmp:"\u0780-\u07b1"},{name:"Thai",bmp:"\u0e01-\u0e3a\u0e40-\u0e5b"},{name:"Tibetan",bmp:"\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc\u0fce-\u0fd4\u0fd9\u0fda"},{name:"Tifinagh",bmp:"\u2d30-\u2d67\u2d6f\u2d70\u2d7f"},{name:"Tirhuta",astral:"\ud805[\udc80-\udcc7\udcd0-\udcd9]"},{name:"Ugaritic",astral:"\ud800[\udf80-\udf9d\udf9f]"},{name:"Vai",bmp:"\ua500-\ua62b"},{name:"Warang_Citi",astral:"\ud806[\udca0-\udcf2\udcff]"},{name:"Yi",bmp:"\ua000-\ua48c\ua490-\ua4c6"}])},e.exports=t.default},543:function(e,t,n){"use strict";var u=n(0),r=n.n(u);t.a=function(e){var t=e.text;return r.a.createElement("section",{className:"empty"},r.a.createElement("div",{className:"icon"},r.a.createElement("img",{src:"/img/logo-square.svg",alt:"The Qovery Logo"})),r.a.createElement("div",{className:"text"},t))}},544:function(e,t,n){"use strict";var u=n(545),r=n(555),a=n(511);e.exports={formats:a,parse:r,stringify:u}},545:function(e,t,n){"use strict";var u=n(546),r=n(518),a=n(511),d=Object.prototype.hasOwnProperty,o={brackets:function(e){return e+"[]"},comma:"comma",indices:function(e,t){return e+"["+t+"]"},repeat:function(e){return e}},i=Array.isArray,c=String.prototype.split,l=Array.prototype.push,f=function(e,t){l.apply(e,i(t)?t:[t])},s=Date.prototype.toISOString,p=a.default,m={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:r.encode,encodeValuesOnly:!1,format:p,formatter:a.formatters[p],indices:!1,serializeDate:function(e){return s.call(e)},skipNulls:!1,strictNullHandling:!1},h={},b=function e(t,n,a,d,o,l,s,p,b,v,g,y,_,E,w,D){for(var k,x=t,S=D,C=0,O=!1;void 0!==(S=S.get(h))&&!O;){var I=S.get(t);if(C+=1,void 0!==I){if(I===C)throw new RangeError("Cyclic object value");O=!0}void 0===S.get(h)&&(C=0)}if("function"==typeof p?x=p(n,x):x instanceof Date?x=g(x):"comma"===a&&i(x)&&(x=r.maybeMap(x,(function(e){return e instanceof Date?g(e):e}))),null===x){if(o)return s&&!E?s(n,m.encoder,w,"key",y):n;x=""}if("string"==typeof(k=x)||"number"==typeof k||"boolean"==typeof k||"symbol"==typeof k||"bigint"==typeof k||r.isBuffer(x)){if(s){var A=E?n:s(n,m.encoder,w,"key",y);if("comma"===a&&E){for(var j=c.call(String(x),","),N="",F=0;F0?x.join(",")||null:void 0}];else if(i(p))T=p;else{var M=Object.keys(x);T=b?M.sort(b):M}for(var R=d&&i(x)&&1===x.length?n+"[]":n,L=0;L0?E+_:""}},546:function(e,t,n){"use strict";var u=n(509),r=n(551),a=n(553),d=u("%TypeError%"),o=u("%WeakMap%",!0),i=u("%Map%",!0),c=r("WeakMap.prototype.get",!0),l=r("WeakMap.prototype.set",!0),f=r("WeakMap.prototype.has",!0),s=r("Map.prototype.get",!0),p=r("Map.prototype.set",!0),m=r("Map.prototype.has",!0),h=function(e,t){for(var n,u=e;null!==(n=u.next);u=n)if(n.key===t)return u.next=n.next,n.next=e.next,e.next=n,n};e.exports=function(){var e,t,n,u={assert:function(e){if(!u.has(e))throw new d("Side channel does not contain "+a(e))},get:function(u){if(o&&u&&("object"==typeof u||"function"==typeof u)){if(e)return c(e,u)}else if(i){if(t)return s(t,u)}else if(n)return function(e,t){var n=h(e,t);return n&&n.value}(n,u)},has:function(u){if(o&&u&&("object"==typeof u||"function"==typeof u)){if(e)return f(e,u)}else if(i){if(t)return m(t,u)}else if(n)return function(e,t){return!!h(e,t)}(n,u);return!1},set:function(u,r){o&&u&&("object"==typeof u||"function"==typeof u)?(e||(e=new o),l(e,u,r)):i?(t||(t=new i),p(t,u,r)):(n||(n={key:{},next:null}),function(e,t,n){var u=h(e,t);u?u.value=n:e.next={key:t,next:e.next,value:n}}(n,u,r))}};return u}},547:function(e,t,n){"use strict";var u="undefined"!=typeof Symbol&&Symbol,r=n(548);e.exports=function(){return"function"==typeof u&&("function"==typeof Symbol&&("symbol"==typeof u("foo")&&("symbol"==typeof Symbol("bar")&&r())))}},548:function(e,t,n){"use strict";e.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var e={},t=Symbol("test"),n=Object(t);if("string"==typeof t)return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;if("[object Symbol]"!==Object.prototype.toString.call(n))return!1;for(t in e[t]=42,e)return!1;if("function"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var u=Object.getOwnPropertySymbols(e);if(1!==u.length||u[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var r=Object.getOwnPropertyDescriptor(e,t);if(42!==r.value||!0!==r.enumerable)return!1}return!0}},549:function(e,t,n){"use strict";var u="Function.prototype.bind called on incompatible ",r=Array.prototype.slice,a=Object.prototype.toString;e.exports=function(e){var t=this;if("function"!=typeof t||"[object Function]"!==a.call(t))throw new TypeError(u+t);for(var n,d=r.call(arguments,1),o=function(){if(this instanceof n){var u=t.apply(this,d.concat(r.call(arguments)));return Object(u)===u?u:this}return t.apply(e,d.concat(r.call(arguments)))},i=Math.max(0,t.length-d.length),c=[],l=0;l-1?r(n):n}},552:function(e,t,n){"use strict";var u=n(510),r=n(509),a=r("%Function.prototype.apply%"),d=r("%Function.prototype.call%"),o=r("%Reflect.apply%",!0)||u.call(d,a),i=r("%Object.getOwnPropertyDescriptor%",!0),c=r("%Object.defineProperty%",!0),l=r("%Math.max%");if(c)try{c({},"a",{value:1})}catch(s){c=null}e.exports=function(e){var t=o(u,d,arguments);if(i&&c){var n=i(t,"length");n.configurable&&c(t,"length",{value:1+l(0,e.length-(arguments.length-1))})}return t};var f=function(){return o(u,a,arguments)};c?c(e.exports,"apply",{value:f}):e.exports.apply=f},553:function(e,t,n){var u="function"==typeof Map&&Map.prototype,r=Object.getOwnPropertyDescriptor&&u?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,a=u&&r&&"function"==typeof r.get?r.get:null,d=u&&Map.prototype.forEach,o="function"==typeof Set&&Set.prototype,i=Object.getOwnPropertyDescriptor&&o?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,c=o&&i&&"function"==typeof i.get?i.get:null,l=o&&Set.prototype.forEach,f="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,s="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,p="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,m=Boolean.prototype.valueOf,h=Object.prototype.toString,b=Function.prototype.toString,v=String.prototype.match,g=String.prototype.slice,y=String.prototype.replace,_=String.prototype.toUpperCase,E=String.prototype.toLowerCase,w=RegExp.prototype.test,D=Array.prototype.concat,k=Array.prototype.join,x=Array.prototype.slice,S=Math.floor,C="function"==typeof BigInt?BigInt.prototype.valueOf:null,O=Object.getOwnPropertySymbols,I="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,A="function"==typeof Symbol&&"object"==typeof Symbol.iterator,j="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===A||"symbol")?Symbol.toStringTag:null,N=Object.prototype.propertyIsEnumerable,F=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(e){return e.__proto__}:null);function T(e,t){if(e===1/0||e===-1/0||e!=e||e&&e>-1e3&&e<1e3||w.call(/e/,t))return t;var n=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof e){var u=e<0?-S(-e):S(e);if(u!==e){var r=String(u),a=g.call(t,r.length+1);return y.call(r,n,"$&_")+"."+y.call(y.call(a,/([0-9]{3})/g,"$&_"),/_$/,"")}}return y.call(t,n,"$&_")}var P=n(554),M=P.custom,R=W(M)?M:null;function L(e,t,n){var u="double"===(n.quoteStyle||t)?'"':"'";return u+e+u}function B(e){return y.call(String(e),/"/g,""")}function z(e){return!("[object Array]"!==q(e)||j&&"object"==typeof e&&j in e)}function U(e){return!("[object RegExp]"!==q(e)||j&&"object"==typeof e&&j in e)}function W(e){if(A)return e&&"object"==typeof e&&e instanceof Symbol;if("symbol"==typeof e)return!0;if(!e||"object"!=typeof e||!I)return!1;try{return I.call(e),!0}catch(t){}return!1}e.exports=function e(t,n,u,r){var o=n||{};if($(o,"quoteStyle")&&"single"!==o.quoteStyle&&"double"!==o.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if($(o,"maxStringLength")&&("number"==typeof o.maxStringLength?o.maxStringLength<0&&o.maxStringLength!==1/0:null!==o.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var i=!$(o,"customInspect")||o.customInspect;if("boolean"!=typeof i&&"symbol"!==i)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if($(o,"indent")&&null!==o.indent&&"\t"!==o.indent&&!(parseInt(o.indent,10)===o.indent&&o.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if($(o,"numericSeparator")&&"boolean"!=typeof o.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var h=o.numericSeparator;if(void 0===t)return"undefined";if(null===t)return"null";if("boolean"==typeof t)return t?"true":"false";if("string"==typeof t)return function e(t,n){if(t.length>n.maxStringLength){var u=t.length-n.maxStringLength,r="... "+u+" more character"+(u>1?"s":"");return e(g.call(t,0,n.maxStringLength),n)+r}return L(y.call(y.call(t,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,V),"single",n)}(t,o);if("number"==typeof t){if(0===t)return 1/0/t>0?"0":"-0";var _=String(t);return h?T(t,_):_}if("bigint"==typeof t){var w=String(t)+"n";return h?T(t,w):w}var S=void 0===o.depth?5:o.depth;if(void 0===u&&(u=0),u>=S&&S>0&&"object"==typeof t)return z(t)?"[Array]":"[Object]";var O=function(e,t){var n;if("\t"===e.indent)n="\t";else{if(!("number"==typeof e.indent&&e.indent>0))return null;n=k.call(Array(e.indent+1)," ")}return{base:n,prev:k.call(Array(t+1),n)}}(o,u);if(void 0===r)r=[];else if(G(r,t)>=0)return"[Circular]";function M(t,n,a){if(n&&(r=x.call(r)).push(n),a){var d={depth:o.depth};return $(o,"quoteStyle")&&(d.quoteStyle=o.quoteStyle),e(t,d,u+1,r)}return e(t,o,u+1,r)}if("function"==typeof t&&!U(t)){var H=function(e){if(e.name)return e.name;var t=v.call(b.call(e),/^function\s*([\w$]+)/);if(t)return t[1];return null}(t),Q=X(t,M);return"[Function"+(H?": "+H:" (anonymous)")+"]"+(Q.length>0?" { "+k.call(Q,", ")+" }":"")}if(W(t)){var ee=A?y.call(String(t),/^(Symbol\(.*\))_[^)]*$/,"$1"):I.call(t);return"object"!=typeof t||A?ee:K(ee)}if(function(e){if(!e||"object"!=typeof e)return!1;if("undefined"!=typeof HTMLElement&&e instanceof HTMLElement)return!0;return"string"==typeof e.nodeName&&"function"==typeof e.getAttribute}(t)){for(var te="<"+E.call(String(t.nodeName)),ne=t.attributes||[],ue=0;ue"}if(z(t)){if(0===t.length)return"[]";var re=X(t,M);return O&&!function(e){for(var t=0;t=0)return!1;return!0}(re)?"["+Y(re,O)+"]":"[ "+k.call(re,", ")+" ]"}if(function(e){return!("[object Error]"!==q(e)||j&&"object"==typeof e&&j in e)}(t)){var ae=X(t,M);return"cause"in Error.prototype||!("cause"in t)||N.call(t,"cause")?0===ae.length?"["+String(t)+"]":"{ ["+String(t)+"] "+k.call(ae,", ")+" }":"{ ["+String(t)+"] "+k.call(D.call("[cause]: "+M(t.cause),ae),", ")+" }"}if("object"==typeof t&&i){if(R&&"function"==typeof t[R]&&P)return P(t,{depth:S-u});if("symbol"!==i&&"function"==typeof t.inspect)return t.inspect()}if(function(e){if(!a||!e||"object"!=typeof e)return!1;try{a.call(e);try{c.call(e)}catch(te){return!0}return e instanceof Map}catch(t){}return!1}(t)){var de=[];return d.call(t,(function(e,n){de.push(M(n,t,!0)+" => "+M(e,t))})),J("Map",a.call(t),de,O)}if(function(e){if(!c||!e||"object"!=typeof e)return!1;try{c.call(e);try{a.call(e)}catch(t){return!0}return e instanceof Set}catch(n){}return!1}(t)){var oe=[];return l.call(t,(function(e){oe.push(M(e,t))})),J("Set",c.call(t),oe,O)}if(function(e){if(!f||!e||"object"!=typeof e)return!1;try{f.call(e,f);try{s.call(e,s)}catch(te){return!0}return e instanceof WeakMap}catch(t){}return!1}(t))return Z("WeakMap");if(function(e){if(!s||!e||"object"!=typeof e)return!1;try{s.call(e,s);try{f.call(e,f)}catch(te){return!0}return e instanceof WeakSet}catch(t){}return!1}(t))return Z("WeakSet");if(function(e){if(!p||!e||"object"!=typeof e)return!1;try{return p.call(e),!0}catch(t){}return!1}(t))return Z("WeakRef");if(function(e){return!("[object Number]"!==q(e)||j&&"object"==typeof e&&j in e)}(t))return K(M(Number(t)));if(function(e){if(!e||"object"!=typeof e||!C)return!1;try{return C.call(e),!0}catch(t){}return!1}(t))return K(M(C.call(t)));if(function(e){return!("[object Boolean]"!==q(e)||j&&"object"==typeof e&&j in e)}(t))return K(m.call(t));if(function(e){return!("[object String]"!==q(e)||j&&"object"==typeof e&&j in e)}(t))return K(M(String(t)));if(!function(e){return!("[object Date]"!==q(e)||j&&"object"==typeof e&&j in e)}(t)&&!U(t)){var ie=X(t,M),ce=F?F(t)===Object.prototype:t instanceof Object||t.constructor===Object,le=t instanceof Object?"":"null prototype",fe=!ce&&j&&Object(t)===t&&j in t?g.call(q(t),8,-1):le?"Object":"",se=(ce||"function"!=typeof t.constructor?"":t.constructor.name?t.constructor.name+" ":"")+(fe||le?"["+k.call(D.call([],fe||[],le||[]),": ")+"] ":"");return 0===ie.length?se+"{}":O?se+"{"+Y(ie,O)+"}":se+"{ "+k.call(ie,", ")+" }"}return String(t)};var H=Object.prototype.hasOwnProperty||function(e){return e in this};function $(e,t){return H.call(e,t)}function q(e){return h.call(e)}function G(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,u=e.length;n-1?e.split(","):e},c=function(e,t,n,u){if(e){var a=n.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e,d=/(\[[^[\]]*])/g,o=n.depth>0&&/(\[[^[\]]*])/.exec(a),c=o?a.slice(0,o.index):a,l=[];if(c){if(!n.plainObjects&&r.call(Object.prototype,c)&&!n.allowPrototypes)return;l.push(c)}for(var f=0;n.depth>0&&null!==(o=d.exec(a))&&f=0;--a){var d,o=e[a];if("[]"===o&&n.parseArrays)d=[].concat(r);else{d=n.plainObjects?Object.create(null):{};var c="["===o.charAt(0)&&"]"===o.charAt(o.length-1)?o.slice(1,-1):o,l=parseInt(c,10);n.parseArrays||""!==c?!isNaN(l)&&o!==c&&String(l)===c&&l>=0&&n.parseArrays&&l<=n.arrayLimit?(d=[])[l]=r:"__proto__"!==c&&(d[c]=r):d={0:r}}r=d}return r}(l,t,n,u)}};e.exports=function(e,t){var n=function(e){if(!e)return d;if(null!==e.decoder&&void 0!==e.decoder&&"function"!=typeof e.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var t=void 0===e.charset?d.charset:e.charset;return{allowDots:void 0===e.allowDots?d.allowDots:!!e.allowDots,allowPrototypes:"boolean"==typeof e.allowPrototypes?e.allowPrototypes:d.allowPrototypes,allowSparse:"boolean"==typeof e.allowSparse?e.allowSparse:d.allowSparse,arrayLimit:"number"==typeof e.arrayLimit?e.arrayLimit:d.arrayLimit,charset:t,charsetSentinel:"boolean"==typeof e.charsetSentinel?e.charsetSentinel:d.charsetSentinel,comma:"boolean"==typeof e.comma?e.comma:d.comma,decoder:"function"==typeof e.decoder?e.decoder:d.decoder,delimiter:"string"==typeof e.delimiter||u.isRegExp(e.delimiter)?e.delimiter:d.delimiter,depth:"number"==typeof e.depth||!1===e.depth?+e.depth:d.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof e.interpretNumericEntities?e.interpretNumericEntities:d.interpretNumericEntities,parameterLimit:"number"==typeof e.parameterLimit?e.parameterLimit:d.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:"boolean"==typeof e.plainObjects?e.plainObjects:d.plainObjects,strictNullHandling:"boolean"==typeof e.strictNullHandling?e.strictNullHandling:d.strictNullHandling}}(t);if(""===e||null==e)return n.plainObjects?Object.create(null):{};for(var l="string"==typeof e?function(e,t){var n,c={},l=t.ignoreQueryPrefix?e.replace(/^\?/,""):e,f=t.parameterLimit===1/0?void 0:t.parameterLimit,s=l.split(t.delimiter,f),p=-1,m=t.charset;if(t.charsetSentinel)for(n=0;n-1&&(b=a(b)?[b]:b),r.call(c,h)?c[h]=u.combine(c[h],b):c[h]=b}return c}(e,n):e,f=n.plainObjects?Object.create(null):{},s=Object.keys(l),p=0;p'},heart:{width:12,height:16,path:''},eye:{width:16,height:16,path:''},star:{width:14,height:16,path:''},"repo-forked":{width:10,height:16,path:''},"repo-template":{width:14,height:16,path:''},"issue-opened":{width:14,height:16,path:''},"cloud-download":{width:16,height:16,path:''}},g={},y=function(e,t){var n=g[e]||(g[e]=[]);if(!(n.push(t)>1)){var u=function(e){var t;return function(){t||(t=1,e.apply(this,arguments))}}((function(){for(delete g[e];t=n.shift();)t.apply(null,arguments)}));if(l){var r=new d;s(r,"abort",u),s(r,"error",u),s(r,"load",(function(){var e;try{e=JSON.parse(r.responseText)}catch(t){return void u(t)}u(200!==r.status,e)})),r.open("GET",e),r.send()}else{var a=this||window;a._=function(e){a._=null,u(200!==e.meta.status,e.data)};var i=o(a.document)("script",{async:!0,src:e+(/\?/.test(e)?"&":"?")+"callback=_"}),c=function(){a._&&a._({meta:{}})};s(i,"load",c),s(i,"error",c),i.readyState&&function(e,t,n){var u=function(r){if(t.test(e.readyState))return p(e,"readystatechange",u),n(r)};s(e,"readystatechange",u)}(i,/de|m/,c),a.document.getElementsByTagName("head")[0].appendChild(i)}}},E=function(e,t,n){var u=o(e.ownerDocument),r=e.appendChild(u("style",{type:"text/css"})),a="body{margin:0}a{text-decoration:none;outline:0}.widget{display:inline-block;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:0;white-space:nowrap}.btn,.social-count{position:relative;display:inline-block;height:14px;padding:2px 5px;font-size:11px;font-weight:600;line-height:14px;vertical-align:bottom;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-repeat:repeat-x;background-position:-1px -1px;background-size:110% 110%;border:1px solid}.btn{border-radius:.25em}.btn:not(:last-child){border-radius:.25em 0 0 .25em}.social-count{border-left:0;border-radius:0 .25em .25em 0}.widget-lg .btn,.widget-lg .social-count{height:20px;padding:3px 10px;font-size:12px;line-height:20px}.octicon{display:inline-block;vertical-align:text-top;fill:currentColor}"+b(t["data-color-scheme"]);r.styleSheet?r.styleSheet.cssText=a:r.appendChild(e.ownerDocument.createTextNode(a));var d,i,l=u("a",{className:"btn",href:t.href,target:"_blank",rel:"noopener",innerHTML:(d=t["data-icon"],i=/^large$/i.test(t["data-size"])?16:14,d=(""+d).toLowerCase().replace(/^octicon-/,""),c(v,d)||(d="mark-github"),'"),"aria-label":t["aria-label"]||void 0},[" ",u("span",{},[t["data-text"]||""])]),f=e.appendChild(u("div",{className:"widget"+(/^large$/i.test(t["data-size"])?" widget-lg":"")},[l])),s=l.hostname.split(".").reverse();if(""===s[0]&&s.shift(),"com"!==s[0]||"github"!==s[1])return l.href="#",l.target="_self",void n(f);var p=s.length,m=(" /"+l.pathname).split(/\/+/);if(((2===p||3===p&&"gist"===s[2])&&"archive"===m[3]||2===p&&"releases"===m[3]&&"download"===m[4]||3===p&&"codeload"===s[2])&&(l.target="_top"),/^true$/i.test(t["data-show-count"])&&2===p){var h,g;if(!m[2]&&m[1])h=g="followers";else if(!m[3]&&m[2])g="stargazers_count",h="stargazers";else if(m[4]||"subscription"!==m[3])if(m[4]||"fork"!==m[3]){if("issues"!==m[3])return void n(f);g="open_issues_count",h="issues"}else g="forks_count",h="network/members";else g="subscribers_count",h="watchers";var _=m[2]?"/repos/"+m[1]+"/"+m[2]:"/users/"+m[1];y.call(this,"https://api.github.com"+_,(function(e,t){if(!e){var r=t[g];f.appendChild(u("a",{className:"social-count",href:t.html_url+"/"+h,target:"_blank",rel:"noopener","aria-label":r+" "+g.replace(/_count$/,"").replace("_"," ").slice(0,r<2?-1:void 0)+" on GitHub"},[(""+r).replace(/\B(?=(\d{3})+(?!\d))/g,",")]))}n(f)}))}else n(f)},w=window.devicePixelRatio||1,D=function(e){return(w>1?r.ceil(r.round(e*w)/w*2)/2:r.ceil(e))||0},k=function(e,t){e.style.width=t[0]+"px",e.style.height=t[1]+"px"},x=function(e,t){if(null!=e&&null!=t)if(e.getAttribute&&(e=function(e){for(var t={href:e.href,title:e.title,"aria-label":e.getAttribute("aria-label")},n=["icon","color-scheme","text","size","show-count"],u=0,r=n.length;u0){var n=t[0];return{x:n.clientX,y:n.clientY}}var u=e.pageX;if(void 0!==u)return{x:u,y:e.pageY}}return{x:0,y:0}}},567:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(470),d=n(463),o=n.n(d);n(147);t.a=function(e){var t=e.className,n=e.previous,u=e.next;return r.a.createElement("nav",{className:o()("pagination-nav",t)},r.a.createElement("div",{className:"pagination-nav__item"},n&&r.a.createElement(a.a,{className:"pagination-nav__link",to:n.permalink},r.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Previous"),r.a.createElement("h4",{className:"pagination-nav__link--label"},"\xab ",n.title))),r.a.createElement("div",{className:"pagination-nav__item pagination-nav__item--next"},u&&r.a.createElement(a.a,{className:"pagination-nav__link",to:u.permalink},r.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Next"),r.a.createElement("h4",{className:"pagination-nav__link--label"},u.title," \xbb"))))}},568:function(e,t,n){"use strict";var u=n(0);t.a=function(e,t,n){var r=Object(u.useState)(void 0),a=r[0],d=r[1];Object(u.useEffect)((function(){var u=[],r=[];function o(){var o=function(){var e=0,t=null;for(u=document.getElementsByClassName("anchor");e=0&&a<=n&&(t=r),e+=1}return t}();if(o){var i=0,c=!1;for(r=document.getElementsByClassName(e);i0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var e=this,t="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[t?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=r()(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=r()(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":a(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function(){return this._target}}]),e}(),i=n(1),c=n.n(i),l=n(2),f=n.n(l),s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===s(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=f()(e,"click",(function(e){return t.onClick(e)}))}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new o({action:this.action(t),target:this.target(t),text:this.text(t),container:this.container,trigger:t,emitter:this})}},{key:"defaultAction",value:function(e){return h("action",e)}},{key:"defaultTarget",value:function(e){var t=h("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return h("text",e)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach((function(e){n=n&&!!document.queryCommandSupported(e)})),n}}]),t}(c.a);function h(e,t){var n="data-clipboard-"+e;if(t.hasAttribute(n))return t.getAttribute(n)}t.default=m}]).default},e.exports=u()},572:function(e,t){e.exports.parse=function(e){var t=e.split(",").map((function(e){return function(e){if(/^-?\d+$/.test(e))return parseInt(e,10);var t;if(t=e.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){var n=t[1],u=t[2],r=t[3];if(n&&r){var a=[],d=(n=parseInt(n))<(r=parseInt(r))?1:-1;"-"!=u&&".."!=u&&"\u2025"!=u||(r+=d);for(var o=n;o!=r;o+=d)a.push(o);return a}}return[]}(e)}));return 0===t.length?[]:1===t.length?Array.isArray(t[0])?t[0]:t:t.reduce((function(e,t){return Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]),e.concat(t)}))}},573:function(e,t){!function(e){function t(e){return RegExp("(^(?:"+e+"):[ \t]*(?![ \t]))[^]+","i")}e.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:e.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:t(/Content-Security-Policy/.source),lookbehind:!0,alias:["csp","languages-csp"],inside:e.languages.csp},{pattern:t(/Public-Key-Pins(?:-Report-Only)?/.source),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:e.languages.hpkp},{pattern:t(/Strict-Transport-Security/.source),lookbehind:!0,alias:["hsts","languages-hsts"],inside:e.languages.hsts},{pattern:t(/[^:]+/.source),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var n,u=e.languages,r={"application/javascript":u.javascript,"application/json":u.json||u.javascript,"application/xml":u.xml,"text/xml":u.xml,"text/html":u.html,"text/css":u.css,"text/plain":u.plain},a={"application/json":!0,"application/xml":!0};function d(e){var t=e.replace(/^[a-z]+\//,"");return"(?:"+e+"|"+("\\w+/(?:[\\w.-]+\\+)+"+t+"(?![+\\w.-])")+")"}for(var o in r)if(r[o]){n=n||{};var i=a[o]?d(o):o;n[o.replace(/\//g,"-")]={pattern:RegExp("("+/content-type:\s*/.source+i+/(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source+")"+/[^ \t\w-][\s\S]*/.source,"i"),lookbehind:!0,inside:r[o]}}n&&e.languages.insertBefore("http","header",n)}(Prism)},574:function(e,t){Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}},575:function(e,t){!function(e){var t=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};t.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:t},boolean:t.boolean,variable:t.variable}}(Prism)},576:function(e,t){!function(e){var t=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:t}},builtin:t,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism)},577:function(e,t){!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},578:function(e,t){!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},579:function(e,t){!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,u={pattern:RegExp(n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[u,{pattern:RegExp(n+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:u.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":u,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},580:function(e,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},581:function(e,t){!function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],u=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,r=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,a=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:u,operator:r,punctuation:a};var d={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:d}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:d}}];e.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:u,operator:r,punctuation:a}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){if(/<\?/.test(t.code)){e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(Prism)},582:function(e,t){!function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,u="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",r=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function d(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return u})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return u}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return u})).replace(/<>/g,(function(){return"(?:"+r+"|"+a+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:d(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:d(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:d(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:d(a),lookbehind:!0,greedy:!0},number:{pattern:d(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism)},583:function(e,t){e.exports={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]}},584:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.canUseDOM=void 0;var u,r=n(605);var a=((u=r)&&u.__esModule?u:{default:u}).default,d=a.canUseDOM?window.HTMLElement:{};t.canUseDOM=a.canUseDOM;t.default=d},585:function(e,t,n){"use strict";var u=n(28),r=n(57);e.exports=function(e,t,n){t in e?u.f(e,t,r(0,n)):e[t]=n}},586:function(e,t,n){"use strict";var u=n(28).f,r=n(89),a=n(82),d=n(30),o=n(80),i=n(81),c=n(61),l=n(88),f=n(94),s=n(10),p=n(531).fastKey,m=n(532),h=s?"_s":"size",b=function(e,t){var n,u=p(t);if("F"!==u)return e._i[u];for(n=e._f;n;n=n.n)if(n.k==t)return n};e.exports={getConstructor:function(e,t,n,c){var l=e((function(e,u){o(e,l,t,"_i"),e._t=t,e._i=r(null),e._f=void 0,e._l=void 0,e[h]=0,null!=u&&i(u,n,e[c],e)}));return a(l.prototype,{clear:function(){for(var e=m(this,t),n=e._i,u=e._f;u;u=u.n)u.r=!0,u.p&&(u.p=u.p.n=void 0),delete n[u.i];e._f=e._l=void 0,e[h]=0},delete:function(e){var n=m(this,t),u=b(n,e);if(u){var r=u.n,a=u.p;delete n._i[u.i],u.r=!0,a&&(a.n=r),r&&(r.p=a),n._f==u&&(n._f=r),n._l==u&&(n._l=a),n[h]--}return!!u},forEach:function(e){m(this,t);for(var n,u=d(e,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(u(n.v,n.k,this);n&&n.r;)n=n.p},has:function(e){return!!b(m(this,t),e)}}),s&&u(l.prototype,"size",{get:function(){return m(this,t)[h]}}),l},def:function(e,t,n){var u,r,a=b(e,t);return a?a.v=n:(e._l=a={i:r=p(t,!0),k:t,v:n,p:u=e._l,n:void 0,r:!1},e._f||(e._f=a),u&&(u.n=a),e[h]++,"F"!==r&&(e._i[r]=a)),e},getEntry:b,setStrong:function(e,t,n){c(e,t,(function(e,n){this._t=m(e,t),this._k=n,this._l=void 0}),(function(){for(var e=this._k,t=this._l;t&&t.r;)t=t.p;return this._t&&(this._l=t=t?t.n:this._t._f)?l(0,"keys"==e?t.k:"values"==e?t.v:[t.k,t.v]):(this._t=void 0,l(1))}),n?"entries":"values",!n,!0),f(t)}}},587:function(e,t,n){"use strict";var u=n(5),r=n(12),a=n(16),d=n(82),o=n(531),i=n(81),c=n(80),l=n(13),f=n(14),s=n(83),p=n(41),m=n(588);e.exports=function(e,t,n,h,b,v){var g=u[e],y=g,_=b?"set":"add",E=y&&y.prototype,w={},D=function(e){var t=E[e];a(E,e,"delete"==e||"has"==e?function(e){return!(v&&!l(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return v&&!l(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if("function"==typeof y&&(v||E.forEach&&!f((function(){(new y).entries().next()})))){var k=new y,x=k[_](v?{}:-0,1)!=k,S=f((function(){k.has(1)})),C=s((function(e){new y(e)})),O=!v&&f((function(){for(var e=new y,t=5;t--;)e[_](t,t);return!e.has(-0)}));C||((y=t((function(t,n){c(t,y,e);var u=m(new g,t,y);return null!=n&&i(n,b,u[_],u),u}))).prototype=E,E.constructor=y),(S||O)&&(D("delete"),D("has"),b&&D("get")),(O||x)&&D(_),v&&E.clear&&delete E.clear}else y=h.getConstructor(t,e,b,_),d(y.prototype,n),o.NEED=!0;return p(y,e),w[e]=y,r(r.G+r.W+r.F*(y!=g),w),v||h.setStrong(y,e,b),y}},588:function(e,t,n){var u=n(13),r=n(589).set;e.exports=function(e,t,n){var a,d=t.constructor;return d!==n&&"function"==typeof d&&(a=d.prototype)!==n.prototype&&u(a)&&r&&r(e,a),e}},589:function(e,t,n){var u=n(13),r=n(8),a=function(e,t){if(r(e),!u(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,u){try{(u=n(30)(Function.call,n(590).f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(r){t=!0}return function(e,n){return a(e,n),t?e.__proto__=n:u(e,n),e}}({},!1):void 0),check:a}},590:function(e,t,n){var u=n(62),r=n(57),a=n(33),d=n(87),o=n(31),i=n(86),c=Object.getOwnPropertyDescriptor;t.f=n(10)?c:function(e,t){if(e=a(e),t=d(t,!0),i)try{return c(e,t)}catch(n){}if(o(e,t))return r(!u.f.call(e,t),e[t])}},591:function(e,t,n){"use strict";var u=n(12),r=n(32),a=n(27),d=n(14),o=[].sort,i=[1,2,3];u(u.P+u.F*(d((function(){i.sort(void 0)}))||!d((function(){i.sort(null)}))||!n(592)(o)),"Array",{sort:function(e){return void 0===e?o.call(a(this)):o.call(a(this),r(e))}})},592:function(e,t,n){"use strict";var u=n(14);e.exports=function(e,t){return!!e&&u((function(){t?e.call(null,(function(){}),1):e.call(null)}))}},601:function(e,t,n){"use strict";n(529),n(79),n(530),n(591),n(29),n(22),n(21),n(85),n(480);var u=n(1),r=(n(488),n(489),n(77),n(468),n(0)),a=n.n(r),d=n(521),o=n.n(d);n(150);var i=function(e){var t=e.humanize,n=e.icon,u=e.values,r=e.currentState,d=e.setState;if(0==u.size)return null;var i=Array.from(u);return a.a.createElement(a.a.Fragment,null,i.map((function(e,u){var i="string"==typeof e&&t?o()(e):e;return a.a.createElement("label",{key:u},a.a.createElement("input",{type:"checkbox",onChange:function(t){var n=new Set(r);t.currentTarget.checked?n.add(e):n.delete(e),d(n)},checked:r.has(e)}),i&&a.a.createElement(a.a.Fragment,null,n?a.a.createElement("i",{className:"feather icon-"+n}):""," ",i))})))},c=n(543),l=n(473),f=n(470),s=(n(484),n(491)),p=n.n(s),m=n(463),h=n.n(m),b=n(544),v=n.n(b),g=n(476);n(151);function y(e){var t=e.delivery_guarantee,n=e.description,u=e.event_types,r=e.function_category,d=(e.logo_path,e.name),o=e.pathTemplate,i=e.status,c=e.title,l=e.type,s=o;s||("source"==l&&(s="/docs/reference/sources//"),"transform"==l&&(s="/docs/reference/transforms//"),"sink"==l&&(s="/docs/reference/sinks//"));var p=s.replace("",d);return a.a.createElement(f.a,{to:p,className:"qovery-component",title:n},a.a.createElement("div",{className:"qovery-component--header"},a.a.createElement("div",{className:"qovery-component--name"},c)),a.a.createElement("div",{className:"qovery-component--badges"},"beta"==i?a.a.createElement("span",{className:"badge badge--warning",title:"This component is in beta and is not recommended for production environments"},a.a.createElement("i",{className:"feather icon-alert-triangle"})):a.a.createElement("span",{className:"badge badge--primary",title:"This component has passed reliability standards that make it production ready"},a.a.createElement("i",{className:"feather icon-award"})),"best_effort"==t?a.a.createElement("span",{className:"badge badge--warning",title:"This component makes a best-effort delivery guarantee, and in rare cases can lose data"},a.a.createElement("i",{className:"feather icon-shield-off"})):a.a.createElement("span",{className:"badge badge--primary",title:"This component offers an at-least-once delivery guarantee"},a.a.createElement("i",{className:"feather icon-shield"})),u.includes("log")?a.a.createElement("span",{className:"badge badge--primary",title:"This component works with log event types"},"log"):"",u.includes("metric")?a.a.createElement("span",{className:"badge badge--primary",title:"This component works with metric event types"},"metric"):"",a.a.createElement("span",{className:"badge badge--primary"},r)))}function _(e){var t=e.components,n=e.headingLevel,r=e.pathTemplate,d=e.titles,o=t.filter((function(e){return"source"==e.type})),i=t.filter((function(e){return"transform"==e.type})),f=t.filter((function(e){return"sink"==e.type})),s="h"+(n||3);return t.length>0?a.a.createElement(a.a.Fragment,null,o.length>0?a.a.createElement(a.a.Fragment,null,d&&a.a.createElement(s,null,o.length," Sources"),a.a.createElement("div",{className:"qovery-components--grid"},o.map((function(e,t){return a.a.createElement(y,Object(u.a)({key:t,pathTemplate:r},e))})))):"",i.length>0?a.a.createElement(a.a.Fragment,null,d&&a.a.createElement(s,null,i.length," Transforms"),a.a.createElement("div",{className:"qovery-components--grid"},i.map((function(e,t){return a.a.createElement(y,Object(u.a)({key:t,pathTemplate:r},e))})))):"",f.length>0?a.a.createElement(a.a.Fragment,null,d&&a.a.createElement(s,null,f.length," Sinks"),a.a.createElement("div",{className:"qovery-components--grid"},f.map((function(e,t){return a.a.createElement(y,Object(u.a)({key:t,pathTemplate:r},e))})))):"",a.a.createElement("hr",null),a.a.createElement(l.a,{to:"https://github.com/qovery/documentation/issues/new?labels=type%3A+new+feature",target:"_blank",rightIcon:"plus-circle"},"Request a new component")):a.a.createElement(c.a,{text:"no components found"})}t.a=function(e){var t=Object(g.a)().siteConfig.customFields.metadata,n=t.sources,u=t.transforms,d=t.sinks,o=e.titles||null==e.titles,c=1==e.filterColumn,l=e.pathTemplate,s=e.location?v.a.parse(e.location.search,{ignoreQueryPrefix:!0}):{},m=[];(e.sources||null==e.sources)&&(m=m.concat(Object.values(n))),(e.transforms||null==e.transforms)&&(m=m.concat(Object.values(u))),(e.sinks||null==e.sinks)&&(m=m.concat(Object.values(d))),m=m.sort((function(e,t){return e.name>t.name?1:-1}));var b=Object(r.useState)("true"==s["at-least-once"]),y=b[0],E=b[1],w=Object(r.useState)(new Set(s["event-types"]||e.eventTypes)),D=w[0],k=w[1],x=Object(r.useState)(new Set(s.functions)),S=x[0],C=x[1],O=Object(r.useState)(new Set(s["operating-systems"])),I=O[0],A=O[1],j=Object(r.useState)("true"==s["prod-ready"]),N=j[0],F=j[1],T=Object(r.useState)(new Set(s.providers)),P=T[0],M=T[1],R=Object(r.useState)(s.search),L=R[0],B=R[1];L&&(m=m.filter((function(e){return(e.name.toLowerCase()+" "+e.type.toLowerCase()).includes(L.toLowerCase())}))),y&&(m=m.filter((function(e){return"at_least_once"==e.delivery_guarantee}))),D.size>0&&(m=m.filter((function(e){return Array.from(D).some((function(t){return e.event_types.includes(t)}))}))),S.size>0&&(m=m.filter((function(e){return S.has(e.function_category)}))),I.size>0&&(m=m.filter((function(e){return Array.from(I).every((function(t){return e.operating_systems.includes(t)}))}))),N&&(m=m.filter((function(e){return"prod-ready"==e.status}))),P.size>0&&(m=m.filter((function(e){return Array.from(P).every((function(t){return e.service_providers&&e.service_providers.includes(t)}))}))),e.exceptNames&&e.exceptNames.length>0&&(m=m.filter((function(t){return!e.exceptNames.includes(t.name)}))),e.exceptFunctions&&e.exceptFunctions.length>0&&(m=m.filter((function(t){return!e.exceptFunctions.includes(t.function_category)})));var z=D.size>0?D:new Set(p()(m).map((function(e){return e.event_types})).flatten().uniq().compact().sort().value()),U=new Set(p()(m).map((function(e){return e.operating_systems})).flatten().uniq().compact().sort().value()),W=new Set(p()(m).map((function(e){return e.service_providers})).flatten().uniq().compact().sort().value()),H=new Set(p()(m).filter((function(e){return"source"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),$=new Set(p()(m).filter((function(e){return"transform"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),q=new Set(p()(m).filter((function(e){return"sink"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value());return a.a.createElement("div",{className:h()("qovery-components",{"qovery-components--cols":c})},a.a.createElement("div",{className:"filters"},a.a.createElement("div",{className:"search"},a.a.createElement("input",{className:"input--text input--lg",type:"text",onChange:function(e){return B(e.currentTarget.value)},placeholder:"\ud83d\udd0d Search..."})),a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},a.a.createElement(f.a,{to:"/docs/getting-started/data-model/",title:"Learn more about Qovery's event types"},"Event types ",a.a.createElement("i",{className:"feather icon-info"}))),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Event Types",icon:"database",values:z,humanize:!0,currentState:D,setState:k}))),a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},a.a.createElement(f.a,{to:"/docs/getting-started/whats-next/",title:"Learn more about Qovery's guarantees"},"Guarantees ",a.a.createElement("i",{className:"feather icon-info"}))),a.a.createElement("div",{className:"filter--choices"},a.a.createElement("label",{title:"Show only components that offer an at-least-once delivery guarantee."},a.a.createElement("input",{type:"checkbox",onChange:function(e){return E(e.currentTarget.checked)},checked:y}),a.a.createElement("i",{className:"feather icon-shield"})," At-least-once"),a.a.createElement("label",{title:"Show only production ready components."},a.a.createElement("input",{type:"checkbox",onChange:function(e){return F(e.currentTarget.checked)},checked:N}),a.a.createElement("i",{className:"feather icon-award"})," Prod-ready"))),H.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Source Functions"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Functions",icon:"settings",values:H,humanize:!0,currentState:S,setState:C}))),$.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Transform Functions"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Functions",icon:"settings",values:$,humanize:!0,currentState:S,setState:C}))),q.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Sink Functions"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Functions",icon:"settings",values:q,humanize:!0,currentState:S,setState:C}))),W.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Providers"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Providers",icon:"cloud",values:W,currentState:P,setState:M}))),U.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},a.a.createElement(f.a,{to:"/docs/setup/installation/operating-systems/",title:"Learn more about Qovery's operating systems"},"Operating Systems")),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Operating Systems",icon:"cpu",values:U,currentState:I,setState:A})))),a.a.createElement("div",{className:"qovery-components--results"},a.a.createElement(_,{components:m,headingLevel:e.headingLevel,pathTemplate:l,titles:o})))}},603:function(e,t,n){"use strict";n.d(t,"b",(function(){return d}));var u=n(53),r={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","at-rule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},a=n(0),d={Prism:u.a,theme:r};function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return(i=Object.assign||function(e){for(var t=1;t0&&e[n-1]===t?e:e.concat(t)},s=function(e,t){var n=e.plain,u=Object.create(null),r=e.styles.reduce((function(e,n){var u=n.languages,r=n.style;return u&&!u.includes(t)||n.types.forEach((function(t){var n=i({},e[t],r);e[t]=n})),e}),u);return r.root=n,r.plain=i({},n,{backgroundColor:null}),r};function p(e,t){var n={};for(var u in e)Object.prototype.hasOwnProperty.call(e,u)&&-1===t.indexOf(u)&&(n[u]=e[u]);return n}var m=function(e){function t(){for(var t=this,n=[],u=arguments.length;u--;)n[u]=arguments[u];e.apply(this,n),o(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?s(e.theme,e.language):void 0;return t.themeDict=n})),o(this,"getLineProps",(function(e){var n=e.key,u=e.className,r=e.style,a=i({},p(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),d=t.getThemeDict(t.props);return void 0!==d&&(a.style=d.plain),void 0!==r&&(a.style=void 0!==a.style?i({},a.style,r):r),void 0!==n&&(a.key=n),u&&(a.className+=" "+u),a})),o(this,"getStyleForToken",(function(e){var n=e.types,u=e.empty,r=n.length,a=t.getThemeDict(t.props);if(void 0!==a){if(1===r&&"plain"===n[0])return u?{display:"inline-block"}:void 0;if(1===r&&!u)return a[n[0]];var d=u?{display:"inline-block"}:{},o=n.map((function(e){return a[e]}));return Object.assign.apply(Object,[d].concat(o))}})),o(this,"getTokenProps",(function(e){var n=e.key,u=e.className,r=e.style,a=e.token,d=i({},p(e,["key","className","style","token"]),{className:"token "+a.types.join(" "),children:a.content,style:t.getStyleForToken(a),key:void 0});return void 0!==r&&(d.style=void 0!==d.style?i({},d.style,r):r),void 0!==n&&(d.key=n),u&&(d.className+=" "+u),d}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,u=e.code,r=e.children,a=this.getThemeDict(this.props),d=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],u=[0],r=[e.length],a=0,d=0,o=[],i=[o];d>-1;){for(;(a=u[d]++)0?p:["plain"],s=m):(p=f(p,m.type),m.alias&&(p=f(p,m.alias)),s=m.content),"string"==typeof s){var h=s.split(c),b=h.length;o.push({types:p,content:h[0]});for(var v=1;v=0)&&a(e,!n)}e.exports=t.default},608:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.assertNodeList=i,t.setElement=function(e){var t=e;if("string"==typeof t&&d.canUseDOM){var n=document.querySelectorAll(t);i(n,t),t="length"in n?n[0]:n}return o=t||o},t.validateElement=c,t.hide=function(e){c(e)&&(e||o).setAttribute("aria-hidden","true")},t.show=function(e){c(e)&&(e||o).removeAttribute("aria-hidden")},t.documentNotReadyOrSSRTesting=function(){o=null},t.resetForTesting=function(){o=null};var u,r=n(633),a=(u=r)&&u.__esModule?u:{default:u},d=n(584);var o=null;function i(e,t){if(!e||!e.length)throw new Error("react-modal: No elements were found for selector "+t+".")}function c(e){return!(!e&&!o)||((0,a.default)(!1,["react-modal: App element is not defined.","Please use `Modal.setAppElement(el)` or set `appElement={el}`.","This is needed so screen readers don't see main content","when modal is opened. It is not recommended, but you can opt-out","by setting `ariaHideApp={false}`."].join(" ")),!1)}},609:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=new function e(){var t=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.register=function(e){-1===t.openInstances.indexOf(e)&&(t.openInstances.push(e),t.emit("register"))},this.deregister=function(e){var n=t.openInstances.indexOf(e);-1!==n&&(t.openInstances.splice(n,1),t.emit("deregister"))},this.subscribe=function(e){t.subscribers.push(e)},this.emit=function(e){t.subscribers.forEach((function(n){return n(e,t.openInstances.slice())}))},this.openInstances=[],this.subscribers=[]};t.default=u,e.exports=t.default},628:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u,r=n(629),a=(u=r)&&u.__esModule?u:{default:u};t.default=a.default,e.exports=t.default},629:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.bodyOpenClassName=t.portalClassName=void 0;var u=Object.assign||function(e){for(var t=1;t0&&0===(g-=1)&&f.show(t),n.props.shouldFocusAfterRender&&(n.props.shouldReturnFocusAfterClose?(c.returnFocus(),c.teardownScopedFocus()):c.popWithoutFocus()),n.props.onAfterClose&&n.props.onAfterClose(),m.default.deregister(n)},n.open=function(){n.beforeOpen(),n.state.afterOpen&&n.state.beforeClose?(clearTimeout(n.closeTimer),n.setState({beforeClose:!1})):(n.props.shouldFocusAfterRender&&(c.setupScopedFocus(n.node),c.markForFocusLater()),n.setState({isOpen:!0},(function(){n.setState({afterOpen:!0}),n.props.isOpen&&n.props.onAfterOpen&&n.props.onAfterOpen({overlayEl:n.overlay,contentEl:n.content})})))},n.close=function(){n.props.closeTimeoutMS>0?n.closeWithTimeout():n.closeWithoutTimeout()},n.focusContent=function(){return n.content&&!n.contentHasFocus()&&n.content.focus()},n.closeWithTimeout=function(){var e=Date.now()+n.props.closeTimeoutMS;n.setState({beforeClose:!0,closesAt:e},(function(){n.closeTimer=setTimeout(n.closeWithoutTimeout,n.state.closesAt-Date.now())}))},n.closeWithoutTimeout=function(){n.setState({beforeClose:!1,isOpen:!1,afterOpen:!1,closesAt:null},n.afterClose)},n.handleKeyDown=function(e){9===e.keyCode&&(0,l.default)(n.content,e),n.props.shouldCloseOnEsc&&27===e.keyCode&&(e.stopPropagation(),n.requestClose(e))},n.handleOverlayOnClick=function(e){null===n.shouldClose&&(n.shouldClose=!0),n.shouldClose&&n.props.shouldCloseOnOverlayClick&&(n.ownerHandlesClose()?n.requestClose(e):n.focusContent()),n.shouldClose=null},n.handleContentOnMouseUp=function(){n.shouldClose=!1},n.handleOverlayOnMouseDown=function(e){n.props.shouldCloseOnOverlayClick||e.target!=n.overlay||e.preventDefault()},n.handleContentOnClick=function(){n.shouldClose=!1},n.handleContentOnMouseDown=function(){n.shouldClose=!1},n.requestClose=function(e){return n.ownerHandlesClose()&&n.props.onRequestClose(e)},n.ownerHandlesClose=function(){return n.props.onRequestClose},n.shouldBeClosed=function(){return!n.state.isOpen&&!n.state.beforeClose},n.contentHasFocus=function(){return document.activeElement===n.content||n.content.contains(document.activeElement)},n.buildClassName=function(e,t){var u="object"===(void 0===t?"undefined":r(t))?t:{base:v[e],afterOpen:v[e]+"--after-open",beforeClose:v[e]+"--before-close"},a=u.base;return n.state.afterOpen&&(a=a+" "+u.afterOpen),n.state.beforeClose&&(a=a+" "+u.beforeClose),"string"==typeof t&&t?a+" "+t:a},n.attributesFromObject=function(e,t){return Object.keys(t).reduce((function(n,u){return n[e+"-"+u]=t[u],n}),{})},n.state={afterOpen:!1,beforeClose:!1},n.shouldClose=null,n.moveFromContentToOverlay=null,n}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),a(t,[{key:"componentDidMount",value:function(){this.props.isOpen&&this.open()}},{key:"componentDidUpdate",value:function(e,t){this.props.isOpen&&!e.isOpen?this.open():!this.props.isOpen&&e.isOpen&&this.close(),this.props.shouldFocusAfterRender&&this.state.isOpen&&!t.isOpen&&this.focusContent()}},{key:"componentWillUnmount",value:function(){this.state.isOpen&&this.afterClose(),clearTimeout(this.closeTimer)}},{key:"beforeOpen",value:function(){var e=this.props,t=e.appElement,n=e.ariaHideApp,u=e.htmlOpenClassName,r=e.bodyOpenClassName;r&&s.add(document.body,r),u&&s.add(document.getElementsByTagName("html")[0],u),n&&(g+=1,f.hide(t)),m.default.register(this)}},{key:"render",value:function(){var e=this.props,t=e.id,n=e.className,r=e.overlayClassName,a=e.defaultStyles,d=n?{}:a.content,i=r?{}:a.overlay;return this.shouldBeClosed()?null:o.default.createElement("div",{ref:this.setOverlayRef,className:this.buildClassName("overlay",r),style:u({},i,this.props.style.overlay),onClick:this.handleOverlayOnClick,onMouseDown:this.handleOverlayOnMouseDown},o.default.createElement("div",u({id:t,ref:this.setContentRef,style:u({},d,this.props.style.content),className:this.buildClassName("content",n),tabIndex:"-1",onKeyDown:this.handleKeyDown,onMouseDown:this.handleContentOnMouseDown,onMouseUp:this.handleContentOnMouseUp,onClick:this.handleContentOnClick,role:this.props.role,"aria-label":this.props.contentLabel},this.attributesFromObject("aria",this.props.aria||{}),this.attributesFromObject("data",this.props.data||{}),{"data-testid":this.props.testId}),this.props.children))}}]),t}(d.Component);y.defaultProps={style:{overlay:{},content:{}},defaultStyles:{}},y.propTypes={isOpen:i.default.bool.isRequired,defaultStyles:i.default.shape({content:i.default.object,overlay:i.default.object}),style:i.default.shape({content:i.default.object,overlay:i.default.object}),className:i.default.oneOfType([i.default.string,i.default.object]),overlayClassName:i.default.oneOfType([i.default.string,i.default.object]),bodyOpenClassName:i.default.string,htmlOpenClassName:i.default.string,ariaHideApp:i.default.bool,appElement:i.default.instanceOf(p.default),onAfterOpen:i.default.func,onAfterClose:i.default.func,onRequestClose:i.default.func,closeTimeoutMS:i.default.number,shouldFocusAfterRender:i.default.bool,shouldCloseOnOverlayClick:i.default.bool,shouldReturnFocusAfterClose:i.default.bool,role:i.default.string,contentLabel:i.default.string,aria:i.default.object,data:i.default.object,children:i.default.node,shouldCloseOnEsc:i.default.bool,overlayRef:i.default.func,contentRef:i.default.func,id:i.default.string,testId:i.default.string},t.default=y,e.exports=t.default},631:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.handleBlur=c,t.handleFocus=l,t.markForFocusLater=function(){d.push(document.activeElement)},t.returnFocus=function(){var e=null;try{return void(0!==d.length&&(e=d.pop()).focus())}catch(t){console.warn(["You tried to return focus to",e,"but it is not in the DOM anymore"].join(" "))}},t.popWithoutFocus=function(){d.length>0&&d.pop()},t.setupScopedFocus=function(e){o=e,window.addEventListener?(window.addEventListener("blur",c,!1),document.addEventListener("focus",l,!0)):(window.attachEvent("onBlur",c),document.attachEvent("onFocus",l))},t.teardownScopedFocus=function(){o=null,window.addEventListener?(window.removeEventListener("blur",c),document.removeEventListener("focus",l)):(window.detachEvent("onBlur",c),document.detachEvent("onFocus",l))};var u,r=n(607),a=(u=r)&&u.__esModule?u:{default:u};var d=[],o=null,i=!1;function c(){i=!0}function l(){if(i){if(i=!1,!o)return;setTimeout((function(){o.contains(document.activeElement)||((0,a.default)(o)[0]||o).focus()}),0)}}},632:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n=(0,a.default)(e);if(!n.length)return void t.preventDefault();var u=void 0,r=t.shiftKey,d=n[0],o=n[n.length-1];if(e===document.activeElement){if(!r)return;u=o}o!==document.activeElement||r||(u=d);d===document.activeElement&&r&&(u=o);if(u)return t.preventDefault(),void u.focus();var i=/(\bChrome\b|\bSafari\b)\//.exec(navigator.userAgent);if(null==i||"Chrome"==i[1]||null!=/\biPod\b|\biPad\b/g.exec(navigator.userAgent))return;var c=n.indexOf(document.activeElement);c>-1&&(c+=r?-1:1);if(void 0===(u=n[c]))return t.preventDefault(),void(u=r?o:d).focus();t.preventDefault(),u.focus()};var u,r=n(607),a=(u=r)&&u.__esModule?u:{default:u};e.exports=t.default},633:function(e,t,n){"use strict";var u=function(){};e.exports=u},634:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.dumpClassLists=function(){0};var u={},r={};t.add=function(e,t){return n=e.classList,a="html"==e.nodeName.toLowerCase()?u:r,void t.split(" ").forEach((function(e){!function(e,t){e[t]||(e[t]=0),e[t]+=1}(a,e),n.add(e)}));var n,a},t.remove=function(e,t){return n=e.classList,a="html"==e.nodeName.toLowerCase()?u:r,void t.split(" ").forEach((function(e){!function(e,t){e[t]&&(e[t]-=1)}(a,e),0===a[e]&&n.remove(e)}));var n,a}},635:function(e,t,n){"use strict";var u,r=n(609),a=(u=r)&&u.__esModule?u:{default:u};var d=void 0,o=void 0,i=[];function c(){0!==i.length&&i[i.length-1].focusContent()}a.default.subscribe((function(e,t){d&&o||((d=document.createElement("div")).setAttribute("data-react-modal-body-trap",""),d.style.position="absolute",d.style.opacity="0",d.setAttribute("tabindex","0"),d.addEventListener("focus",c),(o=d.cloneNode()).addEventListener("focus",c)),(i=t).length>0?(document.body.firstChild!==d&&document.body.insertBefore(d,document.body.firstChild),document.body.lastChild!==o&&document.body.appendChild(o)):(d.parentElement&&d.parentElement.removeChild(d),o.parentElement&&o.parentElement.removeChild(o))}))},636:function(e,t,n){"use strict";function u(){var e=this.constructor.getDerivedStateFromProps(this.props,this.state);null!=e&&this.setState(e)}function r(e){this.setState(function(t){var n=this.constructor.getDerivedStateFromProps(e,t);return null!=n?n:null}.bind(this))}function a(e,t){try{var n=this.props,u=this.state;this.props=e,this.state=t,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(n,u)}finally{this.props=n,this.state=u}}function d(e){var t=e.prototype;if(!t||!t.isReactComponent)throw new Error("Can only polyfill class components");if("function"!=typeof e.getDerivedStateFromProps&&"function"!=typeof t.getSnapshotBeforeUpdate)return e;var n=null,d=null,o=null;if("function"==typeof t.componentWillMount?n="componentWillMount":"function"==typeof t.UNSAFE_componentWillMount&&(n="UNSAFE_componentWillMount"),"function"==typeof t.componentWillReceiveProps?d="componentWillReceiveProps":"function"==typeof t.UNSAFE_componentWillReceiveProps&&(d="UNSAFE_componentWillReceiveProps"),"function"==typeof t.componentWillUpdate?o="componentWillUpdate":"function"==typeof t.UNSAFE_componentWillUpdate&&(o="UNSAFE_componentWillUpdate"),null!==n||null!==d||null!==o){var i=e.displayName||e.name,c="function"==typeof e.getDerivedStateFromProps?"getDerivedStateFromProps()":"getSnapshotBeforeUpdate()";throw Error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n"+i+" uses "+c+" but also contains the following legacy lifecycles:"+(null!==n?"\n "+n:"")+(null!==d?"\n "+d:"")+(null!==o?"\n "+o:"")+"\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://fb.me/react-async-component-lifecycle-hooks")}if("function"==typeof e.getDerivedStateFromProps&&(t.componentWillMount=u,t.componentWillReceiveProps=r),"function"==typeof t.getSnapshotBeforeUpdate){if("function"!=typeof t.componentDidUpdate)throw new Error("Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype");t.componentWillUpdate=a;var l=t.componentDidUpdate;t.componentDidUpdate=function(e,t,n){var u=this.__reactInternalSnapshotFlag?this.__reactInternalSnapshot:n;l.call(this,e,t,u)}}return e}n.r(t),n.d(t,"polyfill",(function(){return d})),u.__suppressDeprecationWarning=!0,r.__suppressDeprecationWarning=!0,a.__suppressDeprecationWarning=!0},637:function(e,t,n){var u;!function(r){"use strict";var a,d,o,i=(a=/d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZWN]|"[^"]*"|'[^']*'/g,d=/\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,o=/[^-+\dA-Z]/g,function(e,t,n,u){if(1!==arguments.length||"string"!==s(e)||/\d/.test(e)||(t=e,e=void 0),(e=e||new Date)instanceof Date||(e=new Date(e)),isNaN(e))throw TypeError("Invalid date");var r=(t=String(i.masks[t]||t||i.masks.default)).slice(0,4);"UTC:"!==r&&"GMT:"!==r||(t=t.slice(4),n=!0,"GMT:"===r&&(u=!0));var p=n?"getUTC":"get",m=e[p+"Date"](),h=e[p+"Day"](),b=e[p+"Month"](),v=e[p+"FullYear"](),g=e[p+"Hours"](),y=e[p+"Minutes"](),_=e[p+"Seconds"](),E=e[p+"Milliseconds"](),w=n?0:e.getTimezoneOffset(),D=l(e),k=f(e),x={d:m,dd:c(m),ddd:i.i18n.dayNames[h],dddd:i.i18n.dayNames[h+7],m:b+1,mm:c(b+1),mmm:i.i18n.monthNames[b],mmmm:i.i18n.monthNames[b+12],yy:String(v).slice(2),yyyy:v,h:g%12||12,hh:c(g%12||12),H:g,HH:c(g),M:y,MM:c(y),s:_,ss:c(_),l:c(E,3),L:c(Math.round(E/10)),t:g<12?i.i18n.timeNames[0]:i.i18n.timeNames[1],tt:g<12?i.i18n.timeNames[2]:i.i18n.timeNames[3],T:g<12?i.i18n.timeNames[4]:i.i18n.timeNames[5],TT:g<12?i.i18n.timeNames[6]:i.i18n.timeNames[7],Z:u?"GMT":n?"UTC":(String(e).match(d)||[""]).pop().replace(o,""),o:(w>0?"-":"+")+c(100*Math.floor(Math.abs(w)/60)+Math.abs(w)%60,4),S:["th","st","nd","rd"][m%10>3?0:(m%100-m%10!=10)*m%10],W:D,N:k};return t.replace(a,(function(e){return e in x?x[e]:e.slice(1,e.length-1)}))});function c(e,t){for(e=String(e),t=t||2;e.length0)&&(e.unobserve(n),e.disconnect(),r())}))}))).observe(n))},to:f})):i.a.createElement("a",Object(r.a)({},t,{href:f}))}},474:function(t,e,n){"use strict";function r(t){return!1===/^(https?:|\/\/)/.test(t)}n.d(e,"a",(function(){return r}))},476:function(t,e,n){"use strict";var r=n(0),o=n(69);e.a=function(){return Object(r.useContext)(o.a)}},480:function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));n(513);var r=n(476);function o(t){var e=(Object(r.a)().siteConfig||{}).baseUrl,n=void 0===e?"/":e;if(!t)return t;return/^(https?:|\/\/)/.test(t)?t:t.startsWith("/")?n+t.slice(1):n+t}},486:function(t,e,n){"use strict";var r=n(0),o=n.n(r),i=n(624);e.a=function(t){return o.a.createElement(i.a,t)}},488:function(t,e,n){"use strict";var r=n(12),o=n(96)(!0);r(r.P,"Array",{includes:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),n(74)("includes")},489:function(t,e,n){"use strict";var r=n(12),o=n(557);r(r.P+r.F*n(558)("includes"),"String",{includes:function(t){return!!~o(this,t,"includes").indexOf(t,arguments.length>1?arguments[1]:void 0)}})},513:function(t,e,n){"use strict";var r=n(12),o=n(26),i=n(557),a="".startsWith;r(r.P+r.F*n(558)("startsWith"),"String",{startsWith:function(t){var e=i(this,t,"startsWith"),n=o(Math.min(arguments.length>1?arguments[1]:void 0,e.length)),r=String(t);return a?a.call(e,r,n):e.slice(n,n+r.length)===r}})},557:function(t,e,n){var r=n(95),o=n(34);t.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return String(o(t))}},558:function(t,e,n){var r=n(2)("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(o){}}return!0}},624:function(t,e,n){"use strict";(function(t){n.d(e,"a",(function(){return yt}));var r,o,i,a,c=n(15),u=n.n(c),s=n(625),f=n.n(s),l=n(626),p=n.n(l),d=n(0),h=n.n(d),y=n(51),m=n.n(y),b="bodyAttributes",v="htmlAttributes",T="titleAttributes",g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title"},w=(Object.keys(g).map((function(t){return g[t]})),"charset"),O="cssText",A="href",C="http-equiv",E="innerHTML",S="itemprop",j="name",P="property",k="rel",x="src",I="target",L={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},M="defaultTitle",R="defer",N="encodeSpecialCharacters",D="onChangeClientState",H="titleTemplate",q=Object.keys(L).reduce((function(t,e){return t[L[e]]=e,t}),{}),F=[g.NOSCRIPT,g.SCRIPT,g.STYLE],_="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},U=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},Y=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n},K=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},z=function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return!1===e?String(t):String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},J=function(t){var e=X(t,g.TITLE),n=X(t,H);if(n&&e)return n.replace(/%s/g,(function(){return Array.isArray(e)?e.join(""):e}));var r=X(t,M);return e||r||void 0},$=function(t){return X(t,D)||function(){}},G=function(t,e){return e.filter((function(e){return void 0!==e[t]})).map((function(e){return e[t]})).reduce((function(t,e){return B({},t,e)}),{})},Q=function(t,e){return e.filter((function(t){return void 0!==t[g.BASE]})).map((function(t){return t[g.BASE]})).reverse().reduce((function(e,n){if(!e.length)for(var r=Object.keys(n),o=0;o=0;n--){var r=t[n];if(r.hasOwnProperty(e))return r[e]}return null},Z=(r=Date.now(),function(t){var e=Date.now();e-r>16?(r=e,t(e)):setTimeout((function(){Z(t)}),0)}),tt=function(t){return clearTimeout(t)},et="undefined"!=typeof window?window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||Z:t.requestAnimationFrame||Z,nt="undefined"!=typeof window?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||tt:t.cancelAnimationFrame||tt,rt=function(t){return console&&"function"==typeof console.warn&&console.warn(t)},ot=null,it=function(t,e){var n=t.baseTag,r=t.bodyAttributes,o=t.htmlAttributes,i=t.linkTags,a=t.metaTags,c=t.noscriptTags,u=t.onChangeClientState,s=t.scriptTags,f=t.styleTags,l=t.title,p=t.titleAttributes;ut(g.BODY,r),ut(g.HTML,o),ct(l,p);var d={baseTag:st(g.BASE,n),linkTags:st(g.LINK,i),metaTags:st(g.META,a),noscriptTags:st(g.NOSCRIPT,c),scriptTags:st(g.SCRIPT,s),styleTags:st(g.STYLE,f)},h={},y={};Object.keys(d).forEach((function(t){var e=d[t],n=e.newTags,r=e.oldTags;n.length&&(h[t]=n),r.length&&(y[t]=d[t].oldTags)})),e&&e(),u(t,h,y)},at=function(t){return Array.isArray(t)?t.join(""):t},ct=function(t,e){void 0!==t&&document.title!==t&&(document.title=at(t)),ut(g.TITLE,e)},ut=function(t,e){var n=document.getElementsByTagName(t)[0];if(n){for(var r=n.getAttribute("data-react-helmet"),o=r?r.split(","):[],i=[].concat(o),a=Object.keys(e),c=0;c=0;l--)n.removeAttribute(i[l]);o.length===i.length?n.removeAttribute("data-react-helmet"):n.getAttribute("data-react-helmet")!==a.join(",")&&n.setAttribute("data-react-helmet",a.join(","))}},st=function(t,e){var n=document.head||document.querySelector(g.HEAD),r=n.querySelectorAll(t+"[data-react-helmet]"),o=Array.prototype.slice.call(r),i=[],a=void 0;return e&&e.length&&e.forEach((function(e){var n=document.createElement(t);for(var r in e)if(e.hasOwnProperty(r))if(r===E)n.innerHTML=e.innerHTML;else if(r===O)n.styleSheet?n.styleSheet.cssText=e.cssText:n.appendChild(document.createTextNode(e.cssText));else{var c=void 0===e[r]?"":e[r];n.setAttribute(r,c)}n.setAttribute("data-react-helmet","true"),o.some((function(t,e){return a=e,n.isEqualNode(t)}))?o.splice(a,1):i.push(n)})),o.forEach((function(t){return t.parentNode.removeChild(t)})),i.forEach((function(t){return n.appendChild(t)})),{oldTags:o,newTags:i}},ft=function(t){return Object.keys(t).reduce((function(e,n){var r=void 0!==t[n]?n+'="'+t[n]+'"':""+n;return e?e+" "+r:r}),"")},lt=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(t).reduce((function(e,n){return e[L[n]||n]=t[n],e}),e)},pt=function(t,e,n){switch(t){case g.TITLE:return{toComponent:function(){return t=e.title,n=e.titleAttributes,(r={key:t})["data-react-helmet"]=!0,o=lt(n,r),[h.a.createElement(g.TITLE,o,t)];var t,n,r,o},toString:function(){return function(t,e,n,r){var o=ft(n),i=at(e);return o?"<"+t+' data-react-helmet="true" '+o+">"+z(i,r)+"":"<"+t+' data-react-helmet="true">'+z(i,r)+""}(t,e.title,e.titleAttributes,n)}};case b:case v:return{toComponent:function(){return lt(e)},toString:function(){return ft(e)}};default:return{toComponent:function(){return function(t,e){return e.map((function(e,n){var r,o=((r={key:n})["data-react-helmet"]=!0,r);return Object.keys(e).forEach((function(t){var n=L[t]||t;if(n===E||n===O){var r=e.innerHTML||e.cssText;o.dangerouslySetInnerHTML={__html:r}}else o[n]=e[t]})),h.a.createElement(t,o)}))}(t,e)},toString:function(){return function(t,e,n){return e.reduce((function(e,r){var o=Object.keys(r).filter((function(t){return!(t===E||t===O)})).reduce((function(t,e){var o=void 0===r[e]?e:e+'="'+z(r[e],n)+'"';return t?t+" "+o:o}),""),i=r.innerHTML||r.cssText||"",a=-1===F.indexOf(t);return e+"<"+t+' data-react-helmet="true" '+o+(a?"/>":">"+i+"")}),"")}(t,e,n)}}}},dt=function(t){var e=t.baseTag,n=t.bodyAttributes,r=t.encode,o=t.htmlAttributes,i=t.linkTags,a=t.metaTags,c=t.noscriptTags,u=t.scriptTags,s=t.styleTags,f=t.title,l=void 0===f?"":f,p=t.titleAttributes;return{base:pt(g.BASE,e,r),bodyAttributes:pt(b,n,r),htmlAttributes:pt(v,o,r),link:pt(g.LINK,i,r),meta:pt(g.META,a,r),noscript:pt(g.NOSCRIPT,c,r),script:pt(g.SCRIPT,u,r),style:pt(g.STYLE,s,r),title:pt(g.TITLE,{title:l,titleAttributes:p},r)}},ht=f()((function(t){return{baseTag:Q([A,I],t),bodyAttributes:G(b,t),defer:X(t,R),encode:X(t,N),htmlAttributes:G(v,t),linkTags:V(g.LINK,[k,A],t),metaTags:V(g.META,[j,w,C,P,S],t),noscriptTags:V(g.NOSCRIPT,[E],t),onChangeClientState:$(t),scriptTags:V(g.SCRIPT,[x,E],t),styleTags:V(g.STYLE,[O],t),title:J(t),titleAttributes:G(T,t)}}),(function(t){ot&&nt(ot),t.defer?ot=et((function(){it(t,(function(){ot=null}))})):(it(t),ot=null)}),dt)((function(){return null})),yt=(o=ht,a=i=function(t){function e(){return U(this,e),K(this,t.apply(this,arguments))}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),e.prototype.shouldComponentUpdate=function(t){return!p()(this.props,t)},e.prototype.mapNestedChildrenToProps=function(t,e){if(!e)return null;switch(t.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:e};case g.STYLE:return{cssText:e}}throw new Error("<"+t.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")},e.prototype.flattenArrayTypeChildren=function(t){var e,n=t.child,r=t.arrayTypeChildren,o=t.newChildProps,i=t.nestedChildren;return B({},r,((e={})[n.type]=[].concat(r[n.type]||[],[B({},o,this.mapNestedChildrenToProps(n,i))]),e))},e.prototype.mapObjectTypeChildren=function(t){var e,n,r=t.child,o=t.newProps,i=t.newChildProps,a=t.nestedChildren;switch(r.type){case g.TITLE:return B({},o,((e={})[r.type]=a,e.titleAttributes=B({},i),e));case g.BODY:return B({},o,{bodyAttributes:B({},i)});case g.HTML:return B({},o,{htmlAttributes:B({},i)})}return B({},o,((n={})[r.type]=B({},i),n))},e.prototype.mapArrayTypeChildrenToProps=function(t,e){var n=B({},e);return Object.keys(t).forEach((function(e){var r;n=B({},n,((r={})[e]=t[e],r))})),n},e.prototype.warnOnInvalidChildren=function(t,e){return!0},e.prototype.mapChildrenToProps=function(t,e){var n=this,r={};return h.a.Children.forEach(t,(function(t){if(t&&t.props){var o=t.props,i=o.children,a=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(t).reduce((function(e,n){return e[q[n]||n]=t[n],e}),e)}(W(o,["children"]));switch(n.warnOnInvalidChildren(t,i),t.type){case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:r=n.flattenArrayTypeChildren({child:t,arrayTypeChildren:r,newChildProps:a,nestedChildren:i});break;default:e=n.mapObjectTypeChildren({child:t,newProps:e,newChildProps:a,nestedChildren:i})}}})),e=this.mapArrayTypeChildrenToProps(r,e)},e.prototype.render=function(){var t=this.props,e=t.children,n=W(t,["children"]),r=B({},n);return e&&(r=this.mapChildrenToProps(e,r)),h.a.createElement(o,r)},Y(e,null,[{key:"canUseDOM",set:function(t){o.canUseDOM=t}}]),e}(h.a.Component),i.propTypes={base:u.a.object,bodyAttributes:u.a.object,children:u.a.oneOfType([u.a.arrayOf(u.a.node),u.a.node]),defaultTitle:u.a.string,defer:u.a.bool,encodeSpecialCharacters:u.a.bool,htmlAttributes:u.a.object,link:u.a.arrayOf(u.a.object),meta:u.a.arrayOf(u.a.object),noscript:u.a.arrayOf(u.a.object),onChangeClientState:u.a.func,script:u.a.arrayOf(u.a.object),style:u.a.arrayOf(u.a.object),title:u.a.string,titleAttributes:u.a.object,titleTemplate:u.a.string},i.defaultProps={defer:!0,encodeSpecialCharacters:!0},i.peek=o.peek,i.rewind=function(){var t=o.rewind();return t||(t=dt({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}})),t},a);yt.renderStatic=yt.rewind}).call(this,n(76))},625:function(t,e,n){"use strict";var r,o=n(0),i=(r=o)&&"object"==typeof r&&"default"in r?r.default:r;function a(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}var c=!("undefined"==typeof window||!window.document||!window.document.createElement);t.exports=function(t,e,n){if("function"!=typeof t)throw new Error("Expected reducePropsToState to be a function.");if("function"!=typeof e)throw new Error("Expected handleStateChangeOnClient to be a function.");if(void 0!==n&&"function"!=typeof n)throw new Error("Expected mapStateOnServer to either be undefined or a function.");return function(r){if("function"!=typeof r)throw new Error("Expected WrappedComponent to be a React component.");var u,s=[];function f(){u=t(s.map((function(t){return t.props}))),l.canUseDOM?e(u):n&&(u=n(u))}var l=function(t){var e,n;function o(){return t.apply(this,arguments)||this}n=t,(e=o).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n,o.peek=function(){return u},o.rewind=function(){if(o.canUseDOM)throw new Error("You may only call rewind() on the server. Call peek() to read the current state.");var t=u;return u=void 0,s=[],t};var a=o.prototype;return a.UNSAFE_componentWillMount=function(){s.push(this),f()},a.componentDidUpdate=function(){f()},a.componentWillUnmount=function(){var t=s.indexOf(this);s.splice(t,1),f()},a.render=function(){return i.createElement(r,this.props)},o}(o.PureComponent);return a(l,"displayName","SideEffect("+function(t){return t.displayName||t.name||"Component"}(r)+")"),a(l,"canUseDOM",c),l}}},626:function(t,e,n){"use strict";var r=Array.isArray,o=Object.keys,i=Object.prototype.hasOwnProperty,a="undefined"!=typeof Element;t.exports=function(t,e){try{return function t(e,n){if(e===n)return!0;if(e&&n&&"object"==typeof e&&"object"==typeof n){var c,u,s,f=r(e),l=r(n);if(f&&l){if((u=e.length)!=n.length)return!1;for(c=u;0!=c--;)if(!t(e[c],n[c]))return!1;return!0}if(f!=l)return!1;var p=e instanceof Date,d=n instanceof Date;if(p!=d)return!1;if(p&&d)return e.getTime()==n.getTime();var h=e instanceof RegExp,y=n instanceof RegExp;if(h!=y)return!1;if(h&&y)return e.toString()==n.toString();var m=o(e);if((u=m.length)!==o(n).length)return!1;for(c=u;0!=c--;)if(!i.call(n,m[c]))return!1;if(a&&e instanceof Element&&n instanceof Element)return e===n;for(c=u;0!=c--;)if(!("_owner"===(s=m[c])&&e.$$typeof||t(e[s],n[s])))return!1;return!0}return e!=e&&n!=n}(t,e)}catch(n){if(n.message&&n.message.match(/stack|recursion/i)||-2146828260===n.number)return console.warn("Warning: react-fast-compare does not handle circular references.",n.name,n.message),!1;throw n}}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{470:function(t,e,n){"use strict";var r=n(1),o=n(0),i=n.n(o),a=n(39),c=n(474),u=n(20),s=n.n(u);e.a=function(t){var e,n=t.to,u=t.href,f=n||u,l=Object(c.a)(f),p=Object(o.useRef)(!1),d=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!d&&l&&window.docusaurus.prefetch(f),function(){d&&e&&e.disconnect()}}),[f,d,l]),f&&l?i.a.createElement(a.b,Object(r.a)({},t,{onMouseEnter:function(){p.current||(window.docusaurus.preload(f),p.current=!0)},innerRef:function(t){var n,r;d&&t&&l&&(n=t,r=function(){window.docusaurus.prefetch(f)},(e=new window.IntersectionObserver((function(t){t.forEach((function(t){n===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(e.unobserve(n),e.disconnect(),r())}))}))).observe(n))},to:f})):i.a.createElement("a",Object(r.a)({},t,{href:f}))}},474:function(t,e,n){"use strict";function r(t){return!1===/^(https?:|\/\/)/.test(t)}n.d(e,"a",(function(){return r}))},476:function(t,e,n){"use strict";var r=n(0),o=n(69);e.a=function(){return Object(r.useContext)(o.a)}},481:function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));n(513);var r=n(476);function o(t){var e=(Object(r.a)().siteConfig||{}).baseUrl,n=void 0===e?"/":e;if(!t)return t;return/^(https?:|\/\/)/.test(t)?t:t.startsWith("/")?n+t.slice(1):n+t}},486:function(t,e,n){"use strict";var r=n(0),o=n.n(r),i=n(624);e.a=function(t){return o.a.createElement(i.a,t)}},488:function(t,e,n){"use strict";var r=n(12),o=n(96)(!0);r(r.P,"Array",{includes:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),n(74)("includes")},489:function(t,e,n){"use strict";var r=n(12),o=n(557);r(r.P+r.F*n(558)("includes"),"String",{includes:function(t){return!!~o(this,t,"includes").indexOf(t,arguments.length>1?arguments[1]:void 0)}})},513:function(t,e,n){"use strict";var r=n(12),o=n(26),i=n(557),a="".startsWith;r(r.P+r.F*n(558)("startsWith"),"String",{startsWith:function(t){var e=i(this,t,"startsWith"),n=o(Math.min(arguments.length>1?arguments[1]:void 0,e.length)),r=String(t);return a?a.call(e,r,n):e.slice(n,n+r.length)===r}})},557:function(t,e,n){var r=n(95),o=n(34);t.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return String(o(t))}},558:function(t,e,n){var r=n(2)("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(o){}}return!0}},624:function(t,e,n){"use strict";(function(t){n.d(e,"a",(function(){return yt}));var r,o,i,a,c=n(15),u=n.n(c),s=n(625),f=n.n(s),l=n(626),p=n.n(l),d=n(0),h=n.n(d),y=n(51),m=n.n(y),b="bodyAttributes",v="htmlAttributes",T="titleAttributes",g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title"},w=(Object.keys(g).map((function(t){return g[t]})),"charset"),O="cssText",A="href",C="http-equiv",E="innerHTML",S="itemprop",j="name",P="property",k="rel",x="src",I="target",L={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},M="defaultTitle",R="defer",N="encodeSpecialCharacters",D="onChangeClientState",H="titleTemplate",q=Object.keys(L).reduce((function(t,e){return t[L[e]]=e,t}),{}),F=[g.NOSCRIPT,g.SCRIPT,g.STYLE],_="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},U=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},Y=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n},K=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},z=function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return!1===e?String(t):String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},J=function(t){var e=X(t,g.TITLE),n=X(t,H);if(n&&e)return n.replace(/%s/g,(function(){return Array.isArray(e)?e.join(""):e}));var r=X(t,M);return e||r||void 0},$=function(t){return X(t,D)||function(){}},G=function(t,e){return e.filter((function(e){return void 0!==e[t]})).map((function(e){return e[t]})).reduce((function(t,e){return B({},t,e)}),{})},Q=function(t,e){return e.filter((function(t){return void 0!==t[g.BASE]})).map((function(t){return t[g.BASE]})).reverse().reduce((function(e,n){if(!e.length)for(var r=Object.keys(n),o=0;o=0;n--){var r=t[n];if(r.hasOwnProperty(e))return r[e]}return null},Z=(r=Date.now(),function(t){var e=Date.now();e-r>16?(r=e,t(e)):setTimeout((function(){Z(t)}),0)}),tt=function(t){return clearTimeout(t)},et="undefined"!=typeof window?window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||Z:t.requestAnimationFrame||Z,nt="undefined"!=typeof window?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||tt:t.cancelAnimationFrame||tt,rt=function(t){return console&&"function"==typeof console.warn&&console.warn(t)},ot=null,it=function(t,e){var n=t.baseTag,r=t.bodyAttributes,o=t.htmlAttributes,i=t.linkTags,a=t.metaTags,c=t.noscriptTags,u=t.onChangeClientState,s=t.scriptTags,f=t.styleTags,l=t.title,p=t.titleAttributes;ut(g.BODY,r),ut(g.HTML,o),ct(l,p);var d={baseTag:st(g.BASE,n),linkTags:st(g.LINK,i),metaTags:st(g.META,a),noscriptTags:st(g.NOSCRIPT,c),scriptTags:st(g.SCRIPT,s),styleTags:st(g.STYLE,f)},h={},y={};Object.keys(d).forEach((function(t){var e=d[t],n=e.newTags,r=e.oldTags;n.length&&(h[t]=n),r.length&&(y[t]=d[t].oldTags)})),e&&e(),u(t,h,y)},at=function(t){return Array.isArray(t)?t.join(""):t},ct=function(t,e){void 0!==t&&document.title!==t&&(document.title=at(t)),ut(g.TITLE,e)},ut=function(t,e){var n=document.getElementsByTagName(t)[0];if(n){for(var r=n.getAttribute("data-react-helmet"),o=r?r.split(","):[],i=[].concat(o),a=Object.keys(e),c=0;c=0;l--)n.removeAttribute(i[l]);o.length===i.length?n.removeAttribute("data-react-helmet"):n.getAttribute("data-react-helmet")!==a.join(",")&&n.setAttribute("data-react-helmet",a.join(","))}},st=function(t,e){var n=document.head||document.querySelector(g.HEAD),r=n.querySelectorAll(t+"[data-react-helmet]"),o=Array.prototype.slice.call(r),i=[],a=void 0;return e&&e.length&&e.forEach((function(e){var n=document.createElement(t);for(var r in e)if(e.hasOwnProperty(r))if(r===E)n.innerHTML=e.innerHTML;else if(r===O)n.styleSheet?n.styleSheet.cssText=e.cssText:n.appendChild(document.createTextNode(e.cssText));else{var c=void 0===e[r]?"":e[r];n.setAttribute(r,c)}n.setAttribute("data-react-helmet","true"),o.some((function(t,e){return a=e,n.isEqualNode(t)}))?o.splice(a,1):i.push(n)})),o.forEach((function(t){return t.parentNode.removeChild(t)})),i.forEach((function(t){return n.appendChild(t)})),{oldTags:o,newTags:i}},ft=function(t){return Object.keys(t).reduce((function(e,n){var r=void 0!==t[n]?n+'="'+t[n]+'"':""+n;return e?e+" "+r:r}),"")},lt=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(t).reduce((function(e,n){return e[L[n]||n]=t[n],e}),e)},pt=function(t,e,n){switch(t){case g.TITLE:return{toComponent:function(){return t=e.title,n=e.titleAttributes,(r={key:t})["data-react-helmet"]=!0,o=lt(n,r),[h.a.createElement(g.TITLE,o,t)];var t,n,r,o},toString:function(){return function(t,e,n,r){var o=ft(n),i=at(e);return o?"<"+t+' data-react-helmet="true" '+o+">"+z(i,r)+"":"<"+t+' data-react-helmet="true">'+z(i,r)+""}(t,e.title,e.titleAttributes,n)}};case b:case v:return{toComponent:function(){return lt(e)},toString:function(){return ft(e)}};default:return{toComponent:function(){return function(t,e){return e.map((function(e,n){var r,o=((r={key:n})["data-react-helmet"]=!0,r);return Object.keys(e).forEach((function(t){var n=L[t]||t;if(n===E||n===O){var r=e.innerHTML||e.cssText;o.dangerouslySetInnerHTML={__html:r}}else o[n]=e[t]})),h.a.createElement(t,o)}))}(t,e)},toString:function(){return function(t,e,n){return e.reduce((function(e,r){var o=Object.keys(r).filter((function(t){return!(t===E||t===O)})).reduce((function(t,e){var o=void 0===r[e]?e:e+'="'+z(r[e],n)+'"';return t?t+" "+o:o}),""),i=r.innerHTML||r.cssText||"",a=-1===F.indexOf(t);return e+"<"+t+' data-react-helmet="true" '+o+(a?"/>":">"+i+"")}),"")}(t,e,n)}}}},dt=function(t){var e=t.baseTag,n=t.bodyAttributes,r=t.encode,o=t.htmlAttributes,i=t.linkTags,a=t.metaTags,c=t.noscriptTags,u=t.scriptTags,s=t.styleTags,f=t.title,l=void 0===f?"":f,p=t.titleAttributes;return{base:pt(g.BASE,e,r),bodyAttributes:pt(b,n,r),htmlAttributes:pt(v,o,r),link:pt(g.LINK,i,r),meta:pt(g.META,a,r),noscript:pt(g.NOSCRIPT,c,r),script:pt(g.SCRIPT,u,r),style:pt(g.STYLE,s,r),title:pt(g.TITLE,{title:l,titleAttributes:p},r)}},ht=f()((function(t){return{baseTag:Q([A,I],t),bodyAttributes:G(b,t),defer:X(t,R),encode:X(t,N),htmlAttributes:G(v,t),linkTags:V(g.LINK,[k,A],t),metaTags:V(g.META,[j,w,C,P,S],t),noscriptTags:V(g.NOSCRIPT,[E],t),onChangeClientState:$(t),scriptTags:V(g.SCRIPT,[x,E],t),styleTags:V(g.STYLE,[O],t),title:J(t),titleAttributes:G(T,t)}}),(function(t){ot&&nt(ot),t.defer?ot=et((function(){it(t,(function(){ot=null}))})):(it(t),ot=null)}),dt)((function(){return null})),yt=(o=ht,a=i=function(t){function e(){return U(this,e),K(this,t.apply(this,arguments))}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),e.prototype.shouldComponentUpdate=function(t){return!p()(this.props,t)},e.prototype.mapNestedChildrenToProps=function(t,e){if(!e)return null;switch(t.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:e};case g.STYLE:return{cssText:e}}throw new Error("<"+t.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")},e.prototype.flattenArrayTypeChildren=function(t){var e,n=t.child,r=t.arrayTypeChildren,o=t.newChildProps,i=t.nestedChildren;return B({},r,((e={})[n.type]=[].concat(r[n.type]||[],[B({},o,this.mapNestedChildrenToProps(n,i))]),e))},e.prototype.mapObjectTypeChildren=function(t){var e,n,r=t.child,o=t.newProps,i=t.newChildProps,a=t.nestedChildren;switch(r.type){case g.TITLE:return B({},o,((e={})[r.type]=a,e.titleAttributes=B({},i),e));case g.BODY:return B({},o,{bodyAttributes:B({},i)});case g.HTML:return B({},o,{htmlAttributes:B({},i)})}return B({},o,((n={})[r.type]=B({},i),n))},e.prototype.mapArrayTypeChildrenToProps=function(t,e){var n=B({},e);return Object.keys(t).forEach((function(e){var r;n=B({},n,((r={})[e]=t[e],r))})),n},e.prototype.warnOnInvalidChildren=function(t,e){return!0},e.prototype.mapChildrenToProps=function(t,e){var n=this,r={};return h.a.Children.forEach(t,(function(t){if(t&&t.props){var o=t.props,i=o.children,a=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(t).reduce((function(e,n){return e[q[n]||n]=t[n],e}),e)}(W(o,["children"]));switch(n.warnOnInvalidChildren(t,i),t.type){case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:r=n.flattenArrayTypeChildren({child:t,arrayTypeChildren:r,newChildProps:a,nestedChildren:i});break;default:e=n.mapObjectTypeChildren({child:t,newProps:e,newChildProps:a,nestedChildren:i})}}})),e=this.mapArrayTypeChildrenToProps(r,e)},e.prototype.render=function(){var t=this.props,e=t.children,n=W(t,["children"]),r=B({},n);return e&&(r=this.mapChildrenToProps(e,r)),h.a.createElement(o,r)},Y(e,null,[{key:"canUseDOM",set:function(t){o.canUseDOM=t}}]),e}(h.a.Component),i.propTypes={base:u.a.object,bodyAttributes:u.a.object,children:u.a.oneOfType([u.a.arrayOf(u.a.node),u.a.node]),defaultTitle:u.a.string,defer:u.a.bool,encodeSpecialCharacters:u.a.bool,htmlAttributes:u.a.object,link:u.a.arrayOf(u.a.object),meta:u.a.arrayOf(u.a.object),noscript:u.a.arrayOf(u.a.object),onChangeClientState:u.a.func,script:u.a.arrayOf(u.a.object),style:u.a.arrayOf(u.a.object),title:u.a.string,titleAttributes:u.a.object,titleTemplate:u.a.string},i.defaultProps={defer:!0,encodeSpecialCharacters:!0},i.peek=o.peek,i.rewind=function(){var t=o.rewind();return t||(t=dt({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}})),t},a);yt.renderStatic=yt.rewind}).call(this,n(76))},625:function(t,e,n){"use strict";var r,o=n(0),i=(r=o)&&"object"==typeof r&&"default"in r?r.default:r;function a(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}var c=!("undefined"==typeof window||!window.document||!window.document.createElement);t.exports=function(t,e,n){if("function"!=typeof t)throw new Error("Expected reducePropsToState to be a function.");if("function"!=typeof e)throw new Error("Expected handleStateChangeOnClient to be a function.");if(void 0!==n&&"function"!=typeof n)throw new Error("Expected mapStateOnServer to either be undefined or a function.");return function(r){if("function"!=typeof r)throw new Error("Expected WrappedComponent to be a React component.");var u,s=[];function f(){u=t(s.map((function(t){return t.props}))),l.canUseDOM?e(u):n&&(u=n(u))}var l=function(t){var e,n;function o(){return t.apply(this,arguments)||this}n=t,(e=o).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n,o.peek=function(){return u},o.rewind=function(){if(o.canUseDOM)throw new Error("You may only call rewind() on the server. Call peek() to read the current state.");var t=u;return u=void 0,s=[],t};var a=o.prototype;return a.UNSAFE_componentWillMount=function(){s.push(this),f()},a.componentDidUpdate=function(){f()},a.componentWillUnmount=function(){var t=s.indexOf(this);s.splice(t,1),f()},a.render=function(){return i.createElement(r,this.props)},o}(o.PureComponent);return a(l,"displayName","SideEffect("+function(t){return t.displayName||t.name||"Component"}(r)+")"),a(l,"canUseDOM",c),l}}},626:function(t,e,n){"use strict";var r=Array.isArray,o=Object.keys,i=Object.prototype.hasOwnProperty,a="undefined"!=typeof Element;t.exports=function(t,e){try{return function t(e,n){if(e===n)return!0;if(e&&n&&"object"==typeof e&&"object"==typeof n){var c,u,s,f=r(e),l=r(n);if(f&&l){if((u=e.length)!=n.length)return!1;for(c=u;0!=c--;)if(!t(e[c],n[c]))return!1;return!0}if(f!=l)return!1;var p=e instanceof Date,d=n instanceof Date;if(p!=d)return!1;if(p&&d)return e.getTime()==n.getTime();var h=e instanceof RegExp,y=n instanceof RegExp;if(h!=y)return!1;if(h&&y)return e.toString()==n.toString();var m=o(e);if((u=m.length)!==o(n).length)return!1;for(c=u;0!=c--;)if(!i.call(n,m[c]))return!1;if(a&&e instanceof Element&&n instanceof Element)return e===n;for(c=u;0!=c--;)if(!("_owner"===(s=m[c])&&e.$$typeof||t(e[s],n[s])))return!1;return!0}return e!=e&&n!=n}(t,e)}catch(n){if(n.message&&n.message.match(/stack|recursion/i)||-2146828260===n.number)return console.warn("Warning: react-fast-compare does not handle circular references.",n.name,n.message),!1;throw n}}}}]); \ No newline at end of file diff --git a/2121549d.f3a36735.js b/2121549d.ae87edfd.js similarity index 99% rename from 2121549d.f3a36735.js rename to 2121549d.ae87edfd.js index b9f5e83e48..a68f95aae7 100644 --- a/2121549d.f3a36735.js +++ b/2121549d.ae87edfd.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{198:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return s})),n.d(t,"metadata",(function(){return c})),n.d(t,"rightToc",(function(){return b})),n.d(t,"default",(function(){return p}));var a=n(1),o=n(9),r=(n(0),n(465)),i=n(464),l=(n(477),n(469)),s={last_modified_on:"2023-09-08",$schema:"/.meta/.schemas/guides.json",title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},c={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",permalink:"/guides/tutorial/build-e2e-testing-ephemeral-environments",readingTime:"12 min read",source:"@site/guides/tutorial/build-e2e-testing-ephemeral-environments.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",truncated:!1,prevItem:{title:"Blazingly fast Preview Environments for NextJS, NodeJS, and MongoDB on AWS",permalink:"/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws"},nextItem:{title:"Continuous Integration",permalink:"/guides/advanced/continuous-integration"}},b=[{value:"Why E2E Testing?",id:"why-e2e-testing",children:[]},{value:"The Importance of Ephemeral Environments",id:"the-importance-of-ephemeral-environments",children:[]},{value:"GitHub Actions and Qovery: A Perfect Match",id:"github-actions-and-qovery-a-perfect-match",children:[]},{value:"What You'll Learn",id:"what-youll-learn",children:[]},{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Tools",id:"tools",children:[]},{value:"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery",id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery",children:[{value:"1. Prepare Qovery blueprint environment",id:"1-prepare-qovery-blueprint-environment",children:[]},{value:"2. Build and push container image",id:"2-build-and-push-container-image",children:[]},{value:"3. Create an Ephemeral Environment with GitHub Actions and Qovery",id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery",children:[]},{value:"4. Run E2E tests with K6",id:"4-run-e2e-tests-with-k6",children:[]},{value:"5. Display test results in Pull Request",id:"5-display-test-results-in-pull-request",children:[]},{value:"6. Destroy Ephemeral Environment and clean up resources",id:"6-destroy-ephemeral-environment-and-clean-up-resources",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:b};function p(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Welcome to this comprehensive step-by-step guide on building End-to-End (E2E) testing ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/ephemeral-environments"}),"ephemeral environments")," using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/features/actions"}),"GitHub Actions")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery"),". If you've been seeking ways to automate your testing processes, reduce operational overhead, and improve the efficiency of your development cycle, then you're in the right place."),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"This article is available in the webinar format as well")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/1be8d4229cb74ed7b0526cc2acbca8ad",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"why-e2e-testing"},"Why E2E Testing?"),Object(r.b)("p",null,"End-to-End testing is a critical phase in the software development lifecycle. It validates that your application works cohesively from start to finish, mimicking real-world scenarios."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/e2e-pyramid.png",alt:"E2E vs UI Tests vs Integation Tests vs Unit Tests - from SemaphoreCI"})),Object(r.b)("p",null,"While unit tests and integration tests offer valuable insights, they do not replicate how multiple components interact in a live production environment. E2E testing fills that gap and ensures that your application performs as expected when it goes live."),Object(r.b)("h2",{id:"the-importance-of-ephemeral-environments"},"The Importance of Ephemeral Environments"),Object(r.b)("p",null,"In the world of DevOps and CI/CD, ephemeral environments (aka ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/why-preview-environments-are-the-new-thing-in-devops"}),"Preview Environments"),") serve as temporary, isolated setups where you can test your applications. These environments are increasingly vital in agile development frameworks where frequent changes are the norm. They can be provisioned quickly, teared down when no longer needed, and replicated easily. This means you can push your changes more rapidly into production with confidence."),Object(r.b)("h2",{id:"github-actions-and-qovery-a-perfect-match"},"GitHub Actions and Qovery: A Perfect Match"),Object(r.b)("p",null,"GitHub Actions offers a powerful platform for automating workflows, allowing you to build, test, and deploy your code right from GitHub. Qovery, on the other hand, simplifies the provisioning and management of cloud resources, making it incredibly straightforward to set up ephemeral environments. When used in tandem, these tools provide a seamless, automated pipeline for E2E testing."),Object(r.b)("h2",{id:"what-youll-learn"},"What You'll Learn"),Object(r.b)("p",null,"This guide is designed to walk you through the entire process of setting up an automated E2E testing pipeline. We'll start by setting up GitHub Actions, move on to configuring ephemeral environments with Qovery, and finally, integrate these components into a cohesive, automated testing solution."),Object(r.b)("p",null,"By the end of this guide, you'll have a fully operational E2E testing pipeline that will allow you to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Automate your testing process"),Object(r.b)("li",{parentName:"ol"},"Quickly provision and de-provision environments"),Object(r.b)("li",{parentName:"ol"},"Integrate closely with your GitHub repository"),Object(r.b)("li",{parentName:"ol"},"Save both time and operational costs")),Object(r.b)("p",null,"So, whether you are a developer, a DevOps engineer, a QA specialist, an engineering manager, or even a CTO, this guide offers valuable insights for anyone involved in the software development process."),Object(r.b)("p",null,"Let's dive in!"),Object(r.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(r.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Contact us via ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning Qovery")),Object(r.b)("h2",{id:"tools"},"Tools"),Object(r.b)("p",null,"Here are the tools we will use in this guide:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.qovery.com"}),"Qovery")," for the infrastructure and the ephemeral environment"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/features/actions"}),"GitHub Actions")," for the CI/CD pipeline"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://k6.io/"}),"K6")," for the e2e tests")),Object(r.b)("h2",{id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery"},"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery"),Object(r.b)("p",null,"Here is the big picture of what we will build:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/1.png",alt:"e2e testing Workflow with github actions and Qovery"})),Object(r.b)("p",null,"We will focus on the most important parts of the workflow - from label number 2 to 11. I assume that you already know GitHub and how to create a Pull Request :)"),Object(r.b)("p",null,"Let's go!"),Object(r.b)("h3",{id:"1-prepare-qovery-blueprint-environment"},"1. Prepare Qovery blueprint environment"),Object(r.b)("p",null,"If you are not already familiar with Qovery, I recommend you to ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/getting-started/what-is-qovery/"}),"What's Qovery"),". In this guide, we will use Qovery to provision our ephemeral environments composed of a Java application (",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app"}),"TODO app"),") and a PostgreSQL database. For this, we will create a blueprint environment that will be used as a template to create ephemeral environments."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can skip this part if you already have an environment that you want to use as a base for your ephemeral environments.")),Object(r.b)("p",null,"Here are the steps I did to create my blueprint environment:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://console.qovery.com"}),"Qovery"),"."),Object(r.b)("li",{parentName:"ol"},"Create a new project."),Object(r.b)("li",{parentName:"ol"},"Create a new environment named ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint"),"."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/getting-started/create-a-database/"}),"PostgreSQL database")," inside your ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint")," environment."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/application/#create-an-application"}),"TODO app")," by using my ECR container registry where I push my image from GitHub Actions (cf next step).")),Object(r.b)("p",null,"At the end of those steps, you should have something like this:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/2.png",alt:"Blueprint environment"})),Object(r.b)("p",null,"If you want to use my ",Object(r.b)("inlineCode",{parentName:"p"},"TODO app")," as an example, you need to properly configure the environment variables of the application. Here is a table with the environment variables you need to set:"),Object(r.b)("details",null,Object(r.b)("summary",null,"Environment Variables"),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Name"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Is Alias?"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Scope"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Value"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Comment"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DB_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._DEFAULT_DATABASE_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database name")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_HOST")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._HOST_INTERNAL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database host")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database port")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_USERNAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._LOGIN")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database login")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database password")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"QUARKUS_DATASOURCE_JDBC_URL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"jdbc:postgresql://{{POSTGRES_HOST}}:{{POSTGRES_PORT}}/{{POSTGRES_DB_NAME}}"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Connection string to the PostgreSQL database"))))),Object(r.b)("p",null,"You're good to go! Now, let's move on to the next step."),Object(r.b)("h3",{id:"2-build-and-push-container-image"},"2. Build and push container image"),Object(r.b)("p",null,"In this step, we will build and push the container image of our application to our ECR container registry. We will use GitHub Actions to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"build-and-push-image.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n build-and-push-container:\n runs-on: ubuntu-latest\n needs: run-unit-tests\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v2\n with:\n aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n aws-region: eu-west-3\n\n - name: Login to Amazon ECR\n id: login-ecr\n uses: aws-actions/amazon-ecr-login@v1\n with:\n mask-password: 'true'\n\n - name: Build, Tag, and push image to Amazon ECR\n env:\n ECR_REGISTRY: 687975725498.dkr.ecr.eu-west-3.amazonaws.com\n ECR_REPOSITORY: todo-app\n IMAGE_TAG: ${{ github.sha }}\n run: |\n docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .\n docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest\n docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/build-and-push-image.yml"}),"here"))),Object(r.b)("p",null,Object(r.b)("inlineCode",{parentName:"p"},"AWS_ACCESS_KEY_ID")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AWS_SECRET_ACCESS_KEY")," are stored as ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/encrypted-secrets"}),"GitHub secrets"),"."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ECR registry is also connected to my Qovery account - so I can pull the pushed image from Qovery as well.")),Object(r.b)("h3",{id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery"},"3. Create an Ephemeral Environment with GitHub Actions and Qovery"),Object(r.b)("p",null,"In this step, we will create an ephemeral environment with GitHub Actions and Qovery. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI")," inside our GitHub Actions workflow to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"pull-request-run-e2e-tests.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'...\njobs:\n create-e2e-environment:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n permissions:\n pull-requests: write\n steps:\n - id: create-environment\n name: Create and deploy Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s clone \'${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}\' environment into \'$new_environment_name\' environment"\n\n qovery environment clone \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --new-environment-name "$new_environment_name"\n\n qovery container update \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" \\\n --tag ${{ github.sha }}\n\n qovery environment deploy \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n\n qovery_status_markdown_output=`qovery service list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --markdown`\n\n echo "QOVERY_STATUS_MARKDOWN_OUTPUT<> "$GITHUB_OUTPUT"\n echo "$qovery_status_markdown_output" >> "$GITHUB_OUTPUT"\n echo "EOF" >> "$GITHUB_OUTPUT"\n')),Object(r.b)("p",null,"Basically, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment clone")," command to clone our blueprint environment into a new environment. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container update")," command to update the container tag of our application. Finally, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment deploy")," command to deploy our application. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deployment to be completed. We also use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery service list")," command to get the status of our environment and store it in a GitHub output variable. This variable will be used in the next step to display the status of the environment in the Pull Request."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n - name: PR Comment with URL\n uses: mshick/add-pr-comment@v2\n with:\n message-id: qovery-e2e-environment-status\n message: |\n ${{ steps.create-environment.outputs.QOVERY_STATUS_MARKDOWN_OUTPUT }}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/3.png",alt:"Ephemeral environment status in Pull Request"})),Object(r.b)("h3",{id:"4-run-e2e-tests-with-k6"},"4. Run E2E tests with K6"),Object(r.b)("p",null,"In this step, we will run our E2E tests with ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io"}),"K6"),". K6 is a modern load testing tool that allows you to write tests in JavaScript. It's a great tool to run E2E tests as well. Here is the script we will use:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"import http from 'k6/http';\nimport {check, group, sleep, fail} from 'k6';\nimport {uuidv4} from 'https://jslib.k6.io/k6-utils/1.4.0/index.js';\n\nconst api_host = `${__ENV.API_HOST}/api`;\nexport const options = {\n stages: [\n {duration: '5m', target: 100}, // traffic ramp-up from 1 to 100 users over 5 minutes.\n //{ duration: '30m', target: 100 }, // stay at 100 users for 30 minutes\n {duration: '1m', target: 50}, // ramp-down to 50 users\n ]\n}\n\nexport function setup() {\n // add some data\n const params = {\n headers: {\n 'Content-Type': 'application/json',\n },\n };\n\n for (let i = 0; i < 20; i++) {\n const res = http.post(api_host, JSON.stringify({title: uuidv4()}), params);\n check(res, {'item added': (r) => r.status === 201});\n }\n}\n\nexport default function () {\n http.get(api_host);\n}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete script is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/e2e/e2e.js"}),"here"))),Object(r.b)("p",null,"We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"setup")," function to add some data to our database. Then, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"default")," function to get the list of items from our API. We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable to define the number of users we want to simulate. In this example, we will simulate 100 users for 5 minutes. You can find more information about the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io/docs/using-k6/options"}),"here"),"."),Object(r.b)("p",null,"To run our E2E tests, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6 run")," command inside our GitHub Actions workflow. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),' run-e2e-tests:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n needs: create-e2e-environment\n permissions:\n pull-requests: write\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - id: run-e2e\n name: Run E2E tests\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n sudo gpg -k\n sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69\n echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list\n sudo apt-get update\n sudo apt-get install k6\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n api_domain=`qovery container domain list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" | grep "BUILT_IN_DOMAIN" | head -1 | awk \'{print $5}\' | sed -e \'s/\\x1b\\[[0-9;]*m//g\'`\n\n echo "api_domain: $api_domain"\n\n api_host="https://$api_domain"\n echo "API_HOST: $api_host"\n\n e2e_report=`k6 --no-color -q -e API_HOST=$api_host run e2e/e2e.js`\n\n echo "E2E_REPORT<> $GITHUB_OUTPUT\n echo "$e2e_report" >> $GITHUB_OUTPUT\n echo "EOF" >> $GITHUB_OUTPUT\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"We use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command to get the domain of our application. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6")," command to run our E2E tests. We store the result of the tests in a GitHub output variable."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command returns ANSI color codes. We use the ",Object(r.b)("inlineCode",{parentName:"p"},"sed -e 's/\\x1b\\[[0-9;]*m//g'")," command to remove them.")),Object(r.b)("h3",{id:"5-display-test-results-in-pull-request"},"5. Display test results in Pull Request"),Object(r.b)("p",null,"In this step, we will display the result of our E2E tests in the Pull Request. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-output-parameter"}),"GitHub Actions output variables")," to do that. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"})," - name: Display E2E Report\n uses: mshick/add-pr-comment@v2\n with:\n message-id: e2e-report\n message: |\n E2E Tests Report\n\n --\n\n ```\n ${{ steps.run-e2e.outputs.E2E_REPORT }}\n ```\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml#L109C1-L120C16"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/4.png",alt:"E2E report in Pull Request"})),Object(r.b)("h3",{id:"6-destroy-ephemeral-environment-and-clean-up-resources"},"6. Destroy Ephemeral Environment and clean up resources"),Object(r.b)("p",null,"Now we will destroy the ephemeral environment and clean up the resources when the Pull Request is closed or merged. Here is the yaml:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'name: Destroy and clean up E2E Tests Environment\n\non:\n pull_request:\n types: [ closed ]\n\njobs:\n delete-e2e-environment:\n runs-on: ubuntu-latest\n steps:\n - id: delete-environment\n name: Delete Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s delete \'$new_environment_name\' environment and release its resources"\n\n qovery environment delete \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-destroy-e2e-environment.yml"}),"here"))),Object(r.b)("p",null,"We just use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment delete")," command to delete the ephemeral environment. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deletion to be completed. Qovery will automatically release the resources used by the environment."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congratulations! You've successfully built an automated E2E testing pipeline with GitHub Actions and Qovery. You can now run your tests in a fully isolated environment, provisioned and de-provisioned automatically, and integrated with your GitHub repository."),Object(r.b)("p",null,"Some resources:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://semaphoreci.com/blog/e2e-testing"}),"https://semaphoreci.com/blog/e2e-testing")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.loom.com/share/1be8d4229cb74ed7b0526cc2acbca8ad"}),"Webinar record"))))}p.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),o=n.n(a),r=n(463),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||s))}),t)}},468:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),o=n.n(a),r=n(464);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),o=(n(481),n(478),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(483),l=n(463),s=n.n(l),c=n(471),b=n.n(c),u=n(482),p=37,m=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",o,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function h(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,O=e.size,v=(e.style,e.values),g=e.urlKey,j=Object(u.a)(),E=j.tabGroupChoices,y=j.setTabGroupChoices,f=Object(o.useState)(n),N=f[0],w=f[1];if(null!=i){var _=E[i];null!=_&&_!==N&&w(_)}var T=function(e){w(e),null!=i&&y(i,e)},R=[],A=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=b.a.parse(window.location.search);e[g]&&w(e[g])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(O||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?r.a.createElement(h,Object(a.a)({changeSelectedValue:T,handleKeydown:A,placeholder:s,selectedValue:N,size:O,tabRefs:R},e)):r.a.createElement(d,Object(a.a)({changeSelectedValue:T,handleKeydown:A,selectedValue:N,tabRefs:R},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{198:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return s})),n.d(t,"metadata",(function(){return c})),n.d(t,"rightToc",(function(){return b})),n.d(t,"default",(function(){return p}));var a=n(1),o=n(9),r=(n(0),n(465)),i=n(464),l=(n(477),n(469)),s={last_modified_on:"2023-09-08",$schema:"/.meta/.schemas/guides.json",title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},c={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",permalink:"/guides/tutorial/build-e2e-testing-ephemeral-environments",readingTime:"12 min read",source:"@site/guides/tutorial/build-e2e-testing-ephemeral-environments.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",truncated:!1,prevItem:{title:"Blazingly fast Preview Environments for NextJS, NodeJS, and MongoDB on AWS",permalink:"/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws"},nextItem:{title:"Continuous Integration",permalink:"/guides/advanced/continuous-integration"}},b=[{value:"Why E2E Testing?",id:"why-e2e-testing",children:[]},{value:"The Importance of Ephemeral Environments",id:"the-importance-of-ephemeral-environments",children:[]},{value:"GitHub Actions and Qovery: A Perfect Match",id:"github-actions-and-qovery-a-perfect-match",children:[]},{value:"What You'll Learn",id:"what-youll-learn",children:[]},{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Tools",id:"tools",children:[]},{value:"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery",id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery",children:[{value:"1. Prepare Qovery blueprint environment",id:"1-prepare-qovery-blueprint-environment",children:[]},{value:"2. Build and push container image",id:"2-build-and-push-container-image",children:[]},{value:"3. Create an Ephemeral Environment with GitHub Actions and Qovery",id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery",children:[]},{value:"4. Run E2E tests with K6",id:"4-run-e2e-tests-with-k6",children:[]},{value:"5. Display test results in Pull Request",id:"5-display-test-results-in-pull-request",children:[]},{value:"6. Destroy Ephemeral Environment and clean up resources",id:"6-destroy-ephemeral-environment-and-clean-up-resources",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:b};function p(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Welcome to this comprehensive step-by-step guide on building End-to-End (E2E) testing ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/ephemeral-environments"}),"ephemeral environments")," using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/features/actions"}),"GitHub Actions")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery"),". If you've been seeking ways to automate your testing processes, reduce operational overhead, and improve the efficiency of your development cycle, then you're in the right place."),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"This article is available in the webinar format as well")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/1be8d4229cb74ed7b0526cc2acbca8ad",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"why-e2e-testing"},"Why E2E Testing?"),Object(r.b)("p",null,"End-to-End testing is a critical phase in the software development lifecycle. It validates that your application works cohesively from start to finish, mimicking real-world scenarios."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/e2e-pyramid.png",alt:"E2E vs UI Tests vs Integation Tests vs Unit Tests - from SemaphoreCI"})),Object(r.b)("p",null,"While unit tests and integration tests offer valuable insights, they do not replicate how multiple components interact in a live production environment. E2E testing fills that gap and ensures that your application performs as expected when it goes live."),Object(r.b)("h2",{id:"the-importance-of-ephemeral-environments"},"The Importance of Ephemeral Environments"),Object(r.b)("p",null,"In the world of DevOps and CI/CD, ephemeral environments (aka ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/why-preview-environments-are-the-new-thing-in-devops"}),"Preview Environments"),") serve as temporary, isolated setups where you can test your applications. These environments are increasingly vital in agile development frameworks where frequent changes are the norm. They can be provisioned quickly, teared down when no longer needed, and replicated easily. This means you can push your changes more rapidly into production with confidence."),Object(r.b)("h2",{id:"github-actions-and-qovery-a-perfect-match"},"GitHub Actions and Qovery: A Perfect Match"),Object(r.b)("p",null,"GitHub Actions offers a powerful platform for automating workflows, allowing you to build, test, and deploy your code right from GitHub. Qovery, on the other hand, simplifies the provisioning and management of cloud resources, making it incredibly straightforward to set up ephemeral environments. When used in tandem, these tools provide a seamless, automated pipeline for E2E testing."),Object(r.b)("h2",{id:"what-youll-learn"},"What You'll Learn"),Object(r.b)("p",null,"This guide is designed to walk you through the entire process of setting up an automated E2E testing pipeline. We'll start by setting up GitHub Actions, move on to configuring ephemeral environments with Qovery, and finally, integrate these components into a cohesive, automated testing solution."),Object(r.b)("p",null,"By the end of this guide, you'll have a fully operational E2E testing pipeline that will allow you to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Automate your testing process"),Object(r.b)("li",{parentName:"ol"},"Quickly provision and de-provision environments"),Object(r.b)("li",{parentName:"ol"},"Integrate closely with your GitHub repository"),Object(r.b)("li",{parentName:"ol"},"Save both time and operational costs")),Object(r.b)("p",null,"So, whether you are a developer, a DevOps engineer, a QA specialist, an engineering manager, or even a CTO, this guide offers valuable insights for anyone involved in the software development process."),Object(r.b)("p",null,"Let's dive in!"),Object(r.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(r.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Contact us via ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning Qovery")),Object(r.b)("h2",{id:"tools"},"Tools"),Object(r.b)("p",null,"Here are the tools we will use in this guide:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.qovery.com"}),"Qovery")," for the infrastructure and the ephemeral environment"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/features/actions"}),"GitHub Actions")," for the CI/CD pipeline"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://k6.io/"}),"K6")," for the e2e tests")),Object(r.b)("h2",{id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery"},"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery"),Object(r.b)("p",null,"Here is the big picture of what we will build:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/1.png",alt:"e2e testing Workflow with github actions and Qovery"})),Object(r.b)("p",null,"We will focus on the most important parts of the workflow - from label number 2 to 11. I assume that you already know GitHub and how to create a Pull Request :)"),Object(r.b)("p",null,"Let's go!"),Object(r.b)("h3",{id:"1-prepare-qovery-blueprint-environment"},"1. Prepare Qovery blueprint environment"),Object(r.b)("p",null,"If you are not already familiar with Qovery, I recommend you to ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/getting-started/what-is-qovery/"}),"What's Qovery"),". In this guide, we will use Qovery to provision our ephemeral environments composed of a Java application (",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app"}),"TODO app"),") and a PostgreSQL database. For this, we will create a blueprint environment that will be used as a template to create ephemeral environments."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can skip this part if you already have an environment that you want to use as a base for your ephemeral environments.")),Object(r.b)("p",null,"Here are the steps I did to create my blueprint environment:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://console.qovery.com"}),"Qovery"),"."),Object(r.b)("li",{parentName:"ol"},"Create a new project."),Object(r.b)("li",{parentName:"ol"},"Create a new environment named ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint"),"."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/getting-started/create-a-database/"}),"PostgreSQL database")," inside your ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint")," environment."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/application/#create-an-application"}),"TODO app")," by using my ECR container registry where I push my image from GitHub Actions (cf next step).")),Object(r.b)("p",null,"At the end of those steps, you should have something like this:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/2.png",alt:"Blueprint environment"})),Object(r.b)("p",null,"If you want to use my ",Object(r.b)("inlineCode",{parentName:"p"},"TODO app")," as an example, you need to properly configure the environment variables of the application. Here is a table with the environment variables you need to set:"),Object(r.b)("details",null,Object(r.b)("summary",null,"Environment Variables"),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Name"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Is Alias?"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Scope"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Value"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Comment"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DB_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._DEFAULT_DATABASE_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database name")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_HOST")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._HOST_INTERNAL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database host")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database port")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_USERNAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._LOGIN")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database login")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database password")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"QUARKUS_DATASOURCE_JDBC_URL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"jdbc:postgresql://{{POSTGRES_HOST}}:{{POSTGRES_PORT}}/{{POSTGRES_DB_NAME}}"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Connection string to the PostgreSQL database"))))),Object(r.b)("p",null,"You're good to go! Now, let's move on to the next step."),Object(r.b)("h3",{id:"2-build-and-push-container-image"},"2. Build and push container image"),Object(r.b)("p",null,"In this step, we will build and push the container image of our application to our ECR container registry. We will use GitHub Actions to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"build-and-push-image.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n build-and-push-container:\n runs-on: ubuntu-latest\n needs: run-unit-tests\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v2\n with:\n aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n aws-region: eu-west-3\n\n - name: Login to Amazon ECR\n id: login-ecr\n uses: aws-actions/amazon-ecr-login@v1\n with:\n mask-password: 'true'\n\n - name: Build, Tag, and push image to Amazon ECR\n env:\n ECR_REGISTRY: 687975725498.dkr.ecr.eu-west-3.amazonaws.com\n ECR_REPOSITORY: todo-app\n IMAGE_TAG: ${{ github.sha }}\n run: |\n docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .\n docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest\n docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/build-and-push-image.yml"}),"here"))),Object(r.b)("p",null,Object(r.b)("inlineCode",{parentName:"p"},"AWS_ACCESS_KEY_ID")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AWS_SECRET_ACCESS_KEY")," are stored as ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/encrypted-secrets"}),"GitHub secrets"),"."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ECR registry is also connected to my Qovery account - so I can pull the pushed image from Qovery as well.")),Object(r.b)("h3",{id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery"},"3. Create an Ephemeral Environment with GitHub Actions and Qovery"),Object(r.b)("p",null,"In this step, we will create an ephemeral environment with GitHub Actions and Qovery. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI")," inside our GitHub Actions workflow to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"pull-request-run-e2e-tests.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'...\njobs:\n create-e2e-environment:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n permissions:\n pull-requests: write\n steps:\n - id: create-environment\n name: Create and deploy Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s clone \'${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}\' environment into \'$new_environment_name\' environment"\n\n qovery environment clone \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --new-environment-name "$new_environment_name"\n\n qovery container update \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" \\\n --tag ${{ github.sha }}\n\n qovery environment deploy \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n\n qovery_status_markdown_output=`qovery service list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --markdown`\n\n echo "QOVERY_STATUS_MARKDOWN_OUTPUT<> "$GITHUB_OUTPUT"\n echo "$qovery_status_markdown_output" >> "$GITHUB_OUTPUT"\n echo "EOF" >> "$GITHUB_OUTPUT"\n')),Object(r.b)("p",null,"Basically, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment clone")," command to clone our blueprint environment into a new environment. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container update")," command to update the container tag of our application. Finally, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment deploy")," command to deploy our application. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deployment to be completed. We also use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery service list")," command to get the status of our environment and store it in a GitHub output variable. This variable will be used in the next step to display the status of the environment in the Pull Request."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n - name: PR Comment with URL\n uses: mshick/add-pr-comment@v2\n with:\n message-id: qovery-e2e-environment-status\n message: |\n ${{ steps.create-environment.outputs.QOVERY_STATUS_MARKDOWN_OUTPUT }}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/3.png",alt:"Ephemeral environment status in Pull Request"})),Object(r.b)("h3",{id:"4-run-e2e-tests-with-k6"},"4. Run E2E tests with K6"),Object(r.b)("p",null,"In this step, we will run our E2E tests with ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io"}),"K6"),". K6 is a modern load testing tool that allows you to write tests in JavaScript. It's a great tool to run E2E tests as well. Here is the script we will use:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"import http from 'k6/http';\nimport {check, group, sleep, fail} from 'k6';\nimport {uuidv4} from 'https://jslib.k6.io/k6-utils/1.4.0/index.js';\n\nconst api_host = `${__ENV.API_HOST}/api`;\nexport const options = {\n stages: [\n {duration: '5m', target: 100}, // traffic ramp-up from 1 to 100 users over 5 minutes.\n //{ duration: '30m', target: 100 }, // stay at 100 users for 30 minutes\n {duration: '1m', target: 50}, // ramp-down to 50 users\n ]\n}\n\nexport function setup() {\n // add some data\n const params = {\n headers: {\n 'Content-Type': 'application/json',\n },\n };\n\n for (let i = 0; i < 20; i++) {\n const res = http.post(api_host, JSON.stringify({title: uuidv4()}), params);\n check(res, {'item added': (r) => r.status === 201});\n }\n}\n\nexport default function () {\n http.get(api_host);\n}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete script is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/e2e/e2e.js"}),"here"))),Object(r.b)("p",null,"We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"setup")," function to add some data to our database. Then, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"default")," function to get the list of items from our API. We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable to define the number of users we want to simulate. In this example, we will simulate 100 users for 5 minutes. You can find more information about the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io/docs/using-k6/options"}),"here"),"."),Object(r.b)("p",null,"To run our E2E tests, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6 run")," command inside our GitHub Actions workflow. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),' run-e2e-tests:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n needs: create-e2e-environment\n permissions:\n pull-requests: write\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - id: run-e2e\n name: Run E2E tests\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n sudo gpg -k\n sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69\n echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list\n sudo apt-get update\n sudo apt-get install k6\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n api_domain=`qovery container domain list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" | grep "BUILT_IN_DOMAIN" | head -1 | awk \'{print $5}\' | sed -e \'s/\\x1b\\[[0-9;]*m//g\'`\n\n echo "api_domain: $api_domain"\n\n api_host="https://$api_domain"\n echo "API_HOST: $api_host"\n\n e2e_report=`k6 --no-color -q -e API_HOST=$api_host run e2e/e2e.js`\n\n echo "E2E_REPORT<> $GITHUB_OUTPUT\n echo "$e2e_report" >> $GITHUB_OUTPUT\n echo "EOF" >> $GITHUB_OUTPUT\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"We use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command to get the domain of our application. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6")," command to run our E2E tests. We store the result of the tests in a GitHub output variable."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command returns ANSI color codes. We use the ",Object(r.b)("inlineCode",{parentName:"p"},"sed -e 's/\\x1b\\[[0-9;]*m//g'")," command to remove them.")),Object(r.b)("h3",{id:"5-display-test-results-in-pull-request"},"5. Display test results in Pull Request"),Object(r.b)("p",null,"In this step, we will display the result of our E2E tests in the Pull Request. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-output-parameter"}),"GitHub Actions output variables")," to do that. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"})," - name: Display E2E Report\n uses: mshick/add-pr-comment@v2\n with:\n message-id: e2e-report\n message: |\n E2E Tests Report\n\n --\n\n ```\n ${{ steps.run-e2e.outputs.E2E_REPORT }}\n ```\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml#L109C1-L120C16"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/4.png",alt:"E2E report in Pull Request"})),Object(r.b)("h3",{id:"6-destroy-ephemeral-environment-and-clean-up-resources"},"6. Destroy Ephemeral Environment and clean up resources"),Object(r.b)("p",null,"Now we will destroy the ephemeral environment and clean up the resources when the Pull Request is closed or merged. Here is the yaml:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'name: Destroy and clean up E2E Tests Environment\n\non:\n pull_request:\n types: [ closed ]\n\njobs:\n delete-e2e-environment:\n runs-on: ubuntu-latest\n steps:\n - id: delete-environment\n name: Delete Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s delete \'$new_environment_name\' environment and release its resources"\n\n qovery environment delete \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-destroy-e2e-environment.yml"}),"here"))),Object(r.b)("p",null,"We just use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment delete")," command to delete the ephemeral environment. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deletion to be completed. Qovery will automatically release the resources used by the environment."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congratulations! You've successfully built an automated E2E testing pipeline with GitHub Actions and Qovery. You can now run your tests in a fully isolated environment, provisioned and de-provisioned automatically, and integrated with your GitHub repository."),Object(r.b)("p",null,"Some resources:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://semaphoreci.com/blog/e2e-testing"}),"https://semaphoreci.com/blog/e2e-testing")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.loom.com/share/1be8d4229cb74ed7b0526cc2acbca8ad"}),"Webinar record"))))}p.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),o=n.n(a),r=n(463),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||s))}),t)}},468:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),o=n.n(a),r=n(464);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),o=(n(480),n(479),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(483),l=n(463),s=n.n(l),c=n(471),b=n.n(c),u=n(482),p=37,m=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",o,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function h(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,O=e.size,v=(e.style,e.values),g=e.urlKey,j=Object(u.a)(),E=j.tabGroupChoices,y=j.setTabGroupChoices,f=Object(o.useState)(n),N=f[0],w=f[1];if(null!=i){var _=E[i];null!=_&&_!==N&&w(_)}var T=function(e){w(e),null!=i&&y(i,e)},R=[],A=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=b.a.parse(window.location.search);e[g]&&w(e[g])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(O||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?r.a.createElement(h,Object(a.a)({changeSelectedValue:T,handleKeydown:A,placeholder:s,selectedValue:N,size:O,tabRefs:R},e)):r.a.createElement(d,Object(a.a)({changeSelectedValue:T,handleKeydown:A,selectedValue:N,tabRefs:R},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file diff --git a/2ea1d02e.2b8cb48c.js b/2ea1d02e.c3b75db4.js similarity index 99% rename from 2ea1d02e.2b8cb48c.js rename to 2ea1d02e.c3b75db4.js index 97e38ec98a..72e899a57d 100644 --- a/2ea1d02e.2b8cb48c.js +++ b/2ea1d02e.c3b75db4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{211:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return u})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return d}));var a=n(1),r=n(9),o=(n(0),n(465)),l=n(464),i=(n(477),n(469)),c={last_modified_on:"2023-07-29",$schema:"/.meta/.schemas/guides.json",title:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws",readingTime:"3 min read",source:"@site/guides/tutorial/create-a-playground-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create a Playground Environment on AWS",truncated:!1,prevItem:{title:"Create a blazingly fast REST API in Rust (Part 1/2)",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1"},nextItem:{title:"Create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws"}},s=[{value:"Create your Playground Environment",id:"create-your-playground-environment",children:[]},{value:"Delete your Playground Environment",id:"delete-your-playground-environment",children:[]},{value:"Optional: Create a Playground Cluster",id:"optional-create-a-playground-cluster",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:s};function d(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"The Qovery Playground is another concept than creating a Playground Environment. ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/discover-learn-and-experience-the-qovery-playground-is-now-open"}),"Read more about the Qovery Playground"),".")),Object(o.b)("p",null,"A Playground Environment is an environment where you can do all your testing without impacting an existing environment."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments.jpg",alt:"Playground environments"})),Object(o.b)("p",null,"Here are some use cases where a playground environment is helpful for:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Experimenting"),": Test your code without the fear to break anything from your original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Benchmarking"),": You want to stress your application without affecting the original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Debugging"),": You have a bug in production that you want to reproduce but without impacting the production environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Product Demo"),": Your Sales or Product Manager needs to make an important demo and want to be sure it will work.")),Object(o.b)(i.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(o.b)("p",null,"In this guide, we will create a playground environment on AWS."),Object(o.b)(l.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Quick Tip: Creating a playground environment results in using the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature to duplicate it! Nothing more.")),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/90cc74349adb42bc9630fb546886b586",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"create-your-playground-environment"},"Create your Playground Environment"),Object(o.b)("p",null,"To create your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the base environment that you want to clone"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Clone")," button"),Object(o.b)("li",{parentName:"ol"},"Enter a name for your playground environment"),Object(o.b)("li",{parentName:"ol"},"Select the cluster where you want to deploy it"),Object(o.b)("li",{parentName:"ol"},"Set the Environment mode to ",Object(o.b)("inlineCode",{parentName:"li"},"Development")),Object(o.b)("li",{parentName:"ol"},"Click on the Create button"),Object(o.b)("li",{parentName:"ol"},"Deploy your Playground Environment")),Object(o.b)("p",null,"Once deployed, your applications within this environment will have dedicated URLs to get access to. You can use these URLs to test your application."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/48290a88f2294b6f9c371879c2d25cdc",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Then you can check that your playground environment is working by visiting the temporary URL."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/3531b538f4ed47b49a1078303210da83",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"delete-your-playground-environment"},"Delete your Playground Environment"),Object(o.b)("p",null,"To delete your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the playground environment"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Delete")," button"),Object(o.b)("li",{parentName:"ol"},"Confirm and Delete the environment")),Object(o.b)("p",null,"All the resources will be freed."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/951d93f22bbb45aba4a2162104fcdcd9",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"optional-create-a-playground-cluster"},"Optional: Create a Playground Cluster"),Object(o.b)("p",null,"To prevent your playground environment from impacting your production environment, you can create a dedicated cluster. So every playground environments will be on the same cluster and will not disturb your production."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments_with_2_clusters.jpg",alt:"Playground environments with 2 clusters"})),Object(o.b)("p",null,"Here is how to create a playground cluster."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7cea821edfb7447a928dd707a7d428b5",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"And how to create a playground environment on our ",Object(o.b)("inlineCode",{parentName:"p"},"playground cluster"),"."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/82ccf107e3374c08a9f6b629451ef736",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),o=n(463),l=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(n,"alert","alert--"+i,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),o=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),r=(n(481),n(478),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),l=n(483),i=n(463),c=n.n(i),u=n(471),s=n.n(u),b=n(482),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,u=e.values,s=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},u.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var u=_.groupBy(c,"group");c=Object.keys(u).map((function(e){return{label:e,options:u[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:i.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,u=e.select,y=e.size,h=(e.style,e.values),f=e.urlKey,v=Object(b.a)(),w=v.tabGroupChoices,O=v.setTabGroupChoices,j=Object(r.useState)(n),N=j[0],k=j[1];if(null!=l){var C=w[l];null!=C&&C!==N&&k(C)}var E=function(e){k(e),null!=l&&O(l,e)},P=[],S=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=s.a.parse(window.location.search);e[f]&&k(e[f])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),h.length>1&&(u?o.a.createElement(g,Object(a.a)({changeSelectedValue:E,handleKeydown:S,placeholder:c,selectedValue:N,size:y,tabRefs:P},e)):o.a.createElement(p,Object(a.a)({changeSelectedValue:E,handleKeydown:S,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{211:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return u})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return d}));var a=n(1),r=n(9),o=(n(0),n(465)),l=n(464),i=(n(477),n(469)),c={last_modified_on:"2023-07-29",$schema:"/.meta/.schemas/guides.json",title:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws",readingTime:"3 min read",source:"@site/guides/tutorial/create-a-playground-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create a Playground Environment on AWS",truncated:!1,prevItem:{title:"Create a blazingly fast REST API in Rust (Part 1/2)",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1"},nextItem:{title:"Create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws"}},s=[{value:"Create your Playground Environment",id:"create-your-playground-environment",children:[]},{value:"Delete your Playground Environment",id:"delete-your-playground-environment",children:[]},{value:"Optional: Create a Playground Cluster",id:"optional-create-a-playground-cluster",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:s};function d(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"The Qovery Playground is another concept than creating a Playground Environment. ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/discover-learn-and-experience-the-qovery-playground-is-now-open"}),"Read more about the Qovery Playground"),".")),Object(o.b)("p",null,"A Playground Environment is an environment where you can do all your testing without impacting an existing environment."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments.jpg",alt:"Playground environments"})),Object(o.b)("p",null,"Here are some use cases where a playground environment is helpful for:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Experimenting"),": Test your code without the fear to break anything from your original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Benchmarking"),": You want to stress your application without affecting the original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Debugging"),": You have a bug in production that you want to reproduce but without impacting the production environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Product Demo"),": Your Sales or Product Manager needs to make an important demo and want to be sure it will work.")),Object(o.b)(i.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(o.b)("p",null,"In this guide, we will create a playground environment on AWS."),Object(o.b)(l.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Quick Tip: Creating a playground environment results in using the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature to duplicate it! Nothing more.")),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/90cc74349adb42bc9630fb546886b586",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"create-your-playground-environment"},"Create your Playground Environment"),Object(o.b)("p",null,"To create your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the base environment that you want to clone"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Clone")," button"),Object(o.b)("li",{parentName:"ol"},"Enter a name for your playground environment"),Object(o.b)("li",{parentName:"ol"},"Select the cluster where you want to deploy it"),Object(o.b)("li",{parentName:"ol"},"Set the Environment mode to ",Object(o.b)("inlineCode",{parentName:"li"},"Development")),Object(o.b)("li",{parentName:"ol"},"Click on the Create button"),Object(o.b)("li",{parentName:"ol"},"Deploy your Playground Environment")),Object(o.b)("p",null,"Once deployed, your applications within this environment will have dedicated URLs to get access to. You can use these URLs to test your application."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/48290a88f2294b6f9c371879c2d25cdc",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Then you can check that your playground environment is working by visiting the temporary URL."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/3531b538f4ed47b49a1078303210da83",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"delete-your-playground-environment"},"Delete your Playground Environment"),Object(o.b)("p",null,"To delete your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the playground environment"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Delete")," button"),Object(o.b)("li",{parentName:"ol"},"Confirm and Delete the environment")),Object(o.b)("p",null,"All the resources will be freed."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/951d93f22bbb45aba4a2162104fcdcd9",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"optional-create-a-playground-cluster"},"Optional: Create a Playground Cluster"),Object(o.b)("p",null,"To prevent your playground environment from impacting your production environment, you can create a dedicated cluster. So every playground environments will be on the same cluster and will not disturb your production."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments_with_2_clusters.jpg",alt:"Playground environments with 2 clusters"})),Object(o.b)("p",null,"Here is how to create a playground cluster."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7cea821edfb7447a928dd707a7d428b5",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"And how to create a playground environment on our ",Object(o.b)("inlineCode",{parentName:"p"},"playground cluster"),"."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/82ccf107e3374c08a9f6b629451ef736",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),o=n(463),l=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(n,"alert","alert--"+i,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),o=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),r=(n(480),n(479),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),l=n(483),i=n(463),c=n.n(i),u=n(471),s=n.n(u),b=n(482),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,u=e.values,s=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},u.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var u=_.groupBy(c,"group");c=Object.keys(u).map((function(e){return{label:e,options:u[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:i.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,u=e.select,y=e.size,h=(e.style,e.values),f=e.urlKey,v=Object(b.a)(),w=v.tabGroupChoices,O=v.setTabGroupChoices,j=Object(r.useState)(n),N=j[0],k=j[1];if(null!=l){var C=w[l];null!=C&&C!==N&&k(C)}var E=function(e){k(e),null!=l&&O(l,e)},P=[],S=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=s.a.parse(window.location.search);e[f]&&k(e[f])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),h.length>1&&(u?o.a.createElement(g,Object(a.a)({changeSelectedValue:E,handleKeydown:S,placeholder:c,selectedValue:N,size:y,tabRefs:P},e)):o.a.createElement(p,Object(a.a)({changeSelectedValue:E,handleKeydown:S,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file diff --git a/3088ad98.74f0aba9.js b/3088ad98.3d9f8b0d.js similarity index 99% rename from 3088ad98.74f0aba9.js rename to 3088ad98.3d9f8b0d.js index 237a0003ae..047454deb6 100644 --- a/3088ad98.74f0aba9.js +++ b/3088ad98.3d9f8b0d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{213:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return m}));var a=n(1),r=n(9),i=(n(0),n(465)),o=n(464),l=(n(477),n(469)),c={last_modified_on:"2023-05-29",$schema:"/.meta/.schemas/guides.json",title:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},b={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",permalink:"/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners",readingTime:"6 min read",source:"@site/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Getting Started with Preview Environments on AWS",truncated:!1,prevItem:{title:"Enable multi-region backup on your RDS instances with AWS Backup",permalink:"/guides/advanced/adding-multi-region-backup-rds"},nextItem:{title:"GitOps with Qovery",permalink:"/guides/tutorial/gitops-with-qovery"}},s=[{value:"Steps",id:"steps",children:[]},{value:"Create your Blueprint Environment",id:"create-your-blueprint-environment",children:[{value:"Enable Preview Environment",id:"enable-preview-environment",children:[]},{value:"Change your base branch",id:"change-your-base-branch",children:[]}]},{value:"Validate your Blueprint Environment",id:"validate-your-blueprint-environment",children:[]},{value:"Create a Preview Environment",id:"create-a-preview-environment",children:[]},{value:"Delete a Preview Environment",id:"delete-a-preview-environment",children:[]},{value:"Advanced",id:"advanced",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:s};function m(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(i.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(i.b)("p",null,"It is critical to have testing and staging environments accurately reflect production, but achieving this can be a major operational hassle. Most engineering teams use a single staging environment which makes it hard for developers to test their changes in isolation; the alternative is for DevOps teams to spin up new testing or staging environments manually and tear them down after testing is done."),Object(i.b)("p",null,"Qovery\u2019s Preview Environments solve this problem by automatically creating a clone of your production environment (including applications, databases and configuration) on every pull request, so you can test your changes with confidence without affecting your production."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_flow_schema.jpg",alt:"Flow on how Qovery Preview Environment works"})),Object(i.b)("p",null,"Qovery keeps your preview environments up to date on every commit and automatically destroys them when the original pull request is merged or closed. You can also set up an expiry time to automatically clean up preview environments after a period of inactivity."),Object(i.b)("p",null,"Preview Environments can be helpful in a lot of cases:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Share your changes live in code reviews: no more Git diffs for visual changes!"),Object(i.b)("li",{parentName:"ul"},"Get shareable links for upcoming features and collaborate more effectively with internal and external stakeholders."),Object(i.b)("li",{parentName:"ul"},"Run CI tests against a high fidelity copy of your production environment before merging.")),Object(i.b)("p",null,"In this step-by-step guide you will learn how to get started using the Preview Environments on AWS with Qovery."),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"This guide also works with other cloud service providers supported by Qovery.")),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"Please contact us via ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning the Preview Environments")),Object(i.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"installed Qovery on your AWS account")),Object(i.b)("li",{parentName:"ul"},"You have at least already ",Object(i.b)("strong",{parentName:"li"},"deployed successfully")," a first application"))),Object(i.b)("h2",{id:"steps"},"Steps"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-blueprint-environment"}),'Create a "Blueprint" environment')),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#enable-preview-environment"}),"Enable Preview Environment feature")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-preview-environment"}),"Create a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#delete-a-preview-environment"}),"Delete a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#seed-your-database"}),"Seed your database")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#auto-stop-and-start-your-preview-environments"}),"Auto stop and start your Preview Environments")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#integrate-your-ci-platform"}),"Integrate your CI (Continuous Deployment) platform"))),Object(i.b)("h2",{id:"create-your-blueprint-environment"},"Create your Blueprint Environment"),Object(i.b)("p",null,"Even if not required, we recommend creating an ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/"}),"environment"),' that will serve as a root to create your Preview Environments. The idea is to keep this environment as a template of a fully working environment. This environment should not be directly used. This is what we call "blueprint environment".'),Object(i.b)("p",null,"I assume you already have a working environment, so to create a blueprint environment you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Go to your working environment"),Object(i.b)("li",{parentName:"ol"},'Click on "Actions" > "Clone"'),Object(i.b)("li",{parentName:"ol"},'Name your environment "blueprint"'),Object(i.b)("li",{parentName:"ol"},'Click on "Create"')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/a282d6b832794671a3582550aa45f9ae",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"We recommend using a different cluster than your production for your Preview Environments.")),Object(i.b)("h3",{id:"enable-preview-environment"},"Enable Preview Environment"),Object(i.b)("p",null,"Now, you can go to turn on Preview Environments by:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Click on your ",Object(i.b)("inlineCode",{parentName:"li"},"Blueprint"),' environment "Settings".'),Object(i.b)("li",{parentName:"ol"},"Click on the ",Object(i.b)("inlineCode",{parentName:"li"},"Preview Env.")," tab"),Object(i.b)("li",{parentName:"ol"},"Turn on Preview Environment feature for all your applications by clicking on ",Object(i.b)("inlineCode",{parentName:"li"},"Activate preview environment for all apps"),".")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/55b9d99a59524e1cb7875f7db7691fbe",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h3",{id:"change-your-base-branch"},"Change your base branch"),Object(i.b)("p",null,"Now that you have turned on the Preview Environment feature, you need to change the base branch from your applications inside your Blueprint Environment. Let's say, every new feature branch you create are coming from ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". Then you will need to change all your applications to target the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," branch."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/67df458d340d484fa1e675cc20e36caf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Here is a flow example showing what happen when you create a new Pull Request from a ",Object(i.b)("inlineCode",{parentName:"p"},"feat/xxx")," branch that has been created from the base branch ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),"."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_branching.jpg",alt:"Flow on how Qovery Preview Environment Branching works"})),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"A developer creates a git branch ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is created from ",Object(i.b)("inlineCode",{parentName:"li"},"staging"),"."),Object(i.b)("li",{parentName:"ol"},"A developer creates a Pull Request for ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx"),"."),Object(i.b)("li",{parentName:"ol"},"Qovery creates a Preview Environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," from the ",Object(i.b)("inlineCode",{parentName:"li"},"blueprint")," environment. ",Object(i.b)("strong",{parentName:"li"},"The frontend, backend, PostgreSQL and Redis instances are cloned!")),Object(i.b)("li",{parentName:"ol"},"The frontend app from the environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is accessible via a dedicated URL.")),Object(i.b)("h2",{id:"validate-your-blueprint-environment"},"Validate your Blueprint Environment"),Object(i.b)("p",null,"Before creating a Preview Environment, validate that your Blueprint environment works."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/3dd4d9aee9ac44a9af0cb8eddee7735c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Once done, you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},'Stop your Blueprint environment by clicking on "Actions" > "Stop".'),Object(i.b)("li",{parentName:"ol"},'Turn off "auto-deploy" by clicking on "Settings" > "Deployment" > "Auto-deploy off" > "Save".')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/36b0bb48346f40f6ac8569a7b8dbc5b3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"We are now ready to try out our Preview Environment configuration."),Object(i.b)("h2",{id:"create-a-preview-environment"},"Create a Preview Environment"),Object(i.b)("p",null,"To create a Preview Environment, here are the steps:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Checkout your ",Object(i.b)("inlineCode",{parentName:"li"},"staging")," branch."),Object(i.b)("li",{parentName:"ol"},"Create a branch ",Object(i.b)("inlineCode",{parentName:"li"},"test_qovery_preview_environment")," and push it."),Object(i.b)("li",{parentName:"ol"},"Create a Pull Request/Merge Request.")),Object(i.b)(o.a,{type:"success",mdxType:"Alert"},Object(i.b)("p",null,"Qovery take care of cloning all your services and the configuration as well (Environment Variables and Secrets included).")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/2266d0897c964635b37447ae9ef2acea",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"You must see a new environment appearing in your environment list on Qovery. Wait until it is fully deployed, then you will be able to connect to it. This environment is fully isolated from your base environment."),Object(i.b)("h2",{id:"delete-a-preview-environment"},"Delete a Preview Environment"),Object(i.b)("p",null,"To delete you need to merge ",Object(i.b)("inlineCode",{parentName:"p"},"test_qovery_preview_environment")," into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". You also have the ability to delete it manually on Qovery."),Object(i.b)(o.a,{type:"warning",mdxType:"Alert"},Object(i.b)("p",null,"By merging into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),", Qovery will auto-redeploy the new version in your ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment. Turn off ",Object(i.b)("inlineCode",{parentName:"p"},"auto-deploy")," from the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment settings if you want to manually deploy new version in staging.")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/1feb31f4bbec4d54b0764dfa1271dd0d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h2",{id:"advanced"},"Advanced"),Object(i.b)("p",null,"Eager to know how to go integrate Qovery Preview Environments with your CI and much more? Check out our the following guides:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/qovery/lifecycle-job-examples/tree/main/examples/seed-postgres-database-with-sql-script"}),"Seed your Preview Environment database")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/integration/continuous-integration/"}),"Integrate your CI platform")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/environment/#deployment-rule"}),"Auto-stop and start your Preview Environment")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/customizing-preview-url-with-qovery-cli/"}),"Set up a custom domain for your Preview Environment"))),Object(i.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(i.b)("p",null,"Congrats! You have set up your Preview Environments features. Feel free to check out our ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question. In the next guide, we will go deeper configuration to integrate the Preview Environment with your existing products and workflow."))}m.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),i=n(463),o=n.n(i);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,i=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:o()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==i}),role:"alert"},!1!==i&&r.a.createElement("i",{className:o()("feather","icon-"+(i||c))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,i=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),i=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(i.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),r=(n(481),n(478),n(52),n(29),n(22),n(21),n(0)),i=n.n(r),o=n(483),l=n(463),c=n.n(l),b=n(471),s=n.n(b),u=n(482),m=37,p=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,o=e.handleKeydown,l=e.style,b=e.values,s=e.selectedValue,u=e.tabRefs;return i.a.createElement("div",{className:n?"tabs--centered":null},i.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:l},b.map((function(e){var t=e.value,n=e.label;return i.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return o(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function v(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,c=l;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return i.a.createElement(o.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,o=e.groupId,l=e.label,c=e.placeholder,b=e.select,h=e.size,f=(e.style,e.values),g=e.urlKey,w=Object(u.a)(),y=w.tabGroupChoices,j=w.setTabGroupChoices,O=Object(r.useState)(n),N=O[0],E=O[1];if(null!=o){var k=y[o];null!=k&&k!==N&&E(k)}var C=function(e){E(e),null!=o&&j(o,e)},P=[],x=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=s.a.parse(window.location.search);e[g]&&E(e[g])}}),[]),i.a.createElement(i.a.Fragment,null,i.a.createElement("div",{className:"margin-bottom--"+(h||"md")},l&&i.a.createElement("div",{className:"margin-vert--sm"},l),f.length>1&&(b?i.a.createElement(v,Object(a.a)({changeSelectedValue:C,handleKeydown:x,placeholder:c,selectedValue:N,size:h,tabRefs:P},e)):i.a.createElement(d,Object(a.a)({changeSelectedValue:C,handleKeydown:x,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{213:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return m}));var a=n(1),r=n(9),i=(n(0),n(465)),o=n(464),l=(n(477),n(469)),c={last_modified_on:"2023-05-29",$schema:"/.meta/.schemas/guides.json",title:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},b={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",permalink:"/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners",readingTime:"6 min read",source:"@site/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Getting Started with Preview Environments on AWS",truncated:!1,prevItem:{title:"Enable multi-region backup on your RDS instances with AWS Backup",permalink:"/guides/advanced/adding-multi-region-backup-rds"},nextItem:{title:"GitOps with Qovery",permalink:"/guides/tutorial/gitops-with-qovery"}},s=[{value:"Steps",id:"steps",children:[]},{value:"Create your Blueprint Environment",id:"create-your-blueprint-environment",children:[{value:"Enable Preview Environment",id:"enable-preview-environment",children:[]},{value:"Change your base branch",id:"change-your-base-branch",children:[]}]},{value:"Validate your Blueprint Environment",id:"validate-your-blueprint-environment",children:[]},{value:"Create a Preview Environment",id:"create-a-preview-environment",children:[]},{value:"Delete a Preview Environment",id:"delete-a-preview-environment",children:[]},{value:"Advanced",id:"advanced",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:s};function m(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(i.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(i.b)("p",null,"It is critical to have testing and staging environments accurately reflect production, but achieving this can be a major operational hassle. Most engineering teams use a single staging environment which makes it hard for developers to test their changes in isolation; the alternative is for DevOps teams to spin up new testing or staging environments manually and tear them down after testing is done."),Object(i.b)("p",null,"Qovery\u2019s Preview Environments solve this problem by automatically creating a clone of your production environment (including applications, databases and configuration) on every pull request, so you can test your changes with confidence without affecting your production."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_flow_schema.jpg",alt:"Flow on how Qovery Preview Environment works"})),Object(i.b)("p",null,"Qovery keeps your preview environments up to date on every commit and automatically destroys them when the original pull request is merged or closed. You can also set up an expiry time to automatically clean up preview environments after a period of inactivity."),Object(i.b)("p",null,"Preview Environments can be helpful in a lot of cases:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Share your changes live in code reviews: no more Git diffs for visual changes!"),Object(i.b)("li",{parentName:"ul"},"Get shareable links for upcoming features and collaborate more effectively with internal and external stakeholders."),Object(i.b)("li",{parentName:"ul"},"Run CI tests against a high fidelity copy of your production environment before merging.")),Object(i.b)("p",null,"In this step-by-step guide you will learn how to get started using the Preview Environments on AWS with Qovery."),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"This guide also works with other cloud service providers supported by Qovery.")),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"Please contact us via ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning the Preview Environments")),Object(i.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"installed Qovery on your AWS account")),Object(i.b)("li",{parentName:"ul"},"You have at least already ",Object(i.b)("strong",{parentName:"li"},"deployed successfully")," a first application"))),Object(i.b)("h2",{id:"steps"},"Steps"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-blueprint-environment"}),'Create a "Blueprint" environment')),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#enable-preview-environment"}),"Enable Preview Environment feature")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-preview-environment"}),"Create a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#delete-a-preview-environment"}),"Delete a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#seed-your-database"}),"Seed your database")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#auto-stop-and-start-your-preview-environments"}),"Auto stop and start your Preview Environments")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#integrate-your-ci-platform"}),"Integrate your CI (Continuous Deployment) platform"))),Object(i.b)("h2",{id:"create-your-blueprint-environment"},"Create your Blueprint Environment"),Object(i.b)("p",null,"Even if not required, we recommend creating an ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/"}),"environment"),' that will serve as a root to create your Preview Environments. The idea is to keep this environment as a template of a fully working environment. This environment should not be directly used. This is what we call "blueprint environment".'),Object(i.b)("p",null,"I assume you already have a working environment, so to create a blueprint environment you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Go to your working environment"),Object(i.b)("li",{parentName:"ol"},'Click on "Actions" > "Clone"'),Object(i.b)("li",{parentName:"ol"},'Name your environment "blueprint"'),Object(i.b)("li",{parentName:"ol"},'Click on "Create"')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/a282d6b832794671a3582550aa45f9ae",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"We recommend using a different cluster than your production for your Preview Environments.")),Object(i.b)("h3",{id:"enable-preview-environment"},"Enable Preview Environment"),Object(i.b)("p",null,"Now, you can go to turn on Preview Environments by:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Click on your ",Object(i.b)("inlineCode",{parentName:"li"},"Blueprint"),' environment "Settings".'),Object(i.b)("li",{parentName:"ol"},"Click on the ",Object(i.b)("inlineCode",{parentName:"li"},"Preview Env.")," tab"),Object(i.b)("li",{parentName:"ol"},"Turn on Preview Environment feature for all your applications by clicking on ",Object(i.b)("inlineCode",{parentName:"li"},"Activate preview environment for all apps"),".")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/55b9d99a59524e1cb7875f7db7691fbe",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h3",{id:"change-your-base-branch"},"Change your base branch"),Object(i.b)("p",null,"Now that you have turned on the Preview Environment feature, you need to change the base branch from your applications inside your Blueprint Environment. Let's say, every new feature branch you create are coming from ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". Then you will need to change all your applications to target the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," branch."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/67df458d340d484fa1e675cc20e36caf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Here is a flow example showing what happen when you create a new Pull Request from a ",Object(i.b)("inlineCode",{parentName:"p"},"feat/xxx")," branch that has been created from the base branch ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),"."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_branching.jpg",alt:"Flow on how Qovery Preview Environment Branching works"})),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"A developer creates a git branch ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is created from ",Object(i.b)("inlineCode",{parentName:"li"},"staging"),"."),Object(i.b)("li",{parentName:"ol"},"A developer creates a Pull Request for ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx"),"."),Object(i.b)("li",{parentName:"ol"},"Qovery creates a Preview Environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," from the ",Object(i.b)("inlineCode",{parentName:"li"},"blueprint")," environment. ",Object(i.b)("strong",{parentName:"li"},"The frontend, backend, PostgreSQL and Redis instances are cloned!")),Object(i.b)("li",{parentName:"ol"},"The frontend app from the environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is accessible via a dedicated URL.")),Object(i.b)("h2",{id:"validate-your-blueprint-environment"},"Validate your Blueprint Environment"),Object(i.b)("p",null,"Before creating a Preview Environment, validate that your Blueprint environment works."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/3dd4d9aee9ac44a9af0cb8eddee7735c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Once done, you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},'Stop your Blueprint environment by clicking on "Actions" > "Stop".'),Object(i.b)("li",{parentName:"ol"},'Turn off "auto-deploy" by clicking on "Settings" > "Deployment" > "Auto-deploy off" > "Save".')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/36b0bb48346f40f6ac8569a7b8dbc5b3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"We are now ready to try out our Preview Environment configuration."),Object(i.b)("h2",{id:"create-a-preview-environment"},"Create a Preview Environment"),Object(i.b)("p",null,"To create a Preview Environment, here are the steps:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Checkout your ",Object(i.b)("inlineCode",{parentName:"li"},"staging")," branch."),Object(i.b)("li",{parentName:"ol"},"Create a branch ",Object(i.b)("inlineCode",{parentName:"li"},"test_qovery_preview_environment")," and push it."),Object(i.b)("li",{parentName:"ol"},"Create a Pull Request/Merge Request.")),Object(i.b)(o.a,{type:"success",mdxType:"Alert"},Object(i.b)("p",null,"Qovery take care of cloning all your services and the configuration as well (Environment Variables and Secrets included).")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/2266d0897c964635b37447ae9ef2acea",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"You must see a new environment appearing in your environment list on Qovery. Wait until it is fully deployed, then you will be able to connect to it. This environment is fully isolated from your base environment."),Object(i.b)("h2",{id:"delete-a-preview-environment"},"Delete a Preview Environment"),Object(i.b)("p",null,"To delete you need to merge ",Object(i.b)("inlineCode",{parentName:"p"},"test_qovery_preview_environment")," into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". You also have the ability to delete it manually on Qovery."),Object(i.b)(o.a,{type:"warning",mdxType:"Alert"},Object(i.b)("p",null,"By merging into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),", Qovery will auto-redeploy the new version in your ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment. Turn off ",Object(i.b)("inlineCode",{parentName:"p"},"auto-deploy")," from the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment settings if you want to manually deploy new version in staging.")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/1feb31f4bbec4d54b0764dfa1271dd0d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h2",{id:"advanced"},"Advanced"),Object(i.b)("p",null,"Eager to know how to go integrate Qovery Preview Environments with your CI and much more? Check out our the following guides:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/qovery/lifecycle-job-examples/tree/main/examples/seed-postgres-database-with-sql-script"}),"Seed your Preview Environment database")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/integration/continuous-integration/"}),"Integrate your CI platform")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/environment/#deployment-rule"}),"Auto-stop and start your Preview Environment")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/customizing-preview-url-with-qovery-cli/"}),"Set up a custom domain for your Preview Environment"))),Object(i.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(i.b)("p",null,"Congrats! You have set up your Preview Environments features. Feel free to check out our ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question. In the next guide, we will go deeper configuration to integrate the Preview Environment with your existing products and workflow."))}m.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),i=n(463),o=n.n(i);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,i=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:o()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==i}),role:"alert"},!1!==i&&r.a.createElement("i",{className:o()("feather","icon-"+(i||c))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,i=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),i=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(i.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),r=(n(480),n(479),n(52),n(29),n(22),n(21),n(0)),i=n.n(r),o=n(483),l=n(463),c=n.n(l),b=n(471),s=n.n(b),u=n(482),m=37,p=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,o=e.handleKeydown,l=e.style,b=e.values,s=e.selectedValue,u=e.tabRefs;return i.a.createElement("div",{className:n?"tabs--centered":null},i.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:l},b.map((function(e){var t=e.value,n=e.label;return i.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return o(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function v(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,c=l;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return i.a.createElement(o.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,o=e.groupId,l=e.label,c=e.placeholder,b=e.select,h=e.size,f=(e.style,e.values),g=e.urlKey,w=Object(u.a)(),y=w.tabGroupChoices,j=w.setTabGroupChoices,O=Object(r.useState)(n),N=O[0],E=O[1];if(null!=o){var k=y[o];null!=k&&k!==N&&E(k)}var C=function(e){E(e),null!=o&&j(o,e)},P=[],x=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=s.a.parse(window.location.search);e[g]&&E(e[g])}}),[]),i.a.createElement(i.a.Fragment,null,i.a.createElement("div",{className:"margin-bottom--"+(h||"md")},l&&i.a.createElement("div",{className:"margin-vert--sm"},l),f.length>1&&(b?i.a.createElement(v,Object(a.a)({changeSelectedValue:C,handleKeydown:x,placeholder:c,selectedValue:N,size:h,tabRefs:P},e)):i.a.createElement(d,Object(a.a)({changeSelectedValue:C,handleKeydown:x,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file diff --git a/310.03a73963.js b/310.00192955.js similarity index 98% rename from 310.03a73963.js rename to 310.00192955.js index 89443c6bf0..966e1457c5 100644 --- a/310.03a73963.js +++ b/310.00192955.js @@ -1,2 +1,2 @@ -/*! For license information please see 310.03a73963.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[310],{463:function(e,a,t){var n;!function(){"use strict";var t={}.hasOwnProperty;function r(){for(var e=[],a=0;a0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(u.a,{className:"navbar__logo",src:g,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),i.map((function(e,a){return r.a.createElement("div",{key:a,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,a){return e.html?r.a.createElement("li",{key:a,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(F,e))}))):null)}))),(m||o)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:A.a.footerLogoLink},r.a.createElement(P,{alt:m.alt,url:d})):r.a.createElement(P,{alt:m.alt,url:d})),r.a.createElement("small",null,o),r.a.createElement("br",null))))},H=t(502),Q=t(503),z=t(3);t(138);a.a=function(e){var a=Object(b.a)().siteConfig,t=void 0===a?{}:a,n=t.title,c=t.themeConfig.image,i=t.url,s=e.children,m=e.title,u=e.noFooter,d=e.description,g=e.image,f=e.keywords,h=e.version,v=m?m+" | "+n:n,E=g||c,p=i+Object(y.a)(E),_=Object(z.h)(),k=_?"https://docs.qovery.com"+(_.pathname.endsWith("/")?_.pathname:_.pathname+"/"):null;return r.a.createElement(Q.a,null,r.a.createElement(H.a,null,r.a.createElement(o.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),v&&r.a.createElement("title",null,v),v&&r.a.createElement("meta",{property:"og:title",content:v}),r.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),r.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),r.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),r.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),r.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),r.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),d&&r.a.createElement("meta",{name:"description",content:d}),d&&r.a.createElement("meta",{property:"og:description",content:d}),h&&r.a.createElement("meta",{name:"docsearch:version",content:h}),f&&f.length&&r.a.createElement("meta",{name:"keywords",content:f.join(",")}),E&&r.a.createElement("meta",{property:"og:image",content:p}),E&&r.a.createElement("meta",{property:"twitter:image",content:p}),E&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+v}),k&&r.a.createElement("meta",{property:"og:url",content:k}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),k&&r.a.createElement("link",{rel:"canonical",href:k})),r.a.createElement(l.a,null),r.a.createElement(S,null),r.a.createElement("div",{className:"main-wrapper"},s),!u&&r.a.createElement(q,null)))}},494:function(e,a,t){"use strict";var n=t(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});a.a=r},604:function(e,a,t){"use strict";t.r(a);var n=t(0),r=t.n(n),l=t(487);a.default=function(){return r.a.createElement(l.a,{title:"Page Not Found"},r.a.createElement("div",{className:"container margin-vert--xl"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col col--6 col--offset-3"},r.a.createElement("h1",{className:"hero__title"},"Page Not Found"),r.a.createElement("p",null,"We could not find what you were looking for."),r.a.createElement("p",null,"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))}}}]); \ No newline at end of file +/*! For license information please see 310.00192955.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[310],{463:function(e,a,t){var n;!function(){"use strict";var t={}.hasOwnProperty;function r(){for(var e=[],a=0;a0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(u.a,{className:"navbar__logo",src:g,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),i.map((function(e,a){return r.a.createElement("div",{key:a,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,a){return e.html?r.a.createElement("li",{key:a,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(F,e))}))):null)}))),(m||o)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:A.a.footerLogoLink},r.a.createElement(P,{alt:m.alt,url:d})):r.a.createElement(P,{alt:m.alt,url:d})),r.a.createElement("small",null,o),r.a.createElement("br",null))))},H=t(502),Q=t(503),z=t(3);t(138);a.a=function(e){var a=Object(b.a)().siteConfig,t=void 0===a?{}:a,n=t.title,c=t.themeConfig.image,i=t.url,s=e.children,m=e.title,u=e.noFooter,d=e.description,g=e.image,f=e.keywords,h=e.version,v=m?m+" | "+n:n,E=g||c,p=i+Object(y.a)(E),_=Object(z.h)(),k=_?"https://docs.qovery.com"+(_.pathname.endsWith("/")?_.pathname:_.pathname+"/"):null;return r.a.createElement(Q.a,null,r.a.createElement(H.a,null,r.a.createElement(o.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),v&&r.a.createElement("title",null,v),v&&r.a.createElement("meta",{property:"og:title",content:v}),r.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),r.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),r.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),r.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),r.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),r.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),d&&r.a.createElement("meta",{name:"description",content:d}),d&&r.a.createElement("meta",{property:"og:description",content:d}),h&&r.a.createElement("meta",{name:"docsearch:version",content:h}),f&&f.length&&r.a.createElement("meta",{name:"keywords",content:f.join(",")}),E&&r.a.createElement("meta",{property:"og:image",content:p}),E&&r.a.createElement("meta",{property:"twitter:image",content:p}),E&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+v}),k&&r.a.createElement("meta",{property:"og:url",content:k}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),k&&r.a.createElement("link",{rel:"canonical",href:k})),r.a.createElement(l.a,null),r.a.createElement(S,null),r.a.createElement("div",{className:"main-wrapper"},s),!u&&r.a.createElement(q,null)))}},494:function(e,a,t){"use strict";var n=t(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});a.a=r},604:function(e,a,t){"use strict";t.r(a);var n=t(0),r=t.n(n),l=t(487);a.default=function(){return r.a.createElement(l.a,{title:"Page Not Found"},r.a.createElement("div",{className:"container margin-vert--xl"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col col--6 col--offset-3"},r.a.createElement("h1",{className:"hero__title"},"Page Not Found"),r.a.createElement("p",null,"We could not find what you were looking for."),r.a.createElement("p",null,"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))}}}]); \ No newline at end of file diff --git a/310.03a73963.js.LICENSE.txt b/310.00192955.js.LICENSE.txt similarity index 100% rename from 310.03a73963.js.LICENSE.txt rename to 310.00192955.js.LICENSE.txt diff --git a/3116c1fa.c98a3097.js b/3116c1fa.facd92c7.js similarity index 99% rename from 3116c1fa.c98a3097.js rename to 3116c1fa.facd92c7.js index d97d89c3ce..ced60aa111 100644 --- a/3116c1fa.c98a3097.js +++ b/3116c1fa.facd92c7.js @@ -1,2 +1,2 @@ -/*! For license information please see 3116c1fa.c98a3097.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{214:function(u,e,d){"use strict";d.r(e);var n=d(1),t=(d(52),d(468),d(29),d(22),d(21),d(85),d(0)),r=d.n(t),a=d(490),c=d(487),f=(d(470),d(514)),i=d(491),o=d.n(i),l=d(495),s=d(521),p=d.n(s),m=d(638),h=d.n(m),b=Object(a.a)("h2");e.default=function(u){var e=u.tags,d=Object.values(e).map((function(u){return{count:u.count,label:u.name,permalink:u.permalink}})),t=Object(l.a)(d,"guides"),a=o.a.groupBy(t,"category");return r.a.createElement(c.a,{title:"Tags",description:"Qovery guide tags"},r.a.createElement("header",{className:"hero hero--clean"},r.a.createElement("div",{className:"container"},r.a.createElement("h1",null,"All Guide Tags"))),r.a.createElement("main",{className:"container container--xs"},Object.keys(a).map((function(u,e){var d=a[u];return r.a.createElement("section",null,r.a.createElement(b,{id:u.name},h()(p()(u))),d.map((function(u,e){return r.a.createElement("div",null,r.a.createElement(f.a,Object(n.a)({key:e,valueOnly:!0},u)))})))}))))}},463:function(u,e,d){var n;!function(){"use strict";var d={}.hasOwnProperty;function t(){for(var u=[],e=0;e1?arguments[1]:void 0)}}),d(74)("find")},487:function(u,e,d){"use strict";d(497);var n=d(0),t=d.n(n),r=d(498),a=d(486),c=d(1),f=(d(488),d(489),d(499),d(470)),i=d(500),o=d(484),l=d.n(o),s=d(501),p=d.n(s),m=d(476),h=d(463),b=d.n(h),v=d(135),_=d.n(v),g=function(){return t.a.createElement("span",{className:b()(_.a.toggle,_.a.moon)})},D=function(){return t.a.createElement("span",{className:b()(_.a.toggle,_.a.sun)})},y=function(u){var e=Object(m.a)().isClient;return t.a.createElement(p.a,Object(c.a)({disabled:!e,icons:{checked:t.a.createElement(g,null),unchecked:t.a.createElement(D,null)}},u))};function E(){var u=Object(m.a)().siteConfig,e=(void 0===u?{}:u).customFields.metadata.latest_post,d=Date.parse(e.date),n=new Date,t=Math.abs(n-d),r=Math.ceil(t/864e5),a=null;return"undefined"!=typeof window&&(a=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),r<30&&(!a||a0&&t.a.createElement("div",{className:"row footer__links"},t.a.createElement("div",{className:"col col--5 footer__col"},t.a.createElement("div",{className:"margin-bottom--md"},t.a.createElement(l.a,{className:"navbar__logo",src:p,alt:"Qovery",width:"150",height:"auto"})),t.a.createElement("div",{className:"margin-bottom--md"},t.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),t.a.createElement("div",null,t.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},t.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",t.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},t.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",t.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},t.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),f.map((function(u,e){return t.a.createElement("div",{key:e,className:"col footer__col"},null!=u.title?t.a.createElement("h4",{className:"footer__title"},u.title):null,null!=u.items&&Array.isArray(u.items)&&u.items.length>0?t.a.createElement("ul",{className:"footer__items"},u.items.map((function(u,e){return u.html?t.a.createElement("li",{key:e,className:"footer__item",dangerouslySetInnerHTML:{__html:u.html}}):t.a.createElement("li",{key:u.href||u.to,className:"footer__item"},t.a.createElement(L,u))}))):null)}))),(o||a)&&t.a.createElement("div",{className:"text--center"},o&&o.src&&t.a.createElement("div",{className:"margin-bottom--sm"},o.href?t.a.createElement("a",{href:o.href,target:"_blank",rel:"noopener noreferrer",className:B.a.footerLogoLink},t.a.createElement(P,{alt:o.alt,url:s})):t.a.createElement(P,{alt:o.alt,url:s})),t.a.createElement("small",null,a),t.a.createElement("br",null))))},T=d(502),R=d(503),U=d(3);d(138);e.a=function(u){var e=Object(m.a)().siteConfig,d=void 0===e?{}:e,n=d.title,c=d.themeConfig.image,f=d.url,i=u.children,o=u.title,l=u.noFooter,s=u.description,p=u.image,h=u.keywords,b=u.version,v=o?o+" | "+n:n,_=p||c,g=f+Object(I.a)(_),D=Object(U.h)(),y=D?"https://docs.qovery.com"+(D.pathname.endsWith("/")?D.pathname:D.pathname+"/"):null;return t.a.createElement(R.a,null,t.a.createElement(T.a,null,t.a.createElement(a.a,null,t.a.createElement("html",{lang:"en"}),t.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),v&&t.a.createElement("title",null,v),v&&t.a.createElement("meta",{property:"og:title",content:v}),t.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),t.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),t.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),t.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),t.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),t.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),t.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),t.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),s&&t.a.createElement("meta",{name:"description",content:s}),s&&t.a.createElement("meta",{property:"og:description",content:s}),b&&t.a.createElement("meta",{name:"docsearch:version",content:b}),h&&h.length&&t.a.createElement("meta",{name:"keywords",content:h.join(",")}),_&&t.a.createElement("meta",{property:"og:image",content:g}),_&&t.a.createElement("meta",{property:"twitter:image",content:g}),_&&t.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+v}),y&&t.a.createElement("meta",{property:"og:url",content:y}),t.a.createElement("meta",{name:"twitter:card",content:"summary"}),y&&t.a.createElement("link",{rel:"canonical",href:y})),t.a.createElement(r.a,null),t.a.createElement(j,null),t.a.createElement("div",{className:"main-wrapper"},i),!l&&t.a.createElement(M,null)))}},490:function(u,e,d){"use strict";var n=d(9),t=d(0),r=d.n(t),a=d(463),c=d.n(a),f=d(476),i=(d(139),d(140)),o=d.n(i);e.a=function(u){return function(e){var d,t=e.id,a=Object(n.a)(e,["id"]),i=Object(f.a)().siteConfig,l=(i=void 0===i?{}:i).themeConfig,s=(l=void 0===l?{}:l).navbar,p=(s=void 0===s?{}:s).hideOnScroll,m=void 0!==p&&p;return t?r.a.createElement(u,a,r.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:c()("anchor",(d={},d[o.a.enhancedAnchor]=!m,d)),id:t}),r.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+t,title:"Direct link to heading"},"#"),a.children):r.a.createElement(u,a)}}},491:function(u,e,d){(function(u,n){var t;(function(){var r="Expected a function",a="__lodash_placeholder__",c=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],f="[object Arguments]",i="[object Array]",o="[object Boolean]",l="[object Date]",s="[object Error]",p="[object Function]",m="[object GeneratorFunction]",h="[object Map]",b="[object Number]",v="[object Object]",_="[object RegExp]",g="[object Set]",D="[object String]",y="[object Symbol]",E="[object WeakMap]",x="[object ArrayBuffer]",I="[object DataView]",w="[object Float32Array]",C="[object Float64Array]",F="[object Int8Array]",A="[object Int16Array]",k="[object Int32Array]",S="[object Uint8Array]",O="[object Uint16Array]",j="[object Uint32Array]",$=/\b__p \+= '';/g,N=/\b(__p \+=) '' \+/g,B=/(__e\(.*?\)|\b__t\)) \+\n'';/g,L=/&(?:amp|lt|gt|quot|#39);/g,P=/[&<>"']/g,M=RegExp(L.source),T=RegExp(P.source),R=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,z=/<%=([\s\S]+?)%>/g,K=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,W=/^\w*$/,G=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,H=/[\\^$.*+?()[\]{}|]/g,q=RegExp(H.source),J=/^\s+|\s+$/g,Z=/^\s+/,V=/\s+$/,Y=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Q=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,uu=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,eu=/\\(\\)?/g,du=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,nu=/\w*$/,tu=/^[-+]0x[0-9a-f]+$/i,ru=/^0b[01]+$/i,au=/^\[object .+?Constructor\]$/,cu=/^0o[0-7]+$/i,fu=/^(?:0|[1-9]\d*)$/,iu=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ou=/($^)/,lu=/['\n\r\u2028\u2029\\]/g,su="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",pu="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",mu="[\\ud800-\\udfff]",hu="["+pu+"]",bu="["+su+"]",vu="\\d+",_u="[\\u2700-\\u27bf]",gu="[a-z\\xdf-\\xf6\\xf8-\\xff]",Du="[^\\ud800-\\udfff"+pu+vu+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",yu="\\ud83c[\\udffb-\\udfff]",Eu="[^\\ud800-\\udfff]",xu="(?:\\ud83c[\\udde6-\\uddff]){2}",Iu="[\\ud800-\\udbff][\\udc00-\\udfff]",wu="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Cu="(?:"+gu+"|"+Du+")",Fu="(?:"+wu+"|"+Du+")",Au="(?:"+bu+"|"+yu+")"+"?",ku="[\\ufe0e\\ufe0f]?"+Au+("(?:\\u200d(?:"+[Eu,xu,Iu].join("|")+")[\\ufe0e\\ufe0f]?"+Au+")*"),Su="(?:"+[_u,xu,Iu].join("|")+")"+ku,Ou="(?:"+[Eu+bu+"?",bu,xu,Iu,mu].join("|")+")",ju=RegExp("['\u2019]","g"),$u=RegExp(bu,"g"),Nu=RegExp(yu+"(?="+yu+")|"+Ou+ku,"g"),Bu=RegExp([wu+"?"+gu+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[hu,wu,"$"].join("|")+")",Fu+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[hu,wu+Cu,"$"].join("|")+")",wu+"?"+Cu+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",wu+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",vu,Su].join("|"),"g"),Lu=RegExp("[\\u200d\\ud800-\\udfff"+su+"\\ufe0e\\ufe0f]"),Pu=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Mu=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Tu=-1,Ru={};Ru[w]=Ru[C]=Ru[F]=Ru[A]=Ru[k]=Ru[S]=Ru["[object Uint8ClampedArray]"]=Ru[O]=Ru[j]=!0,Ru[f]=Ru[i]=Ru[x]=Ru[o]=Ru[I]=Ru[l]=Ru[s]=Ru[p]=Ru[h]=Ru[b]=Ru[v]=Ru[_]=Ru[g]=Ru[D]=Ru[E]=!1;var Uu={};Uu[f]=Uu[i]=Uu[x]=Uu[I]=Uu[o]=Uu[l]=Uu[w]=Uu[C]=Uu[F]=Uu[A]=Uu[k]=Uu[h]=Uu[b]=Uu[v]=Uu[_]=Uu[g]=Uu[D]=Uu[y]=Uu[S]=Uu["[object Uint8ClampedArray]"]=Uu[O]=Uu[j]=!0,Uu[s]=Uu[p]=Uu[E]=!1;var zu={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Ku=parseFloat,Wu=parseInt,Gu="object"==typeof u&&u&&u.Object===Object&&u,Hu="object"==typeof self&&self&&self.Object===Object&&self,qu=Gu||Hu||Function("return this")(),Ju=e&&!e.nodeType&&e,Zu=Ju&&"object"==typeof n&&n&&!n.nodeType&&n,Vu=Zu&&Zu.exports===Ju,Yu=Vu&&Gu.process,Qu=function(){try{var u=Zu&&Zu.require&&Zu.require("util").types;return u||Yu&&Yu.binding&&Yu.binding("util")}catch(e){}}(),Xu=Qu&&Qu.isArrayBuffer,ue=Qu&&Qu.isDate,ee=Qu&&Qu.isMap,de=Qu&&Qu.isRegExp,ne=Qu&&Qu.isSet,te=Qu&&Qu.isTypedArray;function re(u,e,d){switch(d.length){case 0:return u.call(e);case 1:return u.call(e,d[0]);case 2:return u.call(e,d[0],d[1]);case 3:return u.call(e,d[0],d[1],d[2])}return u.apply(e,d)}function ae(u,e,d,n){for(var t=-1,r=null==u?0:u.length;++t-1}function se(u,e,d){for(var n=-1,t=null==u?0:u.length;++n-1;);return d}function Ne(u,e){for(var d=u.length;d--&&ye(e,u[d],0)>-1;);return d}function Be(u,e){for(var d=u.length,n=0;d--;)u[d]===e&&++n;return n}var Le=Ce({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Pe=Ce({"&":"&","<":"<",">":">",'"':""","'":"'"});function Me(u){return"\\"+zu[u]}function Te(u){return Lu.test(u)}function Re(u){var e=-1,d=Array(u.size);return u.forEach((function(u,n){d[++e]=[n,u]})),d}function Ue(u,e){return function(d){return u(e(d))}}function ze(u,e){for(var d=-1,n=u.length,t=0,r=[];++d",""":'"',"'":"'"});var Je=function u(e){var d,n=(e=null==e?qu:Je.defaults(qu.Object(),e,Je.pick(qu,Mu))).Array,t=e.Date,su=e.Error,pu=e.Function,mu=e.Math,hu=e.Object,bu=e.RegExp,vu=e.String,_u=e.TypeError,gu=n.prototype,Du=pu.prototype,yu=hu.prototype,Eu=e["__core-js_shared__"],xu=Du.toString,Iu=yu.hasOwnProperty,wu=0,Cu=(d=/[^.]+$/.exec(Eu&&Eu.keys&&Eu.keys.IE_PROTO||""))?"Symbol(src)_1."+d:"",Fu=yu.toString,Au=xu.call(hu),ku=qu._,Su=bu("^"+xu.call(Iu).replace(H,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ou=Vu?e.Buffer:void 0,Nu=e.Symbol,Lu=e.Uint8Array,zu=Ou?Ou.allocUnsafe:void 0,Gu=Ue(hu.getPrototypeOf,hu),Hu=hu.create,Ju=yu.propertyIsEnumerable,Zu=gu.splice,Yu=Nu?Nu.isConcatSpreadable:void 0,Qu=Nu?Nu.iterator:void 0,_e=Nu?Nu.toStringTag:void 0,Ce=function(){try{var u=Xt(hu,"defineProperty");return u({},"",{}),u}catch(e){}}(),Ze=e.clearTimeout!==qu.clearTimeout&&e.clearTimeout,Ve=t&&t.now!==qu.Date.now&&t.now,Ye=e.setTimeout!==qu.setTimeout&&e.setTimeout,Qe=mu.ceil,Xe=mu.floor,ud=hu.getOwnPropertySymbols,ed=Ou?Ou.isBuffer:void 0,dd=e.isFinite,nd=gu.join,td=Ue(hu.keys,hu),rd=mu.max,ad=mu.min,cd=t.now,fd=e.parseInt,id=mu.random,od=gu.reverse,ld=Xt(e,"DataView"),sd=Xt(e,"Map"),pd=Xt(e,"Promise"),md=Xt(e,"Set"),hd=Xt(e,"WeakMap"),bd=Xt(hu,"create"),vd=hd&&new hd,_d={},gd=Cr(ld),Dd=Cr(sd),yd=Cr(pd),Ed=Cr(md),xd=Cr(hd),Id=Nu?Nu.prototype:void 0,wd=Id?Id.valueOf:void 0,Cd=Id?Id.toString:void 0;function Fd(u){if(Ka(u)&&!ja(u)&&!(u instanceof Od)){if(u instanceof Sd)return u;if(Iu.call(u,"__wrapped__"))return Fr(u)}return new Sd(u)}var Ad=function(){function u(){}return function(e){if(!za(e))return{};if(Hu)return Hu(e);u.prototype=e;var d=new u;return u.prototype=void 0,d}}();function kd(){}function Sd(u,e){this.__wrapped__=u,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=void 0}function Od(u){this.__wrapped__=u,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function jd(u){var e=-1,d=null==u?0:u.length;for(this.clear();++e=e?u:e)),u}function Zd(u,e,d,n,t,r){var a,c=1&e,i=2&e,s=4&e;if(d&&(a=t?d(u,n,t,r):d(u)),void 0!==a)return a;if(!za(u))return u;var E=ja(u);if(E){if(a=function(u){var e=u.length,d=new u.constructor(e);e&&"string"==typeof u[0]&&Iu.call(u,"index")&&(d.index=u.index,d.input=u.input);return d}(u),!c)return vt(u,a)}else{var $=dr(u),N=$==p||$==m;if(La(u))return lt(u,c);if($==v||$==f||N&&!t){if(a=i||N?{}:tr(u),!c)return i?function(u,e){return _t(u,er(u),e)}(u,function(u,e){return u&&_t(e,Dc(e),u)}(a,u)):function(u,e){return _t(u,ur(u),e)}(u,Gd(a,u))}else{if(!Uu[$])return t?u:{};a=function(u,e,d){var n=u.constructor;switch(e){case x:return st(u);case o:case l:return new n(+u);case I:return function(u,e){var d=e?st(u.buffer):u.buffer;return new u.constructor(d,u.byteOffset,u.byteLength)}(u,d);case w:case C:case F:case A:case k:case S:case"[object Uint8ClampedArray]":case O:case j:return pt(u,d);case h:return new n;case b:case D:return new n(u);case _:return function(u){var e=new u.constructor(u.source,nu.exec(u));return e.lastIndex=u.lastIndex,e}(u);case g:return new n;case y:return t=u,wd?hu(wd.call(t)):{}}var t}(u,$,c)}}r||(r=new Ld);var B=r.get(u);if(B)return B;r.set(u,a),Ja(u)?u.forEach((function(n){a.add(Zd(n,e,d,n,u,r))})):Wa(u)&&u.forEach((function(n,t){a.set(t,Zd(n,e,d,t,u,r))}));var L=E?void 0:(s?i?Ht:Gt:i?Dc:gc)(u);return ce(L||u,(function(n,t){L&&(n=u[t=n]),zd(a,t,Zd(n,e,d,t,u,r))})),a}function Vd(u,e,d){var n=d.length;if(null==u)return!n;for(u=hu(u);n--;){var t=d[n],r=e[t],a=u[t];if(void 0===a&&!(t in u)||!r(a))return!1}return!0}function Yd(u,e,d){if("function"!=typeof u)throw new _u(r);return gr((function(){u.apply(void 0,d)}),e)}function Qd(u,e,d,n){var t=-1,r=le,a=!0,c=u.length,f=[],i=e.length;if(!c)return f;d&&(e=pe(e,Se(d))),n?(r=se,a=!1):e.length>=200&&(r=je,a=!1,e=new Bd(e));u:for(;++t-1},$d.prototype.set=function(u,e){var d=this.__data__,n=Kd(d,u);return n<0?(++this.size,d.push([u,e])):d[n][1]=e,this},Nd.prototype.clear=function(){this.size=0,this.__data__={hash:new jd,map:new(sd||$d),string:new jd}},Nd.prototype.delete=function(u){var e=Yt(this,u).delete(u);return this.size-=e?1:0,e},Nd.prototype.get=function(u){return Yt(this,u).get(u)},Nd.prototype.has=function(u){return Yt(this,u).has(u)},Nd.prototype.set=function(u,e){var d=Yt(this,u),n=d.size;return d.set(u,e),this.size+=d.size==n?0:1,this},Bd.prototype.add=Bd.prototype.push=function(u){return this.__data__.set(u,"__lodash_hash_undefined__"),this},Bd.prototype.has=function(u){return this.__data__.has(u)},Ld.prototype.clear=function(){this.__data__=new $d,this.size=0},Ld.prototype.delete=function(u){var e=this.__data__,d=e.delete(u);return this.size=e.size,d},Ld.prototype.get=function(u){return this.__data__.get(u)},Ld.prototype.has=function(u){return this.__data__.has(u)},Ld.prototype.set=function(u,e){var d=this.__data__;if(d instanceof $d){var n=d.__data__;if(!sd||n.length<199)return n.push([u,e]),this.size=++d.size,this;d=this.__data__=new Nd(n)}return d.set(u,e),this.size=d.size,this};var Xd=yt(cn),un=yt(fn,!0);function en(u,e){var d=!0;return Xd(u,(function(u,n,t){return d=!!e(u,n,t)})),d}function dn(u,e,d){for(var n=-1,t=u.length;++n0&&d(c)?e>1?tn(c,e-1,d,n,t):me(t,c):n||(t[t.length]=c)}return t}var rn=Et(),an=Et(!0);function cn(u,e){return u&&rn(u,e,gc)}function fn(u,e){return u&&an(u,e,gc)}function on(u,e){return oe(e,(function(e){return Ta(u[e])}))}function ln(u,e){for(var d=0,n=(e=ct(e,u)).length;null!=u&&de}function hn(u,e){return null!=u&&Iu.call(u,e)}function bn(u,e){return null!=u&&e in hu(u)}function vn(u,e,d){for(var t=d?se:le,r=u[0].length,a=u.length,c=a,f=n(a),i=1/0,o=[];c--;){var l=u[c];c&&e&&(l=pe(l,Se(e))),i=ad(l.length,i),f[c]=!d&&(e||r>=120&&l.length>=120)?new Bd(c&&l):void 0}l=u[0];var s=-1,p=f[0];u:for(;++s=c)return f;var i=d[n];return f*("desc"==i?-1:1)}}return u.index-e.index}(u,e,d)}))}function $n(u,e,d){for(var n=-1,t=e.length,r={};++n-1;)c!==u&&Zu.call(c,f,1),Zu.call(u,f,1);return u}function Bn(u,e){for(var d=u?e.length:0,n=d-1;d--;){var t=e[d];if(d==n||t!==r){var r=t;ar(t)?Zu.call(u,t,1):Xn(u,t)}}return u}function Ln(u,e){return u+Xe(id()*(e-u+1))}function Pn(u,e){var d="";if(!u||e<1||e>9007199254740991)return d;do{e%2&&(d+=u),(e=Xe(e/2))&&(u+=u)}while(e);return d}function Mn(u,e){return Dr(mr(u,e,Gc),u+"")}function Tn(u){return Md(Ac(u))}function Rn(u,e){var d=Ac(u);return xr(d,Jd(e,0,d.length))}function Un(u,e,d,n){if(!za(u))return u;for(var t=-1,r=(e=ct(e,u)).length,a=r-1,c=u;null!=c&&++tr?0:r+e),(d=d>r?r:d)<0&&(d+=r),r=e>d?0:d-e>>>0,e>>>=0;for(var a=n(r);++t>>1,a=u[r];null!==a&&!Va(a)&&(d?a<=e:a=200){var i=e?null:Pt(u);if(i)return Ke(i);a=!1,t=je,f=new Bd}else f=e?[]:c;u:for(;++n=n?u:Gn(u,e,d)}var ot=Ze||function(u){return qu.clearTimeout(u)};function lt(u,e){if(e)return u.slice();var d=u.length,n=zu?zu(d):new u.constructor(d);return u.copy(n),n}function st(u){var e=new u.constructor(u.byteLength);return new Lu(e).set(new Lu(u)),e}function pt(u,e){var d=e?st(u.buffer):u.buffer;return new u.constructor(d,u.byteOffset,u.length)}function mt(u,e){if(u!==e){var d=void 0!==u,n=null===u,t=u==u,r=Va(u),a=void 0!==e,c=null===e,f=e==e,i=Va(e);if(!c&&!i&&!r&&u>e||r&&a&&f&&!c&&!i||n&&a&&f||!d&&f||!t)return 1;if(!n&&!r&&!i&&u1?d[t-1]:void 0,a=t>2?d[2]:void 0;for(r=u.length>3&&"function"==typeof r?(t--,r):void 0,a&&cr(d[0],d[1],a)&&(r=t<3?void 0:r,t=1),e=hu(e);++n-1?t[r?e[a]:a]:void 0}}function Ft(u){return Wt((function(e){var d=e.length,n=d,t=Sd.prototype.thru;for(u&&e.reverse();n--;){var a=e[n];if("function"!=typeof a)throw new _u(r);if(t&&!c&&"wrapper"==Jt(a))var c=new Sd([],!0)}for(n=c?n:d;++n1&&g.reverse(),l&&i<_&&(g.length=i),this&&this!==qu&&this instanceof v&&(w=b||wt(w)),w.apply(I,g)}}function kt(u,e){return function(d,n){return function(u,e,d,n){return cn(u,(function(u,t,r){e(n,d(u),t,r)})),n}(d,u,e(n),{})}}function St(u,e){return function(d,n){var t;if(void 0===d&&void 0===n)return e;if(void 0!==d&&(t=d),void 0!==n){if(void 0===t)return n;"string"==typeof d||"string"==typeof n?(d=Yn(d),n=Yn(n)):(d=Vn(d),n=Vn(n)),t=u(d,n)}return t}}function Ot(u){return Wt((function(e){return e=pe(e,Se(Vt())),Mn((function(d){var n=this;return u(e,(function(u){return re(u,n,d)}))}))}))}function jt(u,e){var d=(e=void 0===e?" ":Yn(e)).length;if(d<2)return d?Pn(e,u):e;var n=Pn(e,Qe(u/Ge(e)));return Te(e)?it(He(n),0,u).join(""):n.slice(0,u)}function $t(u){return function(e,d,t){return t&&"number"!=typeof t&&cr(e,d,t)&&(d=t=void 0),e=ec(e),void 0===d?(d=e,e=0):d=ec(d),function(u,e,d,t){for(var r=-1,a=rd(Qe((e-u)/(d||1)),0),c=n(a);a--;)c[t?a:++r]=u,u+=d;return c}(e,d,t=void 0===t?ec))return!1;var i=r.get(u);if(i&&r.get(e))return i==e;var o=-1,l=!0,s=2&d?new Bd:void 0;for(r.set(u,e),r.set(e,u);++o-1&&u%1==0&&u1?"& ":"")+e[n],e=e.join(d>2?", ":" "),u.replace(Y,"{\n/* [wrapped with "+e+"] */\n")}(n,function(u,e){return ce(c,(function(d){var n="_."+d[0];e&d[1]&&!le(u,n)&&u.push(n)})),u.sort()}(function(u){var e=u.match(Q);return e?e[1].split(X):[]}(n),d)))}function Er(u){var e=0,d=0;return function(){var n=cd(),t=16-(n-d);if(d=n,t>0){if(++e>=800)return arguments[0]}else e=0;return u.apply(void 0,arguments)}}function xr(u,e){var d=-1,n=u.length,t=n-1;for(e=void 0===e?n:e;++d1?u[e-1]:void 0;return d="function"==typeof d?(u.pop(),d):void 0,qr(u,d)}));function ua(u){var e=Fd(u);return e.__chain__=!0,e}function ea(u,e){return e(u)}var da=Wt((function(u){var e=u.length,d=e?u[0]:0,n=this.__wrapped__,t=function(e){return qd(e,u)};return!(e>1||this.__actions__.length)&&n instanceof Od&&ar(d)?((n=n.slice(d,+d+(e?1:0))).__actions__.push({func:ea,args:[t],thisArg:void 0}),new Sd(n,this.__chain__).thru((function(u){return e&&!u.length&&u.push(void 0),u}))):this.thru(t)}));var na=gt((function(u,e,d){Iu.call(u,d)?++u[d]:Hd(u,d,1)}));var ta=Ct(Or),ra=Ct(jr);function aa(u,e){return(ja(u)?ce:Xd)(u,Vt(e,3))}function ca(u,e){return(ja(u)?fe:un)(u,Vt(e,3))}var fa=gt((function(u,e,d){Iu.call(u,d)?u[d].push(e):Hd(u,d,[e])}));var ia=Mn((function(u,e,d){var t=-1,r="function"==typeof e,a=Na(u)?n(u.length):[];return Xd(u,(function(u){a[++t]=r?re(e,u,d):_n(u,e,d)})),a})),oa=gt((function(u,e,d){Hd(u,d,e)}));function la(u,e){return(ja(u)?pe:Fn)(u,Vt(e,3))}var sa=gt((function(u,e,d){u[d?0:1].push(e)}),(function(){return[[],[]]}));var pa=Mn((function(u,e){if(null==u)return[];var d=e.length;return d>1&&cr(u,e[0],e[1])?e=[]:d>2&&cr(e[0],e[1],e[2])&&(e=[e[0]]),jn(u,tn(e,1),[])})),ma=Ve||function(){return qu.Date.now()};function ha(u,e,d){return e=d?void 0:e,Tt(u,128,void 0,void 0,void 0,void 0,e=u&&null==e?u.length:e)}function ba(u,e){var d;if("function"!=typeof e)throw new _u(r);return u=dc(u),function(){return--u>0&&(d=e.apply(this,arguments)),u<=1&&(e=void 0),d}}var va=Mn((function(u,e,d){var n=1;if(d.length){var t=ze(d,Zt(va));n|=32}return Tt(u,n,e,d,t)})),_a=Mn((function(u,e,d){var n=3;if(d.length){var t=ze(d,Zt(_a));n|=32}return Tt(e,n,u,d,t)}));function ga(u,e,d){var n,t,a,c,f,i,o=0,l=!1,s=!1,p=!0;if("function"!=typeof u)throw new _u(r);function m(e){var d=n,r=t;return n=t=void 0,o=e,c=u.apply(r,d)}function h(u){return o=u,f=gr(v,e),l?m(u):c}function b(u){var d=u-i;return void 0===i||d>=e||d<0||s&&u-o>=a}function v(){var u=ma();if(b(u))return _(u);f=gr(v,function(u){var d=e-(u-i);return s?ad(d,a-(u-o)):d}(u))}function _(u){return f=void 0,p&&n?m(u):(n=t=void 0,c)}function g(){var u=ma(),d=b(u);if(n=arguments,t=this,i=u,d){if(void 0===f)return h(i);if(s)return ot(f),f=gr(v,e),m(i)}return void 0===f&&(f=gr(v,e)),c}return e=tc(e)||0,za(d)&&(l=!!d.leading,a=(s="maxWait"in d)?rd(tc(d.maxWait)||0,e):a,p="trailing"in d?!!d.trailing:p),g.cancel=function(){void 0!==f&&ot(f),o=0,n=i=t=f=void 0},g.flush=function(){return void 0===f?c:_(ma())},g}var Da=Mn((function(u,e){return Yd(u,1,e)})),ya=Mn((function(u,e,d){return Yd(u,tc(e)||0,d)}));function Ea(u,e){if("function"!=typeof u||null!=e&&"function"!=typeof e)throw new _u(r);var d=function(){var n=arguments,t=e?e.apply(this,n):n[0],r=d.cache;if(r.has(t))return r.get(t);var a=u.apply(this,n);return d.cache=r.set(t,a)||r,a};return d.cache=new(Ea.Cache||Nd),d}function xa(u){if("function"!=typeof u)throw new _u(r);return function(){var e=arguments;switch(e.length){case 0:return!u.call(this);case 1:return!u.call(this,e[0]);case 2:return!u.call(this,e[0],e[1]);case 3:return!u.call(this,e[0],e[1],e[2])}return!u.apply(this,e)}}Ea.Cache=Nd;var Ia=ft((function(u,e){var d=(e=1==e.length&&ja(e[0])?pe(e[0],Se(Vt())):pe(tn(e,1),Se(Vt()))).length;return Mn((function(n){for(var t=-1,r=ad(n.length,d);++t=e})),Oa=gn(function(){return arguments}())?gn:function(u){return Ka(u)&&Iu.call(u,"callee")&&!Ju.call(u,"callee")},ja=n.isArray,$a=Xu?Se(Xu):function(u){return Ka(u)&&pn(u)==x};function Na(u){return null!=u&&Ua(u.length)&&!Ta(u)}function Ba(u){return Ka(u)&&Na(u)}var La=ed||tf,Pa=ue?Se(ue):function(u){return Ka(u)&&pn(u)==l};function Ma(u){if(!Ka(u))return!1;var e=pn(u);return e==s||"[object DOMException]"==e||"string"==typeof u.message&&"string"==typeof u.name&&!Ha(u)}function Ta(u){if(!za(u))return!1;var e=pn(u);return e==p||e==m||"[object AsyncFunction]"==e||"[object Proxy]"==e}function Ra(u){return"number"==typeof u&&u==dc(u)}function Ua(u){return"number"==typeof u&&u>-1&&u%1==0&&u<=9007199254740991}function za(u){var e=typeof u;return null!=u&&("object"==e||"function"==e)}function Ka(u){return null!=u&&"object"==typeof u}var Wa=ee?Se(ee):function(u){return Ka(u)&&dr(u)==h};function Ga(u){return"number"==typeof u||Ka(u)&&pn(u)==b}function Ha(u){if(!Ka(u)||pn(u)!=v)return!1;var e=Gu(u);if(null===e)return!0;var d=Iu.call(e,"constructor")&&e.constructor;return"function"==typeof d&&d instanceof d&&xu.call(d)==Au}var qa=de?Se(de):function(u){return Ka(u)&&pn(u)==_};var Ja=ne?Se(ne):function(u){return Ka(u)&&dr(u)==g};function Za(u){return"string"==typeof u||!ja(u)&&Ka(u)&&pn(u)==D}function Va(u){return"symbol"==typeof u||Ka(u)&&pn(u)==y}var Ya=te?Se(te):function(u){return Ka(u)&&Ua(u.length)&&!!Ru[pn(u)]};var Qa=Nt(Cn),Xa=Nt((function(u,e){return u<=e}));function uc(u){if(!u)return[];if(Na(u))return Za(u)?He(u):vt(u);if(Qu&&u[Qu])return function(u){for(var e,d=[];!(e=u.next()).done;)d.push(e.value);return d}(u[Qu]());var e=dr(u);return(e==h?Re:e==g?Ke:Ac)(u)}function ec(u){return u?(u=tc(u))===1/0||u===-1/0?17976931348623157e292*(u<0?-1:1):u==u?u:0:0===u?u:0}function dc(u){var e=ec(u),d=e%1;return e==e?d?e-d:e:0}function nc(u){return u?Jd(dc(u),0,4294967295):0}function tc(u){if("number"==typeof u)return u;if(Va(u))return NaN;if(za(u)){var e="function"==typeof u.valueOf?u.valueOf():u;u=za(e)?e+"":e}if("string"!=typeof u)return 0===u?u:+u;u=u.replace(J,"");var d=ru.test(u);return d||cu.test(u)?Wu(u.slice(2),d?2:8):tu.test(u)?NaN:+u}function rc(u){return _t(u,Dc(u))}function ac(u){return null==u?"":Yn(u)}var cc=Dt((function(u,e){if(lr(e)||Na(e))_t(e,gc(e),u);else for(var d in e)Iu.call(e,d)&&zd(u,d,e[d])})),fc=Dt((function(u,e){_t(e,Dc(e),u)})),ic=Dt((function(u,e,d,n){_t(e,Dc(e),u,n)})),oc=Dt((function(u,e,d,n){_t(e,gc(e),u,n)})),lc=Wt(qd);var sc=Mn((function(u,e){u=hu(u);var d=-1,n=e.length,t=n>2?e[2]:void 0;for(t&&cr(e[0],e[1],t)&&(n=1);++d1),e})),_t(u,Ht(u),d),n&&(d=Zd(d,7,zt));for(var t=e.length;t--;)Xn(d,e[t]);return d}));var Ic=Wt((function(u,e){return null==u?{}:function(u,e){return $n(u,e,(function(e,d){return hc(u,d)}))}(u,e)}));function wc(u,e){if(null==u)return{};var d=pe(Ht(u),(function(u){return[u]}));return e=Vt(e),$n(u,d,(function(u,d){return e(u,d[0])}))}var Cc=Mt(gc),Fc=Mt(Dc);function Ac(u){return null==u?[]:Oe(u,gc(u))}var kc=It((function(u,e,d){return e=e.toLowerCase(),u+(d?Sc(e):e)}));function Sc(u){return Mc(ac(u).toLowerCase())}function Oc(u){return(u=ac(u))&&u.replace(iu,Le).replace($u,"")}var jc=It((function(u,e,d){return u+(d?"-":"")+e.toLowerCase()})),$c=It((function(u,e,d){return u+(d?" ":"")+e.toLowerCase()})),Nc=xt("toLowerCase");var Bc=It((function(u,e,d){return u+(d?"_":"")+e.toLowerCase()}));var Lc=It((function(u,e,d){return u+(d?" ":"")+Mc(e)}));var Pc=It((function(u,e,d){return u+(d?" ":"")+e.toUpperCase()})),Mc=xt("toUpperCase");function Tc(u,e,d){return u=ac(u),void 0===(e=d?void 0:e)?function(u){return Pu.test(u)}(u)?function(u){return u.match(Bu)||[]}(u):function(u){return u.match(uu)||[]}(u):u.match(e)||[]}var Rc=Mn((function(u,e){try{return re(u,void 0,e)}catch(d){return Ma(d)?d:new su(d)}})),Uc=Wt((function(u,e){return ce(e,(function(e){e=wr(e),Hd(u,e,va(u[e],u))})),u}));function zc(u){return function(){return u}}var Kc=Ft(),Wc=Ft(!0);function Gc(u){return u}function Hc(u){return xn("function"==typeof u?u:Zd(u,1))}var qc=Mn((function(u,e){return function(d){return _n(d,u,e)}})),Jc=Mn((function(u,e){return function(d){return _n(u,d,e)}}));function Zc(u,e,d){var n=gc(e),t=on(e,n);null!=d||za(e)&&(t.length||!n.length)||(d=e,e=u,u=this,t=on(e,gc(e)));var r=!(za(d)&&"chain"in d&&!d.chain),a=Ta(u);return ce(t,(function(d){var n=e[d];u[d]=n,a&&(u.prototype[d]=function(){var e=this.__chain__;if(r||e){var d=u(this.__wrapped__),t=d.__actions__=vt(this.__actions__);return t.push({func:n,args:arguments,thisArg:u}),d.__chain__=e,d}return n.apply(u,me([this.value()],arguments))})})),u}function Vc(){}var Yc=Ot(pe),Qc=Ot(ie),Xc=Ot(ve);function uf(u){return fr(u)?we(wr(u)):function(u){return function(e){return ln(e,u)}}(u)}var ef=$t(),df=$t(!0);function nf(){return[]}function tf(){return!1}var rf=St((function(u,e){return u+e}),0),af=Lt("ceil"),cf=St((function(u,e){return u/e}),1),ff=Lt("floor");var of,lf=St((function(u,e){return u*e}),1),sf=Lt("round"),pf=St((function(u,e){return u-e}),0);return Fd.after=function(u,e){if("function"!=typeof e)throw new _u(r);return u=dc(u),function(){if(--u<1)return e.apply(this,arguments)}},Fd.ary=ha,Fd.assign=cc,Fd.assignIn=fc,Fd.assignInWith=ic,Fd.assignWith=oc,Fd.at=lc,Fd.before=ba,Fd.bind=va,Fd.bindAll=Uc,Fd.bindKey=_a,Fd.castArray=function(){if(!arguments.length)return[];var u=arguments[0];return ja(u)?u:[u]},Fd.chain=ua,Fd.chunk=function(u,e,d){e=(d?cr(u,e,d):void 0===e)?1:rd(dc(e),0);var t=null==u?0:u.length;if(!t||e<1)return[];for(var r=0,a=0,c=n(Qe(t/e));rt?0:t+d),(n=void 0===n||n>t?t:dc(n))<0&&(n+=t),n=d>n?0:nc(n);d>>0)?(u=ac(u))&&("string"==typeof e||null!=e&&!qa(e))&&!(e=Yn(e))&&Te(u)?it(He(u),0,d):u.split(e,d):[]},Fd.spread=function(u,e){if("function"!=typeof u)throw new _u(r);return e=null==e?0:rd(dc(e),0),Mn((function(d){var n=d[e],t=it(d,0,e);return n&&me(t,n),re(u,this,t)}))},Fd.tail=function(u){var e=null==u?0:u.length;return e?Gn(u,1,e):[]},Fd.take=function(u,e,d){return u&&u.length?Gn(u,0,(e=d||void 0===e?1:dc(e))<0?0:e):[]},Fd.takeRight=function(u,e,d){var n=null==u?0:u.length;return n?Gn(u,(e=n-(e=d||void 0===e?1:dc(e)))<0?0:e,n):[]},Fd.takeRightWhile=function(u,e){return u&&u.length?et(u,Vt(e,3),!1,!0):[]},Fd.takeWhile=function(u,e){return u&&u.length?et(u,Vt(e,3)):[]},Fd.tap=function(u,e){return e(u),u},Fd.throttle=function(u,e,d){var n=!0,t=!0;if("function"!=typeof u)throw new _u(r);return za(d)&&(n="leading"in d?!!d.leading:n,t="trailing"in d?!!d.trailing:t),ga(u,e,{leading:n,maxWait:e,trailing:t})},Fd.thru=ea,Fd.toArray=uc,Fd.toPairs=Cc,Fd.toPairsIn=Fc,Fd.toPath=function(u){return ja(u)?pe(u,wr):Va(u)?[u]:vt(Ir(ac(u)))},Fd.toPlainObject=rc,Fd.transform=function(u,e,d){var n=ja(u),t=n||La(u)||Ya(u);if(e=Vt(e,4),null==d){var r=u&&u.constructor;d=t?n?new r:[]:za(u)&&Ta(r)?Ad(Gu(u)):{}}return(t?ce:cn)(u,(function(u,n,t){return e(d,u,n,t)})),d},Fd.unary=function(u){return ha(u,1)},Fd.union=Kr,Fd.unionBy=Wr,Fd.unionWith=Gr,Fd.uniq=function(u){return u&&u.length?Qn(u):[]},Fd.uniqBy=function(u,e){return u&&u.length?Qn(u,Vt(e,2)):[]},Fd.uniqWith=function(u,e){return e="function"==typeof e?e:void 0,u&&u.length?Qn(u,void 0,e):[]},Fd.unset=function(u,e){return null==u||Xn(u,e)},Fd.unzip=Hr,Fd.unzipWith=qr,Fd.update=function(u,e,d){return null==u?u:ut(u,e,at(d))},Fd.updateWith=function(u,e,d,n){return n="function"==typeof n?n:void 0,null==u?u:ut(u,e,at(d),n)},Fd.values=Ac,Fd.valuesIn=function(u){return null==u?[]:Oe(u,Dc(u))},Fd.without=Jr,Fd.words=Tc,Fd.wrap=function(u,e){return wa(at(e),u)},Fd.xor=Zr,Fd.xorBy=Vr,Fd.xorWith=Yr,Fd.zip=Qr,Fd.zipObject=function(u,e){return tt(u||[],e||[],zd)},Fd.zipObjectDeep=function(u,e){return tt(u||[],e||[],Un)},Fd.zipWith=Xr,Fd.entries=Cc,Fd.entriesIn=Fc,Fd.extend=fc,Fd.extendWith=ic,Zc(Fd,Fd),Fd.add=rf,Fd.attempt=Rc,Fd.camelCase=kc,Fd.capitalize=Sc,Fd.ceil=af,Fd.clamp=function(u,e,d){return void 0===d&&(d=e,e=void 0),void 0!==d&&(d=(d=tc(d))==d?d:0),void 0!==e&&(e=(e=tc(e))==e?e:0),Jd(tc(u),e,d)},Fd.clone=function(u){return Zd(u,4)},Fd.cloneDeep=function(u){return Zd(u,5)},Fd.cloneDeepWith=function(u,e){return Zd(u,5,e="function"==typeof e?e:void 0)},Fd.cloneWith=function(u,e){return Zd(u,4,e="function"==typeof e?e:void 0)},Fd.conformsTo=function(u,e){return null==e||Vd(u,e,gc(e))},Fd.deburr=Oc,Fd.defaultTo=function(u,e){return null==u||u!=u?e:u},Fd.divide=cf,Fd.endsWith=function(u,e,d){u=ac(u),e=Yn(e);var n=u.length,t=d=void 0===d?n:Jd(dc(d),0,n);return(d-=e.length)>=0&&u.slice(d,t)==e},Fd.eq=Aa,Fd.escape=function(u){return(u=ac(u))&&T.test(u)?u.replace(P,Pe):u},Fd.escapeRegExp=function(u){return(u=ac(u))&&q.test(u)?u.replace(H,"\\$&"):u},Fd.every=function(u,e,d){var n=ja(u)?ie:en;return d&&cr(u,e,d)&&(e=void 0),n(u,Vt(e,3))},Fd.find=ta,Fd.findIndex=Or,Fd.findKey=function(u,e){return ge(u,Vt(e,3),cn)},Fd.findLast=ra,Fd.findLastIndex=jr,Fd.findLastKey=function(u,e){return ge(u,Vt(e,3),fn)},Fd.floor=ff,Fd.forEach=aa,Fd.forEachRight=ca,Fd.forIn=function(u,e){return null==u?u:rn(u,Vt(e,3),Dc)},Fd.forInRight=function(u,e){return null==u?u:an(u,Vt(e,3),Dc)},Fd.forOwn=function(u,e){return u&&cn(u,Vt(e,3))},Fd.forOwnRight=function(u,e){return u&&fn(u,Vt(e,3))},Fd.get=mc,Fd.gt=ka,Fd.gte=Sa,Fd.has=function(u,e){return null!=u&&nr(u,e,hn)},Fd.hasIn=hc,Fd.head=Nr,Fd.identity=Gc,Fd.includes=function(u,e,d,n){u=Na(u)?u:Ac(u),d=d&&!n?dc(d):0;var t=u.length;return d<0&&(d=rd(t+d,0)),Za(u)?d<=t&&u.indexOf(e,d)>-1:!!t&&ye(u,e,d)>-1},Fd.indexOf=function(u,e,d){var n=null==u?0:u.length;if(!n)return-1;var t=null==d?0:dc(d);return t<0&&(t=rd(n+t,0)),ye(u,e,t)},Fd.inRange=function(u,e,d){return e=ec(e),void 0===d?(d=e,e=0):d=ec(d),function(u,e,d){return u>=ad(e,d)&&u=-9007199254740991&&u<=9007199254740991},Fd.isSet=Ja,Fd.isString=Za,Fd.isSymbol=Va,Fd.isTypedArray=Ya,Fd.isUndefined=function(u){return void 0===u},Fd.isWeakMap=function(u){return Ka(u)&&dr(u)==E},Fd.isWeakSet=function(u){return Ka(u)&&"[object WeakSet]"==pn(u)},Fd.join=function(u,e){return null==u?"":nd.call(u,e)},Fd.kebabCase=jc,Fd.last=Mr,Fd.lastIndexOf=function(u,e,d){var n=null==u?0:u.length;if(!n)return-1;var t=n;return void 0!==d&&(t=(t=dc(d))<0?rd(n+t,0):ad(t,n-1)),e==e?function(u,e,d){for(var n=d+1;n--;)if(u[n]===e)return n;return n}(u,e,t):De(u,xe,t,!0)},Fd.lowerCase=$c,Fd.lowerFirst=Nc,Fd.lt=Qa,Fd.lte=Xa,Fd.max=function(u){return u&&u.length?dn(u,Gc,mn):void 0},Fd.maxBy=function(u,e){return u&&u.length?dn(u,Vt(e,2),mn):void 0},Fd.mean=function(u){return Ie(u,Gc)},Fd.meanBy=function(u,e){return Ie(u,Vt(e,2))},Fd.min=function(u){return u&&u.length?dn(u,Gc,Cn):void 0},Fd.minBy=function(u,e){return u&&u.length?dn(u,Vt(e,2),Cn):void 0},Fd.stubArray=nf,Fd.stubFalse=tf,Fd.stubObject=function(){return{}},Fd.stubString=function(){return""},Fd.stubTrue=function(){return!0},Fd.multiply=lf,Fd.nth=function(u,e){return u&&u.length?On(u,dc(e)):void 0},Fd.noConflict=function(){return qu._===this&&(qu._=ku),this},Fd.noop=Vc,Fd.now=ma,Fd.pad=function(u,e,d){u=ac(u);var n=(e=dc(e))?Ge(u):0;if(!e||n>=e)return u;var t=(e-n)/2;return jt(Xe(t),d)+u+jt(Qe(t),d)},Fd.padEnd=function(u,e,d){u=ac(u);var n=(e=dc(e))?Ge(u):0;return e&&ne){var n=u;u=e,e=n}if(d||u%1||e%1){var t=id();return ad(u+t*(e-u+Ku("1e-"+((t+"").length-1))),e)}return Ln(u,e)},Fd.reduce=function(u,e,d){var n=ja(u)?he:Fe,t=arguments.length<3;return n(u,Vt(e,4),d,t,Xd)},Fd.reduceRight=function(u,e,d){var n=ja(u)?be:Fe,t=arguments.length<3;return n(u,Vt(e,4),d,t,un)},Fd.repeat=function(u,e,d){return e=(d?cr(u,e,d):void 0===e)?1:dc(e),Pn(ac(u),e)},Fd.replace=function(){var u=arguments,e=ac(u[0]);return u.length<3?e:e.replace(u[1],u[2])},Fd.result=function(u,e,d){var n=-1,t=(e=ct(e,u)).length;for(t||(t=1,u=void 0);++n9007199254740991)return[];var d=4294967295,n=ad(u,4294967295);u-=4294967295;for(var t=ke(n,e=Vt(e));++d=r)return u;var c=d-Ge(n);if(c<1)return n;var f=a?it(a,0,c).join(""):u.slice(0,c);if(void 0===t)return f+n;if(a&&(c+=f.length-c),qa(t)){if(u.slice(c).search(t)){var i,o=f;for(t.global||(t=bu(t.source,ac(nu.exec(t))+"g")),t.lastIndex=0;i=t.exec(o);)var l=i.index;f=f.slice(0,void 0===l?c:l)}}else if(u.indexOf(Yn(t),c)!=c){var s=f.lastIndexOf(t);s>-1&&(f=f.slice(0,s))}return f+n},Fd.unescape=function(u){return(u=ac(u))&&M.test(u)?u.replace(L,qe):u},Fd.uniqueId=function(u){var e=++wu;return ac(u)+e},Fd.upperCase=Pc,Fd.upperFirst=Mc,Fd.each=aa,Fd.eachRight=ca,Fd.first=Nr,Zc(Fd,(of={},cn(Fd,(function(u,e){Iu.call(Fd.prototype,e)||(of[e]=u)})),of),{chain:!1}),Fd.VERSION="4.17.15",ce(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(u){Fd[u].placeholder=Fd})),ce(["drop","take"],(function(u,e){Od.prototype[u]=function(d){d=void 0===d?1:rd(dc(d),0);var n=this.__filtered__&&!e?new Od(this):this.clone();return n.__filtered__?n.__takeCount__=ad(d,n.__takeCount__):n.__views__.push({size:ad(d,4294967295),type:u+(n.__dir__<0?"Right":"")}),n},Od.prototype[u+"Right"]=function(e){return this.reverse()[u](e).reverse()}})),ce(["filter","map","takeWhile"],(function(u,e){var d=e+1,n=1==d||3==d;Od.prototype[u]=function(u){var e=this.clone();return e.__iteratees__.push({iteratee:Vt(u,3),type:d}),e.__filtered__=e.__filtered__||n,e}})),ce(["head","last"],(function(u,e){var d="take"+(e?"Right":"");Od.prototype[u]=function(){return this[d](1).value()[0]}})),ce(["initial","tail"],(function(u,e){var d="drop"+(e?"":"Right");Od.prototype[u]=function(){return this.__filtered__?new Od(this):this[d](1)}})),Od.prototype.compact=function(){return this.filter(Gc)},Od.prototype.find=function(u){return this.filter(u).head()},Od.prototype.findLast=function(u){return this.reverse().find(u)},Od.prototype.invokeMap=Mn((function(u,e){return"function"==typeof u?new Od(this):this.map((function(d){return _n(d,u,e)}))})),Od.prototype.reject=function(u){return this.filter(xa(Vt(u)))},Od.prototype.slice=function(u,e){u=dc(u);var d=this;return d.__filtered__&&(u>0||e<0)?new Od(d):(u<0?d=d.takeRight(-u):u&&(d=d.drop(u)),void 0!==e&&(d=(e=dc(e))<0?d.dropRight(-e):d.take(e-u)),d)},Od.prototype.takeRightWhile=function(u){return this.reverse().takeWhile(u).reverse()},Od.prototype.toArray=function(){return this.take(4294967295)},cn(Od.prototype,(function(u,e){var d=/^(?:filter|find|map|reject)|While$/.test(e),n=/^(?:head|last)$/.test(e),t=Fd[n?"take"+("last"==e?"Right":""):e],r=n||/^find/.test(e);t&&(Fd.prototype[e]=function(){var e=this.__wrapped__,a=n?[1]:arguments,c=e instanceof Od,f=a[0],i=c||ja(e),o=function(u){var e=t.apply(Fd,me([u],a));return n&&l?e[0]:e};i&&d&&"function"==typeof f&&1!=f.length&&(c=i=!1);var l=this.__chain__,s=!!this.__actions__.length,p=r&&!l,m=c&&!s;if(!r&&i){e=m?e:new Od(this);var h=u.apply(e,a);return h.__actions__.push({func:ea,args:[o],thisArg:void 0}),new Sd(h,l)}return p&&m?u.apply(this,a):(h=this.thru(o),p?n?h.value()[0]:h.value():h)})})),ce(["pop","push","shift","sort","splice","unshift"],(function(u){var e=gu[u],d=/^(?:push|sort|unshift)$/.test(u)?"tap":"thru",n=/^(?:pop|shift)$/.test(u);Fd.prototype[u]=function(){var u=arguments;if(n&&!this.__chain__){var t=this.value();return e.apply(ja(t)?t:[],u)}return this[d]((function(d){return e.apply(ja(d)?d:[],u)}))}})),cn(Od.prototype,(function(u,e){var d=Fd[e];if(d){var n=d.name+"";Iu.call(_d,n)||(_d[n]=[]),_d[n].push({name:e,func:d})}})),_d[At(void 0,2).name]=[{name:"wrapper",func:void 0}],Od.prototype.clone=function(){var u=new Od(this.__wrapped__);return u.__actions__=vt(this.__actions__),u.__dir__=this.__dir__,u.__filtered__=this.__filtered__,u.__iteratees__=vt(this.__iteratees__),u.__takeCount__=this.__takeCount__,u.__views__=vt(this.__views__),u},Od.prototype.reverse=function(){if(this.__filtered__){var u=new Od(this);u.__dir__=-1,u.__filtered__=!0}else(u=this.clone()).__dir__*=-1;return u},Od.prototype.value=function(){var u=this.__wrapped__.value(),e=this.__dir__,d=ja(u),n=e<0,t=d?u.length:0,r=function(u,e,d){var n=-1,t=d.length;for(;++n=this.__values__.length;return{done:u,value:u?void 0:this.__values__[this.__index__++]}},Fd.prototype.plant=function(u){for(var e,d=this;d instanceof kd;){var n=Fr(d);n.__index__=0,n.__values__=void 0,e?t.__wrapped__=n:e=n;var t=n;d=d.__wrapped__}return t.__wrapped__=u,e},Fd.prototype.reverse=function(){var u=this.__wrapped__;if(u instanceof Od){var e=u;return this.__actions__.length&&(e=new Od(this)),(e=e.reverse()).__actions__.push({func:ea,args:[zr],thisArg:void 0}),new Sd(e,this.__chain__)}return this.thru(zr)},Fd.prototype.toJSON=Fd.prototype.valueOf=Fd.prototype.value=function(){return dt(this.__wrapped__,this.__actions__)},Fd.prototype.first=Fd.prototype.head,Qu&&(Fd.prototype[Qu]=function(){return this}),Fd}();qu._=Je,void 0===(t=function(){return Je}.call(e,d,e,n))||(n.exports=t)}).call(this)}).call(this,d(76),d(496)(u))},494:function(u,e,d){"use strict";var n=d(0),t=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});e.a=t},495:function(u,e,d){"use strict";d.d(e,"a",(function(){return r}));d(77),d(513),d(478),d(78);var n=d(515),t=d.n(n);function r(u,e){var d=new t.a;return u.map((function(u){var n=u;return"string"==typeof u&&(n={label:u,permalink:"/blog/tags/"+d.slug(u)}),function(u,e){var d=u.label.split(": ",2),n=d[0],t=d[1],r="primary";switch(e){case"blog":case"guides":r=function(u){switch(u){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(n)}return{category:n,count:u.count,label:u.label,permalink:u.permalink,style:r,value:t}}(n,e)}))}},496:function(u,e){u.exports=function(u){return u.webpackPolyfill||(u.deprecate=function(){},u.paths=[],u.children||(u.children=[]),Object.defineProperty(u,"loaded",{enumerable:!0,get:function(){return u.l}}),Object.defineProperty(u,"id",{enumerable:!0,get:function(){return u.i}}),u.webpackPolyfill=1),u}},505:function(u,e,d){var n=d(30),t=d(54),r=d(27),a=d(26),c=d(506);u.exports=function(u,e){var d=1==u,f=2==u,i=3==u,o=4==u,l=6==u,s=5==u||l,p=e||c;return function(e,c,m){for(var h,b,v=r(e),_=t(v),g=n(c,m,3),D=a(_.length),y=0,E=d?p(e,D):f?p(e,0):void 0;D>y;y++)if((s||y in _)&&(b=g(h=_[y],y,v),u))if(d)E[y]=b;else if(b)switch(u){case 3:return!0;case 5:return h;case 6:return y;case 2:E.push(h)}else if(o)return!1;return l?-1:i||o?o:E}}},506:function(u,e,d){var n=d(507);u.exports=function(u,e){return new(n(u))(e)}},507:function(u,e,d){var n=d(13),t=d(508),r=d(2)("species");u.exports=function(u){var e;return t(u)&&("function"!=typeof(e=u.constructor)||e!==Array&&!t(e.prototype)||(e=void 0),n(e)&&null===(e=e[r])&&(e=void 0)),void 0===e?Array:e}},508:function(u,e,d){var n=d(23);u.exports=Array.isArray||function(u){return"Array"==n(u)}},514:function(u,e,d){"use strict";var n=d(0),t=d.n(n),r=d(470),a=d(463),c=d.n(a);e.a=function(u){var e=u.count,d=u.label,n=u.permalink,a=u.style,f=u.value,i=u.valueOnly;return t.a.createElement(r.a,{to:n+"/",className:c()("badge","badge--rounded","badge--"+a)},i?f:d,e&&t.a.createElement(t.a.Fragment,null," (",e,")"))}},515:function(u,e,d){var n=d(516);u.exports=c;var t=Object.hasOwnProperty,r=/\s/g,a=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function c(){if(!(this instanceof c))return new c;this.reset()}function f(u,e){return"string"!=typeof u?"":(e||(u=u.toLowerCase()),u.trim().replace(a,"").replace(n(),"").replace(r,"-"))}c.prototype.slug=function(u,e){for(var d=f(u,!0===e),n=d;t.call(this.occurrences,d);)this.occurrences[n]++,d=n+"-"+this.occurrences[n];return this.occurrences[d]=0,d},c.prototype.reset=function(){this.occurrences=Object.create(null)},c.slug=f},516:function(u,e){u.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},521:function(u,e,d){"use strict";const n=d(533),t=u=>{if("string"!=typeof u)throw new TypeError("Expected a string");return u=(u=(u=n(u)).toLowerCase().replace(/[_-]+/g," ").replace(/\s{2,}/g," ").trim()).charAt(0).toUpperCase()+u.slice(1)};u.exports=t,u.exports.default=t},533:function(u,e,d){"use strict";const n=d(534);u.exports=(u,e)=>{if("string"!=typeof u)throw new TypeError("Expected a string");e=void 0===e?"_":e;const d=n("([\\p{Ll}\\d])(\\p{Lu})","g"),t=n("(\\p{Lu}+)(\\p{Lu}[\\p{Ll}\\d]+)","g");return u.replace(d,`$1${e}$2`).replace(t,`$1${e}$2`).toLowerCase()}},534:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=l(d(535)),t=l(d(536)),r=l(d(537)),a=l(d(538)),c=l(d(539)),f=l(d(540)),i=l(d(541)),o=l(d(542));function l(u){return u&&u.__esModule?u:{default:u}}(0,t.default)(n.default),(0,r.default)(n.default),(0,a.default)(n.default),(0,c.default)(n.default),(0,f.default)(n.default),(0,i.default)(n.default),(0,o.default)(n.default),e.default=n.default,u.exports=e.default},535:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n={astral:!1},t={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},r={},a={},c={},f=[],i={default:/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,class:/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},o=/\$(?:{([\w$]+)}|<([\w$]+)>|(\d\d?|[\s\S]))/g,l=void 0===t.exec.call(/()??/,"")[1],s=void 0!==/x/.flags,p={}.toString;function m(u){var e=!0;try{new RegExp("",u)}catch(d){e=!1}return e}var h=m("u"),b=m("y"),v={g:!0,i:!0,m:!0,u:h,y:b};function _(u,e,d,n,t){var r=void 0;if(u.xregexp={captureNames:e},t)return u;if(u.__proto__)u.__proto__=O.prototype;else for(r in O.prototype)u[r]=O.prototype[r];return u.xregexp.source=d,u.xregexp.flags=n?n.split("").sort().join(""):n,u}function g(u){return t.replace.call(u,/([\s\S])(?=[\s\S]*\1)/g,"")}function D(u,e){if(!O.isRegExp(u))throw new TypeError("Type RegExp expected");var d=u.xregexp||{},n=function(u){return s?u.flags:t.exec.call(/\/([a-z]*)$/i,RegExp.prototype.toString.call(u))[1]}(u),r="",a="",c=null,f=null;return(e=e||{}).removeG&&(a+="g"),e.removeY&&(a+="y"),a&&(n=t.replace.call(n,new RegExp("["+a+"]+","g"),"")),e.addG&&(r+="g"),e.addY&&(r+="y"),r&&(n=g(n+r)),e.isInternalOnly||(void 0!==d.source&&(c=d.source),null!=d.flags&&(f=r?g(d.flags+r):d.flags)),u=_(new RegExp(e.source||u.source,n),function(u){return!(!u.xregexp||!u.xregexp.captureNames)}(u)?d.captureNames.slice(0):null,c,f,e.isInternalOnly)}function y(u){return parseInt(u,16)}function E(u,e,d){return"("===u.input[u.index-1]||")"===u.input[u.index+u[0].length]||function(u,e,d){return t.test.call(-1!==d.indexOf("x")?/^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/,u.slice(e))}(u.input,u.index+u[0].length,d)?"":"(?:)"}function x(u){return parseInt(u,10).toString(16)}function I(u,e){return p.call(u)==="[object "+e+"]"}function w(u){for(;u.length<4;)u="0"+u;return u}function C(u){var e={};return I(u,"String")?(O.forEach(u,/[^\s,]+/,(function(u){e[u]=!0})),e):u}function F(u){if(!/^[\w$]$/.test(u))throw new Error("Flag must be a single character A-Za-z0-9_$");v[u]=!0}function A(u,e,d,n,t){for(var r=f.length,a=u[d],c=null,i=void 0,o=void 0;r--;)if(!((o=f[r]).leadChar&&o.leadChar!==a||o.scope!==n&&"all"!==o.scope||o.flag&&-1===e.indexOf(o.flag))&&(i=O.exec(u,o.regex,d,"sticky"))){c={matchLength:i[0].length,output:o.handler.call(t,i,n,e),reparse:o.reparse};break}return c}function k(u){n.astral=u}function S(u){if(null==u)throw new TypeError("Cannot convert null or undefined to object");return u}function O(u,e){if(O.isRegExp(u)){if(void 0!==e)throw new TypeError("Cannot supply flags when copying a RegExp");return D(u)}if(u=void 0===u?"":String(u),e=void 0===e?"":String(e),O.isInstalled("astral")&&-1===e.indexOf("A")&&(e+="A"),c[u]||(c[u]={}),!c[u][e]){for(var d={hasNamedCapture:!1,captureNames:[]},n="default",r="",a=0,f=void 0,o=function(u,e){var d=void 0;if(g(e)!==e)throw new SyntaxError("Invalid duplicate regex flag "+e);for(u=t.replace.call(u,/^\(\?([\w$]+)\)/,(function(u,d){if(t.test.call(/[gy]/,d))throw new SyntaxError("Cannot use flag g or y in mode modifier "+u);return e=g(e+d),""})),d=0;d"}else if(d)return"\\"+(+d+a);return u}if(!I(u,"Array")||!u.length)throw new TypeError("Must provide a nonempty array of patterns to merge");for(var i=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,o=[],l=void 0,s=0;s1&&-1!==d.indexOf("")){var n=D(this,{removeG:!0,isInternalOnly:!0});t.replace.call(String(u).slice(d.index),n,(function(){for(var u=arguments.length,e=Array(u),n=0;nd.index&&(this.lastIndex=d.index)}return this.global||(this.lastIndex=e),d},r.test=function(u){return!!r.exec.call(this,u)},r.match=function(u){if(O.isRegExp(u)){if(u.global){var e=t.match.apply(this,arguments);return u.lastIndex=0,e}}else u=new RegExp(u);return r.exec.call(u,S(this))},r.replace=function(u,e){var d=O.isRegExp(u),n=void 0,r=void 0,a=void 0;return d?(u.xregexp&&(r=u.xregexp.captureNames),n=u.lastIndex):u+="",a=I(e,"Function")?t.replace.call(String(this),u,(function(){for(var n=arguments.length,t=Array(n),a=0;ad.length-3)throw new SyntaxError("Backreference to undefined group "+u);return d[t]||""}throw new SyntaxError("Invalid token "+u)}})),d&&(u.global?u.lastIndex=0:u.lastIndex=n),a},r.split=function(u,e){if(!O.isRegExp(u))return t.split.apply(this,arguments);var d=String(this),n=[],r=u.lastIndex,a=0,c=void 0;return e=(void 0===e?-1:e)>>>0,O.forEach(d,u,(function(u){u.index+u[0].length>a&&(n.push(d.slice(a,u.index)),u.length>1&&u.indexe?n.slice(0,e):n},O.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,(function(u,e){if("B"===u[1]&&"default"===e)return u[0];throw new SyntaxError("Invalid escape "+u[0])}),{scope:"all",leadChar:"\\"}),O.addToken(/\\u{([\dA-Fa-f]+)}/,(function(u,e,d){var n=y(u[1]);if(n>1114111)throw new SyntaxError("Invalid Unicode code point "+u[0]);if(n<=65535)return"\\u"+w(x(n));if(h&&-1!==d.indexOf("u"))return u[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u")}),{scope:"all",leadChar:"\\"}),O.addToken(/\[(\^?)\]/,(function(u){return u[1]?"[\\s\\S]":"\\b\\B"}),{leadChar:"["}),O.addToken(/\(\?#[^)]*\)/,E,{leadChar:"("}),O.addToken(/\s+|#[^\n]*\n?/,E,{flag:"x"}),O.addToken(/\./,(function(){return"[\\s\\S]"}),{flag:"s",leadChar:"."}),O.addToken(/\\k<([\w$]+)>/,(function(u){var e=isNaN(u[1])?this.captureNames.indexOf(u[1])+1:+u[1],d=u.index+u[0].length;if(!e||e>this.captureNames.length)throw new SyntaxError("Backreference to undefined group "+u[0]);return"\\"+e+(d===u.input.length||isNaN(u.input[d])?"":"(?:)")}),{leadChar:"\\"}),O.addToken(/\\(\d+)/,(function(u,e){if(!("default"===e&&/^[1-9]/.test(u[1])&&+u[1]<=this.captureNames.length)&&"0"!==u[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group "+u[0]);return u[0]}),{scope:"all",leadChar:"\\"}),O.addToken(/\(\?P?<([\w$]+)>/,(function(u){if(!isNaN(u[1]))throw new SyntaxError("Cannot use integer as capture name "+u[0]);if("length"===u[1]||"__proto__"===u[1])throw new SyntaxError("Cannot use reserved word as capture name "+u[0]);if(-1!==this.captureNames.indexOf(u[1]))throw new SyntaxError("Cannot use same name for multiple groups "+u[0]);return this.captureNames.push(u[1]),this.hasNamedCapture=!0,"("}),{leadChar:"("}),O.addToken(/\((?!\?)/,(function(u,e,d){return-1!==d.indexOf("n")?"(?:":(this.captureNames.push(null),"(")}),{optionalFlags:"n",leadChar:"("}),e.default=O,u.exports=e.default},536:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){var e=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,d=u.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,e],"g",{conjunction:"or"});function n(u){var e=/^(?:\(\?:\))*\^/,d=/\$(?:\(\?:\))*$/;return e.test(u)&&d.test(u)&&d.test(u.replace(/\\[\s\S]/g,""))?u.replace(e,"").replace(d,""):u}function t(e,d){var n=d?"x":"";return u.isRegExp(e)?e.xregexp&&e.xregexp.captureNames?e:u(e.source,n):u(e,n)}function r(e){return e instanceof RegExp?e:u.escape(e)}function a(u,e,d){return u["subpattern"+d]=e,u}function c(u,e,d){return u+(e1?n-1:0),f=1;f"):f="(?:",h=m,""+f+o[a].pattern.replace(e,(function(u,e,d){if(e){if(c=o[a].names[m-h],++m,c)return"(?<"+c+">"}else if(d)return i=+d-1,o[a].names[i]?"\\k<"+o[a].names[i]+">":"\\"+(+d+h);return u}))+")"}if(t){if(c=_[b],v[++b]=++m,c)return"(?<"+c+">"}else if(r)return _[i=+r-1]?"\\k<"+_[i]+">":"\\"+v[+r];return u}));return u(g,c)}},u.exports=e.default},537:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){function e(u,e,d,n){return{name:u,value:e,start:d,end:n}}u.matchRecursive=function(d,n,t,r,a){a=a||{};var c=-1!==(r=r||"").indexOf("g"),f=-1!==r.indexOf("y"),i=r.replace(/y/g,""),o=a.escapeChar,l=a.valueNames,s=[],p=0,m=0,h=0,b=0,v=void 0,_=void 0,g=void 0,D=void 0,y=void 0;if(n=u(n,i),t=u(t,i),o){if(o.length>1)throw new Error("Cannot use more than one escape character");o=u.escape(o),y=new RegExp("(?:"+o+"[\\S\\s]|(?:(?!"+u.union([n,t],"",{conjunction:"or"}).source+")[^"+o+"])+)+",r.replace(/[^imu]+/g,""))}for(;;){if(o&&(h+=(u.exec(d,y,h,"sticky")||[""])[0].length),g=u.exec(d,n,h),D=u.exec(d,t,h),g&&D&&(g.index<=D.index?D=null:g=null),g||D)h=(m=(g||D).index)+(g||D)[0].length;else if(!p)break;if(f&&!p&&m>b)break;if(g)p||(v=m,_=h),++p;else{if(!D||!p)throw new Error("Unbalanced delimiter found in string");if(!--p&&(l?(l[0]&&v>b&&s.push(e(l[0],d.slice(b,v),b,v)),l[1]&&s.push(e(l[1],d.slice(v,_),v,_)),l[2]&&s.push(e(l[2],d.slice(_,m),_,m)),l[3]&&s.push(e(l[3],d.slice(m,h),m,h))):s.push(d.slice(_,m)),b=h,!c))break}m===h&&++h}return c&&!f&&l&&l[0]&&d.length>b&&s.push(e(l[0],d.slice(b),b,d.length)),s}},u.exports=e.default},538:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){var e={},d=u._dec,n=u._hex,t=u._pad4;function r(u){return u.replace(/[- _]+/g,"").toLowerCase()}function a(u){var e=/^\\[xu](.+)/.exec(u);return e?d(e[1]):u.charCodeAt("\\"===u[0]?1:0)}function c(d){var r,c,f;return e[d]["b!"]||(e[d]["b!"]=(r=e[d].bmp,c="",f=-1,u.forEach(r,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,(function(u){var e=a(u[1]);e>f+1&&(c+="\\u"+t(n(f+1)),e>f+2&&(c+="-\\u"+t(n(e-1)))),f=a(u[2]||u[1])})),f<65535&&(c+="\\u"+t(n(f+1)),f<65534&&(c+="-\\uFFFF")),c))}function f(u,d){var n=d?"a!":"a=";return e[u][n]||(e[u][n]=function(u,d){var n=e[u],t="";return n.bmp&&!n.isBmpLast&&(t="["+n.bmp+"]"+(n.astral?"|":"")),n.astral&&(t+=n.astral),n.isBmpLast&&n.bmp&&(t+=(n.astral?"|":"")+"["+n.bmp+"]"),d?"(?:(?!"+t+")(?:[\ud800-\udbff][\udc00-\udfff]|[\0-\uffff]))":"(?:"+t+")"}(u,d))}u.addToken(/\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/,(function(u,d,n){var t="P"===u[1]||!!u[2],a=-1!==n.indexOf("A"),i=r(u[4]||u[3]),o=e[i];if("P"===u[1]&&u[2])throw new SyntaxError("Invalid double negation "+u[0]);if(!e.hasOwnProperty(i))throw new SyntaxError("Unknown Unicode token "+u[0]);if(o.inverseOf){if(i=r(o.inverseOf),!e.hasOwnProperty(i))throw new ReferenceError("Unicode token missing data "+u[0]+" -> "+o.inverseOf);o=e[i],t=!t}if(!o.bmp&&!a)throw new SyntaxError("Astral mode required for Unicode token "+u[0]);if(a){if("class"===d)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");return f(i,t)}return"class"===d?t?c(i):o.bmp:(t?"[^":"[")+o.bmp+"]"}),{scope:"all",optionalFlags:"A",leadChar:"\\"}),u.addUnicodeData=function(d){for(var n=void 0,t=0;t\\x5E`\\x7C~\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20be\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83b[\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\x24\xa2-\xa5\u058f\u060b\u09f2\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20be\ua838\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\x5E`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u309b\u309c\ua700-\ua716\ua720\ua721\ua789\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3",astral:"\ud83c[\udffb-\udfff]"},{name:"Sm",alias:"Math_Symbol",bmp:"\\x2B<->\\x7C~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec",astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"\xa6\xa9\xae\xb0\u0482\u058d\u058e\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u214a\u214c\u214d\u214f\u218a\u218b\u2195-\u2199\u219c-\u219f\u21a1\u21a2\u21a4\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udffa]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Z",alias:"Separator",bmp:" \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:" \xa0\u1680\u2000-\u200a\u202f\u205f\u3000"}])},u.exports=e.default},541:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){if(!u.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");var e=[{name:"ASCII",bmp:"\0-\x7f"},{name:"Alphabetic",bmp:"A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0345\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05b0-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0657\u0659-\u065f\u066e-\u06d3\u06d5-\u06dc\u06e1-\u06e8\u06ed-\u06ef\u06fa-\u06fc\u06ff\u0710-\u073f\u074d-\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0817\u081a-\u082c\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08df\u08e3-\u08e9\u08f0-\u093b\u093d-\u094c\u094e-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c4\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac5\u0ac7-\u0ac9\u0acb\u0acc\u0ad0\u0ae0-\u0ae3\u0af9\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d-\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4c\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccc\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e46\u0e4d\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ecd\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f71-\u0f81\u0f88-\u0f97\u0f99-\u0fbc\u1000-\u1036\u1038\u103b-\u103f\u1050-\u1062\u1065-\u1068\u106e-\u1086\u108e\u109c\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135f\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17b3\u17b6-\u17c8\u17d7\u17dc\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u1938\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a61-\u1a74\u1aa7\u1b00-\u1b33\u1b35-\u1b43\u1b45-\u1b4b\u1b80-\u1ba9\u1bac-\u1baf\u1bba-\u1be5\u1be7-\u1bf1\u1c00-\u1c35\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1de7-\u1df4\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua674-\ua67b\ua67f-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua827\ua840-\ua873\ua880-\ua8c3\ua8c5\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua92a\ua930-\ua952\ua960-\ua97c\ua980-\ua9b2\ua9b4-\ua9bf\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a\uaa7e-\uaabe\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc00-\udc45\udc82-\udcb8\udcd0-\udce8\udd00-\udd32\udd50-\udd72\udd76\udd80-\uddbf\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude34\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udee8\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d-\udf44\udf47\udf48\udf4b\udf4c\udf50\udf57\udf5d-\udf63]|\ud805[\udc00-\udc41\udc43-\udc45\udc47-\udc4a\udc80-\udcc1\udcc4\udcc5\udcc7\udd80-\uddb5\uddb8-\uddbe\uddd8-\udddd\ude00-\ude3e\ude40\ude44\ude80-\udeb5\udf00-\udf19\udf1d-\udf2a]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc3e\udc40\udc72-\udc8f\udc92-\udca7\udca9-\udcb6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf36\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9e]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd47]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Any",isBmpLast:!0,bmp:"\0-\uffff",astral:"[\ud800-\udbff][\udc00-\udfff]"},{name:"Default_Ignorable_Code_Point",bmp:"\xad\u034f\u061c\u115f\u1160\u17b4\u17b5\u180b-\u180e\u200b-\u200f\u202a-\u202e\u2060-\u206f\u3164\ufe00-\ufe0f\ufeff\uffa0\ufff0-\ufff8",astral:"\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|[\udb40-\udb43][\udc00-\udfff]"},{name:"Lowercase",bmp:"a-z\xaa\xb5\xba\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02b8\u02c0\u02c1\u02e0-\u02e4\u0345\u0371\u0373\u0377\u037a-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0561-\u0587\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1dbf\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u2071\u207f\u2090-\u209c\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2170-\u217f\u2184\u24d0-\u24e9\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7d\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b-\ua69d\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7b5\ua7b7\ua7f8-\ua7fa\uab30-\uab5a\uab5c-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a",astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud83a[\udd22-\udd43]"},{name:"Noncharacter_Code_Point",bmp:"\ufdd0-\ufdef\ufffe\uffff",astral:"[\ud83f\ud87f\ud8bf\ud8ff\ud93f\ud97f\ud9bf\ud9ff\uda3f\uda7f\udabf\udaff\udb3f\udb7f\udbbf\udbff][\udffe\udfff]"},{name:"Uppercase",bmp:"A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2160-\u216f\u2183\u24b6-\u24cf\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\uff21-\uff3a",astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]"},{name:"White_Space",bmp:"\t-\r \x85\xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"}];e.push({name:"Assigned",inverseOf:"Cn"}),u.addUnicodeData(e)},u.exports=e.default},542:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){if(!u.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");u.addUnicodeData([{name:"Adlam",astral:"\ud83a[\udd00-\udd4a\udd50-\udd59\udd5e\udd5f]"},{name:"Ahom",astral:"\ud805[\udf00-\udf19\udf1d-\udf2b\udf30-\udf3f]"},{name:"Anatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude46]"},{name:"Arabic",bmp:"\u0600-\u0604\u0606-\u060b\u060d-\u061a\u061e\u0620-\u063f\u0641-\u064a\u0656-\u066f\u0671-\u06dc\u06de-\u06ff\u0750-\u077f\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08e1\u08e3-\u08ff\ufb50-\ufbc1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfd\ufe70-\ufe74\ufe76-\ufefc",astral:"\ud803[\ude60-\ude7e]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb\udef0\udef1]"},{name:"Armenian",bmp:"\u0531-\u0556\u0559-\u055f\u0561-\u0587\u058a\u058d-\u058f\ufb13-\ufb17"},{name:"Avestan",astral:"\ud802[\udf00-\udf35\udf39-\udf3f]"},{name:"Balinese",bmp:"\u1b00-\u1b4b\u1b50-\u1b7c"},{name:"Bamum",bmp:"\ua6a0-\ua6f7",astral:"\ud81a[\udc00-\ude38]"},{name:"Bassa_Vah",astral:"\ud81a[\uded0-\udeed\udef0-\udef5]"},{name:"Batak",bmp:"\u1bc0-\u1bf3\u1bfc-\u1bff"},{name:"Bengali",bmp:"\u0980-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09fb"},{name:"Bhaiksuki",astral:"\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc45\udc50-\udc6c]"},{name:"Bopomofo",bmp:"\u02ea\u02eb\u3105-\u312d\u31a0-\u31ba"},{name:"Brahmi",astral:"\ud804[\udc00-\udc4d\udc52-\udc6f\udc7f]"},{name:"Braille",bmp:"\u2800-\u28ff"},{name:"Buginese",bmp:"\u1a00-\u1a1b\u1a1e\u1a1f"},{name:"Buhid",bmp:"\u1740-\u1753"},{name:"Canadian_Aboriginal",bmp:"\u1400-\u167f\u18b0-\u18f5"},{name:"Carian",astral:"\ud800[\udea0-\uded0]"},{name:"Caucasian_Albanian",astral:"\ud801[\udd30-\udd63\udd6f]"},{name:"Chakma",astral:"\ud804[\udd00-\udd34\udd36-\udd43]"},{name:"Cham",bmp:"\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f"},{name:"Cherokee",bmp:"\u13a0-\u13f5\u13f8-\u13fd\uab70-\uabbf"},{name:"Common",bmp:"\0-@\\x5B-`\\x7B-\xa9\xab-\xb9\xbb-\xbf\xd7\xf7\u02b9-\u02df\u02e5-\u02e9\u02ec-\u02ff\u0374\u037e\u0385\u0387\u0589\u0605\u060c\u061b\u061c\u061f\u0640\u06dd\u08e2\u0964\u0965\u0e3f\u0fd5-\u0fd8\u10fb\u16eb-\u16ed\u1735\u1736\u1802\u1803\u1805\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u2000-\u200b\u200e-\u2064\u2066-\u2070\u2074-\u207e\u2080-\u208e\u20a0-\u20be\u2100-\u2125\u2127-\u2129\u212c-\u2131\u2133-\u214d\u214f-\u215f\u2189-\u218b\u2190-\u23fe\u2400-\u2426\u2440-\u244a\u2460-\u27ff\u2900-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2e00-\u2e44\u2ff0-\u2ffb\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303c-\u303f\u309b\u309c\u30a0\u30fb\u30fc\u3190-\u319f\u31c0-\u31e3\u3220-\u325f\u327f-\u32cf\u3358-\u33ff\u4dc0-\u4dff\ua700-\ua721\ua788-\ua78a\ua830-\ua839\ua92e\ua9cf\uab5b\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe66\ufe68-\ufe6b\ufeff\uff01-\uff20\uff3b-\uff40\uff5b-\uff65\uff70\uff9e\uff9f\uffe0-\uffe6\uffe8-\uffee\ufff9-\ufffd",astral:"\ud800[\udd00-\udd02\udd07-\udd33\udd37-\udd3f\udd90-\udd9b\uddd0-\uddfc\udee1-\udefb]|\ud82f[\udca0-\udca3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd66\udd6a-\udd7a\udd83\udd84\udd8c-\udda9\uddae-\udde8\udf00-\udf56\udf60-\udf71]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udfcb\udfce-\udfff]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd00-\udd0c\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\uddff\ude01\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|\udb40[\udc01\udc20-\udc7f]"},{name:"Coptic",bmp:"\u03e2-\u03ef\u2c80-\u2cf3\u2cf9-\u2cff"},{name:"Cuneiform",astral:"\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc70-\udc74\udc80-\udd43]"},{name:"Cypriot",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f]"},{name:"Cyrillic",bmp:"\u0400-\u0484\u0487-\u052f\u1c80-\u1c88\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f"},{name:"Deseret",astral:"\ud801[\udc00-\udc4f]"},{name:"Devanagari",bmp:"\u0900-\u0950\u0953-\u0963\u0966-\u097f\ua8e0-\ua8fd"},{name:"Duployan",astral:"\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9c-\udc9f]"},{name:"Egyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]"},{name:"Elbasan",astral:"\ud801[\udd00-\udd27]"},{name:"Ethiopic",bmp:"\u1200-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u137c\u1380-\u1399\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e"},{name:"Georgian",bmp:"\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u10ff\u2d00-\u2d25\u2d27\u2d2d"},{name:"Glagolitic",bmp:"\u2c00-\u2c2e\u2c30-\u2c5e",astral:"\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]"},{name:"Gothic",astral:"\ud800[\udf30-\udf4a]"},{name:"Grantha",astral:"\ud804[\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3c-\udf44\udf47\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]"},{name:"Greek",bmp:"\u0370-\u0373\u0375-\u0377\u037a-\u037d\u037f\u0384\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03e1\u03f0-\u03ff\u1d26-\u1d2a\u1d5d-\u1d61\u1d66-\u1d6a\u1dbf\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2126\uab65",astral:"\ud800[\udd40-\udd8e\udda0]|\ud834[\ude00-\ude45]"},{name:"Gujarati",bmp:"\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0af1\u0af9"},{name:"Gurmukhi",bmp:"\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75"},{name:"Han",bmp:"\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u3005\u3007\u3021-\u3029\u3038-\u303b\u3400-\u4db5\u4e00-\u9fd5\uf900-\ufa6d\ufa70-\ufad9",astral:"[\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Hangul",bmp:"\u1100-\u11ff\u302e\u302f\u3131-\u318e\u3200-\u321e\u3260-\u327e\ua960-\ua97c\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"},{name:"Hanunoo",bmp:"\u1720-\u1734"},{name:"Hatran",astral:"\ud802[\udce0-\udcf2\udcf4\udcf5\udcfb-\udcff]"},{name:"Hebrew",bmp:"\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufb4f"},{name:"Hiragana",bmp:"\u3041-\u3096\u309d-\u309f",astral:"\ud82c\udc01|\ud83c\ude00"},{name:"Imperial_Aramaic",astral:"\ud802[\udc40-\udc55\udc57-\udc5f]"},{name:"Inherited",bmp:"\u0300-\u036f\u0485\u0486\u064b-\u0655\u0670\u0951\u0952\u1ab0-\u1abe\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u200c\u200d\u20d0-\u20f0\u302a-\u302d\u3099\u309a\ufe00-\ufe0f\ufe20-\ufe2d",astral:"\ud800[\uddfd\udee0]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad]|\udb40[\udd00-\uddef]"},{name:"Inscriptional_Pahlavi",astral:"\ud802[\udf60-\udf72\udf78-\udf7f]"},{name:"Inscriptional_Parthian",astral:"\ud802[\udf40-\udf55\udf58-\udf5f]"},{name:"Javanese",bmp:"\ua980-\ua9cd\ua9d0-\ua9d9\ua9de\ua9df"},{name:"Kaithi",astral:"\ud804[\udc80-\udcc1]"},{name:"Kannada",bmp:"\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2"},{name:"Katakana",bmp:"\u30a1-\u30fa\u30fd-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff6f\uff71-\uff9d",astral:"\ud82c\udc00"},{name:"Kayah_Li",bmp:"\ua900-\ua92d\ua92f"},{name:"Kharoshthi",astral:"\ud802[\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f-\ude47\ude50-\ude58]"},{name:"Khmer",bmp:"\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9\u19e0-\u19ff"},{name:"Khojki",astral:"\ud804[\ude00-\ude11\ude13-\ude3e]"},{name:"Khudawadi",astral:"\ud804[\udeb0-\udeea\udef0-\udef9]"},{name:"Lao",bmp:"\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf"},{name:"Latin",bmp:"A-Za-z\xaa\xba\xc0-\xd6\xd8-\xf6\xf8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua7ff\uab30-\uab5a\uab5c-\uab64\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a"},{name:"Lepcha",bmp:"\u1c00-\u1c37\u1c3b-\u1c49\u1c4d-\u1c4f"},{name:"Limbu",bmp:"\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1940\u1944-\u194f"},{name:"Linear_A",astral:"\ud801[\ude00-\udf36\udf40-\udf55\udf60-\udf67]"},{name:"Linear_B",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa]"},{name:"Lisu",bmp:"\ua4d0-\ua4ff"},{name:"Lycian",astral:"\ud800[\ude80-\ude9c]"},{name:"Lydian",astral:"\ud802[\udd20-\udd39\udd3f]"},{name:"Mahajani",astral:"\ud804[\udd50-\udd76]"},{name:"Malayalam",bmp:"\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4f\u0d54-\u0d63\u0d66-\u0d7f"},{name:"Mandaic",bmp:"\u0840-\u085b\u085e"},{name:"Manichaean",astral:"\ud802[\udec0-\udee6\udeeb-\udef6]"},{name:"Marchen",astral:"\ud807[\udc70-\udc8f\udc92-\udca7\udca9-\udcb6]"},{name:"Meetei_Mayek",bmp:"\uaae0-\uaaf6\uabc0-\uabed\uabf0-\uabf9"},{name:"Mende_Kikakui",astral:"\ud83a[\udc00-\udcc4\udcc7-\udcd6]"},{name:"Meroitic_Cursive",astral:"\ud802[\udda0-\uddb7\uddbc-\uddcf\uddd2-\uddff]"},{name:"Meroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"Miao",astral:"\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]"},{name:"Modi",astral:"\ud805[\ude00-\ude44\ude50-\ude59]"},{name:"Mongolian",bmp:"\u1800\u1801\u1804\u1806-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18aa",astral:"\ud805[\ude60-\ude6c]"},{name:"Mro",astral:"\ud81a[\ude40-\ude5e\ude60-\ude69\ude6e\ude6f]"},{name:"Multani",astral:"\ud804[\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea9]"},{name:"Myanmar",bmp:"\u1000-\u109f\ua9e0-\ua9fe\uaa60-\uaa7f"},{name:"Nabataean",astral:"\ud802[\udc80-\udc9e\udca7-\udcaf]"},{name:"New_Tai_Lue",bmp:"\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de\u19df"},{name:"Newa",astral:"\ud805[\udc00-\udc59\udc5b\udc5d]"},{name:"Nko",bmp:"\u07c0-\u07fa"},{name:"Ogham",bmp:"\u1680-\u169c"},{name:"Ol_Chiki",bmp:"\u1c50-\u1c7f"},{name:"Old_Hungarian",astral:"\ud803[\udc80-\udcb2\udcc0-\udcf2\udcfa-\udcff]"},{name:"Old_Italic",astral:"\ud800[\udf00-\udf23]"},{name:"Old_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"Old_Permic",astral:"\ud800[\udf50-\udf7a]"},{name:"Old_Persian",astral:"\ud800[\udfa0-\udfc3\udfc8-\udfd5]"},{name:"Old_South_Arabian",astral:"\ud802[\ude60-\ude7f]"},{name:"Old_Turkic",astral:"\ud803[\udc00-\udc48]"},{name:"Oriya",bmp:"\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b77"},{name:"Osage",astral:"\ud801[\udcb0-\udcd3\udcd8-\udcfb]"},{name:"Osmanya",astral:"\ud801[\udc80-\udc9d\udca0-\udca9]"},{name:"Pahawh_Hmong",astral:"\ud81a[\udf00-\udf45\udf50-\udf59\udf5b-\udf61\udf63-\udf77\udf7d-\udf8f]"},{name:"Palmyrene",astral:"\ud802[\udc60-\udc7f]"},{name:"Pau_Cin_Hau",astral:"\ud806[\udec0-\udef8]"},{name:"Phags_Pa",bmp:"\ua840-\ua877"},{name:"Phoenician",astral:"\ud802[\udd00-\udd1b\udd1f]"},{name:"Psalter_Pahlavi",astral:"\ud802[\udf80-\udf91\udf99-\udf9c\udfa9-\udfaf]"},{name:"Rejang",bmp:"\ua930-\ua953\ua95f"},{name:"Runic",bmp:"\u16a0-\u16ea\u16ee-\u16f8"},{name:"Samaritan",bmp:"\u0800-\u082d\u0830-\u083e"},{name:"Saurashtra",bmp:"\ua880-\ua8c5\ua8ce-\ua8d9"},{name:"Sharada",astral:"\ud804[\udd80-\uddcd\uddd0-\udddf]"},{name:"Shavian",astral:"\ud801[\udc50-\udc7f]"},{name:"Siddham",astral:"\ud805[\udd80-\uddb5\uddb8-\udddd]"},{name:"SignWriting",astral:"\ud836[\udc00-\ude8b\ude9b-\ude9f\udea1-\udeaf]"},{name:"Sinhala",bmp:"\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4",astral:"\ud804[\udde1-\uddf4]"},{name:"Sora_Sompeng",astral:"\ud804[\udcd0-\udce8\udcf0-\udcf9]"},{name:"Sundanese",bmp:"\u1b80-\u1bbf\u1cc0-\u1cc7"},{name:"Syloti_Nagri",bmp:"\ua800-\ua82b"},{name:"Syriac",bmp:"\u0700-\u070d\u070f-\u074a\u074d-\u074f"},{name:"Tagalog",bmp:"\u1700-\u170c\u170e-\u1714"},{name:"Tagbanwa",bmp:"\u1760-\u176c\u176e-\u1770\u1772\u1773"},{name:"Tai_Le",bmp:"\u1950-\u196d\u1970-\u1974"},{name:"Tai_Tham",bmp:"\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad"},{name:"Tai_Viet",bmp:"\uaa80-\uaac2\uaadb-\uaadf"},{name:"Takri",astral:"\ud805[\ude80-\udeb7\udec0-\udec9]"},{name:"Tamil",bmp:"\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bfa"},{name:"Tangut",astral:"\ud81b\udfe0|[\ud81c-\ud820][\udc00-\udfff]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]"},{name:"Telugu",bmp:"\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f"},{name:"Thaana",bmp:"\u0780-\u07b1"},{name:"Thai",bmp:"\u0e01-\u0e3a\u0e40-\u0e5b"},{name:"Tibetan",bmp:"\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc\u0fce-\u0fd4\u0fd9\u0fda"},{name:"Tifinagh",bmp:"\u2d30-\u2d67\u2d6f\u2d70\u2d7f"},{name:"Tirhuta",astral:"\ud805[\udc80-\udcc7\udcd0-\udcd9]"},{name:"Ugaritic",astral:"\ud800[\udf80-\udf9d\udf9f]"},{name:"Vai",bmp:"\ua500-\ua62b"},{name:"Warang_Citi",astral:"\ud806[\udca0-\udcf2\udcff]"},{name:"Yi",bmp:"\ua000-\ua48c\ua490-\ua4c6"}])},u.exports=e.default},638:function(u,e,d){u.exports=function(){var u=[],e=[],d={},n={},t={};function r(u){return"string"==typeof u?new RegExp("^"+u+"$","i"):u}function a(u,e){return u===e?e:u===u.toLowerCase()?e.toLowerCase():u===u.toUpperCase()?e.toUpperCase():u[0]===u[0].toUpperCase()?e.charAt(0).toUpperCase()+e.substr(1).toLowerCase():e.toLowerCase()}function c(u,e){return u.replace(/\$(\d{1,2})/g,(function(u,d){return e[d]||""}))}function f(u,e){return u.replace(e[0],(function(d,n){var t=c(e[1],arguments);return a(""===d?u[n-1]:d,t)}))}function i(u,e,n){if(!u.length||d.hasOwnProperty(u))return e;for(var t=n.length;t--;){var r=n[t];if(r[0].test(e))return f(e,r)}return e}function o(u,e,d){return function(n){var t=n.toLowerCase();return e.hasOwnProperty(t)?a(n,t):u.hasOwnProperty(t)?a(n,u[t]):i(t,n,d)}}function l(u,e,d,n){return function(n){var t=n.toLowerCase();return!!e.hasOwnProperty(t)||!u.hasOwnProperty(t)&&i(t,t,d)===t}}function s(u,e,d){return(d?e+" ":"")+(1===e?s.singular(u):s.plural(u))}return s.plural=o(t,n,u),s.isPlural=l(t,n,u),s.singular=o(n,t,e),s.isSingular=l(n,t,e),s.addPluralRule=function(e,d){u.push([r(e),d])},s.addSingularRule=function(u,d){e.push([r(u),d])},s.addUncountableRule=function(u){"string"!=typeof u?(s.addPluralRule(u,"$0"),s.addSingularRule(u,"$0")):d[u.toLowerCase()]=!0},s.addIrregularRule=function(u,e){e=e.toLowerCase(),u=u.toLowerCase(),t[u]=e,n[e]=u},[["I","we"],["me","us"],["he","they"],["she","they"],["them","them"],["myself","ourselves"],["yourself","yourselves"],["itself","themselves"],["herself","themselves"],["himself","themselves"],["themself","themselves"],["is","are"],["was","were"],["has","have"],["this","these"],["that","those"],["echo","echoes"],["dingo","dingoes"],["volcano","volcanoes"],["tornado","tornadoes"],["torpedo","torpedoes"],["genus","genera"],["viscus","viscera"],["stigma","stigmata"],["stoma","stomata"],["dogma","dogmata"],["lemma","lemmata"],["schema","schemata"],["anathema","anathemata"],["ox","oxen"],["axe","axes"],["die","dice"],["yes","yeses"],["foot","feet"],["eave","eaves"],["goose","geese"],["tooth","teeth"],["quiz","quizzes"],["human","humans"],["proof","proofs"],["carve","carves"],["valve","valves"],["looey","looies"],["thief","thieves"],["groove","grooves"],["pickaxe","pickaxes"],["passerby","passersby"]].forEach((function(u){return s.addIrregularRule(u[0],u[1])})),[[/s?$/i,"s"],[/[^\u0000-\u007F]$/i,"$0"],[/([^aeiou]ese)$/i,"$1"],[/(ax|test)is$/i,"$1es"],[/(alias|[^aou]us|t[lm]as|gas|ris)$/i,"$1es"],[/(e[mn]u)s?$/i,"$1s"],[/([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$/i,"$1"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1i"],[/(alumn|alg|vertebr)(?:a|ae)$/i,"$1ae"],[/(seraph|cherub)(?:im)?$/i,"$1im"],[/(her|at|gr)o$/i,"$1oes"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i,"$1a"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i,"$1a"],[/sis$/i,"ses"],[/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i,"$1$2ves"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/([^ch][ieo][ln])ey$/i,"$1ies"],[/(x|ch|ss|sh|zz)$/i,"$1es"],[/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i,"$1ices"],[/\b((?:tit)?m|l)(?:ice|ouse)$/i,"$1ice"],[/(pe)(?:rson|ople)$/i,"$1ople"],[/(child)(?:ren)?$/i,"$1ren"],[/eaux$/i,"$0"],[/m[ae]n$/i,"men"],["thou","you"]].forEach((function(u){return s.addPluralRule(u[0],u[1])})),[[/s$/i,""],[/(ss)$/i,"$1"],[/(wi|kni|(?:after|half|high|low|mid|non|night|[^\w]|^)li)ves$/i,"$1fe"],[/(ar|(?:wo|[ae])l|[eo][ao])ves$/i,"$1f"],[/ies$/i,"y"],[/\b([pl]|zomb|(?:neck|cross)?t|coll|faer|food|gen|goon|group|lass|talk|goal|cut)ies$/i,"$1ie"],[/\b(mon|smil)ies$/i,"$1ey"],[/\b((?:tit)?m|l)ice$/i,"$1ouse"],[/(seraph|cherub)im$/i,"$1"],[/(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|t[lm]as|gas|(?:her|at|gr)o|[aeiou]ris)(?:es)?$/i,"$1"],[/(analy|diagno|parenthe|progno|synop|the|empha|cri|ne)(?:sis|ses)$/i,"$1sis"],[/(movie|twelve|abuse|e[mn]u)s$/i,"$1"],[/(test)(?:is|es)$/i,"$1is"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1us"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i,"$1um"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i,"$1on"],[/(alumn|alg|vertebr)ae$/i,"$1a"],[/(cod|mur|sil|vert|ind)ices$/i,"$1ex"],[/(matr|append)ices$/i,"$1ix"],[/(pe)(rson|ople)$/i,"$1rson"],[/(child)ren$/i,"$1"],[/(eau)x?$/i,"$1"],[/men$/i,"man"]].forEach((function(u){return s.addSingularRule(u[0],u[1])})),["adulthood","advice","agenda","aid","aircraft","alcohol","ammo","analytics","anime","athletics","audio","bison","blood","bream","buffalo","butter","carp","cash","chassis","chess","clothing","cod","commerce","cooperation","corps","debris","diabetes","digestion","elk","energy","equipment","excretion","expertise","firmware","flounder","fun","gallows","garbage","graffiti","hardware","headquarters","health","herpes","highjinks","homework","housework","information","jeans","justice","kudos","labour","literature","machinery","mackerel","mail","media","mews","moose","music","mud","manga","news","only","personnel","pike","plankton","pliers","police","pollution","premises","rain","research","rice","salmon","scissors","series","sewage","shambles","shrimp","software","species","staff","swine","tennis","traffic","transportation","trout","tuna","wealth","welfare","whiting","wildebeest","wildlife","you",/pok[e\xe9]mon$/i,/[^aeiou]ese$/i,/deer$/i,/fish$/i,/measles$/i,/o[iu]s$/i,/pox$/i,/sheep$/i].forEach(s.addUncountableRule),s}()}}]); \ No newline at end of file +/*! For license information please see 3116c1fa.facd92c7.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{214:function(u,e,d){"use strict";d.r(e);var n=d(1),t=(d(52),d(468),d(29),d(22),d(21),d(85),d(0)),r=d.n(t),a=d(490),c=d(487),f=(d(470),d(514)),i=d(491),o=d.n(i),l=d(495),s=d(521),p=d.n(s),m=d(638),h=d.n(m),b=Object(a.a)("h2");e.default=function(u){var e=u.tags,d=Object.values(e).map((function(u){return{count:u.count,label:u.name,permalink:u.permalink}})),t=Object(l.a)(d,"guides"),a=o.a.groupBy(t,"category");return r.a.createElement(c.a,{title:"Tags",description:"Qovery guide tags"},r.a.createElement("header",{className:"hero hero--clean"},r.a.createElement("div",{className:"container"},r.a.createElement("h1",null,"All Guide Tags"))),r.a.createElement("main",{className:"container container--xs"},Object.keys(a).map((function(u,e){var d=a[u];return r.a.createElement("section",null,r.a.createElement(b,{id:u.name},h()(p()(u))),d.map((function(u,e){return r.a.createElement("div",null,r.a.createElement(f.a,Object(n.a)({key:e,valueOnly:!0},u)))})))}))))}},463:function(u,e,d){var n;!function(){"use strict";var d={}.hasOwnProperty;function t(){for(var u=[],e=0;e1?arguments[1]:void 0)}}),d(74)("find")},487:function(u,e,d){"use strict";d(497);var n=d(0),t=d.n(n),r=d(498),a=d(486),c=d(1),f=(d(488),d(489),d(499),d(470)),i=d(500),o=d(484),l=d.n(o),s=d(501),p=d.n(s),m=d(476),h=d(463),b=d.n(h),v=d(135),_=d.n(v),g=function(){return t.a.createElement("span",{className:b()(_.a.toggle,_.a.moon)})},D=function(){return t.a.createElement("span",{className:b()(_.a.toggle,_.a.sun)})},y=function(u){var e=Object(m.a)().isClient;return t.a.createElement(p.a,Object(c.a)({disabled:!e,icons:{checked:t.a.createElement(g,null),unchecked:t.a.createElement(D,null)}},u))};function E(){var u=Object(m.a)().siteConfig,e=(void 0===u?{}:u).customFields.metadata.latest_post,d=Date.parse(e.date),n=new Date,t=Math.abs(n-d),r=Math.ceil(t/864e5),a=null;return"undefined"!=typeof window&&(a=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),r<30&&(!a||a0&&t.a.createElement("div",{className:"row footer__links"},t.a.createElement("div",{className:"col col--5 footer__col"},t.a.createElement("div",{className:"margin-bottom--md"},t.a.createElement(l.a,{className:"navbar__logo",src:p,alt:"Qovery",width:"150",height:"auto"})),t.a.createElement("div",{className:"margin-bottom--md"},t.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),t.a.createElement("div",null,t.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},t.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",t.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},t.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",t.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},t.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),f.map((function(u,e){return t.a.createElement("div",{key:e,className:"col footer__col"},null!=u.title?t.a.createElement("h4",{className:"footer__title"},u.title):null,null!=u.items&&Array.isArray(u.items)&&u.items.length>0?t.a.createElement("ul",{className:"footer__items"},u.items.map((function(u,e){return u.html?t.a.createElement("li",{key:e,className:"footer__item",dangerouslySetInnerHTML:{__html:u.html}}):t.a.createElement("li",{key:u.href||u.to,className:"footer__item"},t.a.createElement(L,u))}))):null)}))),(o||a)&&t.a.createElement("div",{className:"text--center"},o&&o.src&&t.a.createElement("div",{className:"margin-bottom--sm"},o.href?t.a.createElement("a",{href:o.href,target:"_blank",rel:"noopener noreferrer",className:B.a.footerLogoLink},t.a.createElement(P,{alt:o.alt,url:s})):t.a.createElement(P,{alt:o.alt,url:s})),t.a.createElement("small",null,a),t.a.createElement("br",null))))},T=d(502),R=d(503),U=d(3);d(138);e.a=function(u){var e=Object(m.a)().siteConfig,d=void 0===e?{}:e,n=d.title,c=d.themeConfig.image,f=d.url,i=u.children,o=u.title,l=u.noFooter,s=u.description,p=u.image,h=u.keywords,b=u.version,v=o?o+" | "+n:n,_=p||c,g=f+Object(I.a)(_),D=Object(U.h)(),y=D?"https://docs.qovery.com"+(D.pathname.endsWith("/")?D.pathname:D.pathname+"/"):null;return t.a.createElement(R.a,null,t.a.createElement(T.a,null,t.a.createElement(a.a,null,t.a.createElement("html",{lang:"en"}),t.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),v&&t.a.createElement("title",null,v),v&&t.a.createElement("meta",{property:"og:title",content:v}),t.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),t.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),t.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),t.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),t.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),t.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),t.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),t.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),s&&t.a.createElement("meta",{name:"description",content:s}),s&&t.a.createElement("meta",{property:"og:description",content:s}),b&&t.a.createElement("meta",{name:"docsearch:version",content:b}),h&&h.length&&t.a.createElement("meta",{name:"keywords",content:h.join(",")}),_&&t.a.createElement("meta",{property:"og:image",content:g}),_&&t.a.createElement("meta",{property:"twitter:image",content:g}),_&&t.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+v}),y&&t.a.createElement("meta",{property:"og:url",content:y}),t.a.createElement("meta",{name:"twitter:card",content:"summary"}),y&&t.a.createElement("link",{rel:"canonical",href:y})),t.a.createElement(r.a,null),t.a.createElement(j,null),t.a.createElement("div",{className:"main-wrapper"},i),!l&&t.a.createElement(M,null)))}},490:function(u,e,d){"use strict";var n=d(9),t=d(0),r=d.n(t),a=d(463),c=d.n(a),f=d(476),i=(d(139),d(140)),o=d.n(i);e.a=function(u){return function(e){var d,t=e.id,a=Object(n.a)(e,["id"]),i=Object(f.a)().siteConfig,l=(i=void 0===i?{}:i).themeConfig,s=(l=void 0===l?{}:l).navbar,p=(s=void 0===s?{}:s).hideOnScroll,m=void 0!==p&&p;return t?r.a.createElement(u,a,r.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:c()("anchor",(d={},d[o.a.enhancedAnchor]=!m,d)),id:t}),r.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+t,title:"Direct link to heading"},"#"),a.children):r.a.createElement(u,a)}}},491:function(u,e,d){(function(u,n){var t;(function(){var r="Expected a function",a="__lodash_placeholder__",c=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],f="[object Arguments]",i="[object Array]",o="[object Boolean]",l="[object Date]",s="[object Error]",p="[object Function]",m="[object GeneratorFunction]",h="[object Map]",b="[object Number]",v="[object Object]",_="[object RegExp]",g="[object Set]",D="[object String]",y="[object Symbol]",E="[object WeakMap]",x="[object ArrayBuffer]",I="[object DataView]",w="[object Float32Array]",C="[object Float64Array]",F="[object Int8Array]",A="[object Int16Array]",k="[object Int32Array]",S="[object Uint8Array]",O="[object Uint16Array]",j="[object Uint32Array]",$=/\b__p \+= '';/g,N=/\b(__p \+=) '' \+/g,B=/(__e\(.*?\)|\b__t\)) \+\n'';/g,L=/&(?:amp|lt|gt|quot|#39);/g,P=/[&<>"']/g,M=RegExp(L.source),T=RegExp(P.source),R=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,z=/<%=([\s\S]+?)%>/g,K=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,W=/^\w*$/,G=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,H=/[\\^$.*+?()[\]{}|]/g,q=RegExp(H.source),J=/^\s+|\s+$/g,Z=/^\s+/,V=/\s+$/,Y=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Q=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,uu=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,eu=/\\(\\)?/g,du=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,nu=/\w*$/,tu=/^[-+]0x[0-9a-f]+$/i,ru=/^0b[01]+$/i,au=/^\[object .+?Constructor\]$/,cu=/^0o[0-7]+$/i,fu=/^(?:0|[1-9]\d*)$/,iu=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ou=/($^)/,lu=/['\n\r\u2028\u2029\\]/g,su="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",pu="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",mu="[\\ud800-\\udfff]",hu="["+pu+"]",bu="["+su+"]",vu="\\d+",_u="[\\u2700-\\u27bf]",gu="[a-z\\xdf-\\xf6\\xf8-\\xff]",Du="[^\\ud800-\\udfff"+pu+vu+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",yu="\\ud83c[\\udffb-\\udfff]",Eu="[^\\ud800-\\udfff]",xu="(?:\\ud83c[\\udde6-\\uddff]){2}",Iu="[\\ud800-\\udbff][\\udc00-\\udfff]",wu="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Cu="(?:"+gu+"|"+Du+")",Fu="(?:"+wu+"|"+Du+")",Au="(?:"+bu+"|"+yu+")"+"?",ku="[\\ufe0e\\ufe0f]?"+Au+("(?:\\u200d(?:"+[Eu,xu,Iu].join("|")+")[\\ufe0e\\ufe0f]?"+Au+")*"),Su="(?:"+[_u,xu,Iu].join("|")+")"+ku,Ou="(?:"+[Eu+bu+"?",bu,xu,Iu,mu].join("|")+")",ju=RegExp("['\u2019]","g"),$u=RegExp(bu,"g"),Nu=RegExp(yu+"(?="+yu+")|"+Ou+ku,"g"),Bu=RegExp([wu+"?"+gu+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[hu,wu,"$"].join("|")+")",Fu+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[hu,wu+Cu,"$"].join("|")+")",wu+"?"+Cu+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",wu+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",vu,Su].join("|"),"g"),Lu=RegExp("[\\u200d\\ud800-\\udfff"+su+"\\ufe0e\\ufe0f]"),Pu=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Mu=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Tu=-1,Ru={};Ru[w]=Ru[C]=Ru[F]=Ru[A]=Ru[k]=Ru[S]=Ru["[object Uint8ClampedArray]"]=Ru[O]=Ru[j]=!0,Ru[f]=Ru[i]=Ru[x]=Ru[o]=Ru[I]=Ru[l]=Ru[s]=Ru[p]=Ru[h]=Ru[b]=Ru[v]=Ru[_]=Ru[g]=Ru[D]=Ru[E]=!1;var Uu={};Uu[f]=Uu[i]=Uu[x]=Uu[I]=Uu[o]=Uu[l]=Uu[w]=Uu[C]=Uu[F]=Uu[A]=Uu[k]=Uu[h]=Uu[b]=Uu[v]=Uu[_]=Uu[g]=Uu[D]=Uu[y]=Uu[S]=Uu["[object Uint8ClampedArray]"]=Uu[O]=Uu[j]=!0,Uu[s]=Uu[p]=Uu[E]=!1;var zu={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Ku=parseFloat,Wu=parseInt,Gu="object"==typeof u&&u&&u.Object===Object&&u,Hu="object"==typeof self&&self&&self.Object===Object&&self,qu=Gu||Hu||Function("return this")(),Ju=e&&!e.nodeType&&e,Zu=Ju&&"object"==typeof n&&n&&!n.nodeType&&n,Vu=Zu&&Zu.exports===Ju,Yu=Vu&&Gu.process,Qu=function(){try{var u=Zu&&Zu.require&&Zu.require("util").types;return u||Yu&&Yu.binding&&Yu.binding("util")}catch(e){}}(),Xu=Qu&&Qu.isArrayBuffer,ue=Qu&&Qu.isDate,ee=Qu&&Qu.isMap,de=Qu&&Qu.isRegExp,ne=Qu&&Qu.isSet,te=Qu&&Qu.isTypedArray;function re(u,e,d){switch(d.length){case 0:return u.call(e);case 1:return u.call(e,d[0]);case 2:return u.call(e,d[0],d[1]);case 3:return u.call(e,d[0],d[1],d[2])}return u.apply(e,d)}function ae(u,e,d,n){for(var t=-1,r=null==u?0:u.length;++t-1}function se(u,e,d){for(var n=-1,t=null==u?0:u.length;++n-1;);return d}function Ne(u,e){for(var d=u.length;d--&&ye(e,u[d],0)>-1;);return d}function Be(u,e){for(var d=u.length,n=0;d--;)u[d]===e&&++n;return n}var Le=Ce({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Pe=Ce({"&":"&","<":"<",">":">",'"':""","'":"'"});function Me(u){return"\\"+zu[u]}function Te(u){return Lu.test(u)}function Re(u){var e=-1,d=Array(u.size);return u.forEach((function(u,n){d[++e]=[n,u]})),d}function Ue(u,e){return function(d){return u(e(d))}}function ze(u,e){for(var d=-1,n=u.length,t=0,r=[];++d",""":'"',"'":"'"});var Je=function u(e){var d,n=(e=null==e?qu:Je.defaults(qu.Object(),e,Je.pick(qu,Mu))).Array,t=e.Date,su=e.Error,pu=e.Function,mu=e.Math,hu=e.Object,bu=e.RegExp,vu=e.String,_u=e.TypeError,gu=n.prototype,Du=pu.prototype,yu=hu.prototype,Eu=e["__core-js_shared__"],xu=Du.toString,Iu=yu.hasOwnProperty,wu=0,Cu=(d=/[^.]+$/.exec(Eu&&Eu.keys&&Eu.keys.IE_PROTO||""))?"Symbol(src)_1."+d:"",Fu=yu.toString,Au=xu.call(hu),ku=qu._,Su=bu("^"+xu.call(Iu).replace(H,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ou=Vu?e.Buffer:void 0,Nu=e.Symbol,Lu=e.Uint8Array,zu=Ou?Ou.allocUnsafe:void 0,Gu=Ue(hu.getPrototypeOf,hu),Hu=hu.create,Ju=yu.propertyIsEnumerable,Zu=gu.splice,Yu=Nu?Nu.isConcatSpreadable:void 0,Qu=Nu?Nu.iterator:void 0,_e=Nu?Nu.toStringTag:void 0,Ce=function(){try{var u=Xt(hu,"defineProperty");return u({},"",{}),u}catch(e){}}(),Ze=e.clearTimeout!==qu.clearTimeout&&e.clearTimeout,Ve=t&&t.now!==qu.Date.now&&t.now,Ye=e.setTimeout!==qu.setTimeout&&e.setTimeout,Qe=mu.ceil,Xe=mu.floor,ud=hu.getOwnPropertySymbols,ed=Ou?Ou.isBuffer:void 0,dd=e.isFinite,nd=gu.join,td=Ue(hu.keys,hu),rd=mu.max,ad=mu.min,cd=t.now,fd=e.parseInt,id=mu.random,od=gu.reverse,ld=Xt(e,"DataView"),sd=Xt(e,"Map"),pd=Xt(e,"Promise"),md=Xt(e,"Set"),hd=Xt(e,"WeakMap"),bd=Xt(hu,"create"),vd=hd&&new hd,_d={},gd=Cr(ld),Dd=Cr(sd),yd=Cr(pd),Ed=Cr(md),xd=Cr(hd),Id=Nu?Nu.prototype:void 0,wd=Id?Id.valueOf:void 0,Cd=Id?Id.toString:void 0;function Fd(u){if(Ka(u)&&!ja(u)&&!(u instanceof Od)){if(u instanceof Sd)return u;if(Iu.call(u,"__wrapped__"))return Fr(u)}return new Sd(u)}var Ad=function(){function u(){}return function(e){if(!za(e))return{};if(Hu)return Hu(e);u.prototype=e;var d=new u;return u.prototype=void 0,d}}();function kd(){}function Sd(u,e){this.__wrapped__=u,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=void 0}function Od(u){this.__wrapped__=u,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function jd(u){var e=-1,d=null==u?0:u.length;for(this.clear();++e=e?u:e)),u}function Zd(u,e,d,n,t,r){var a,c=1&e,i=2&e,s=4&e;if(d&&(a=t?d(u,n,t,r):d(u)),void 0!==a)return a;if(!za(u))return u;var E=ja(u);if(E){if(a=function(u){var e=u.length,d=new u.constructor(e);e&&"string"==typeof u[0]&&Iu.call(u,"index")&&(d.index=u.index,d.input=u.input);return d}(u),!c)return vt(u,a)}else{var $=dr(u),N=$==p||$==m;if(La(u))return lt(u,c);if($==v||$==f||N&&!t){if(a=i||N?{}:tr(u),!c)return i?function(u,e){return _t(u,er(u),e)}(u,function(u,e){return u&&_t(e,Dc(e),u)}(a,u)):function(u,e){return _t(u,ur(u),e)}(u,Gd(a,u))}else{if(!Uu[$])return t?u:{};a=function(u,e,d){var n=u.constructor;switch(e){case x:return st(u);case o:case l:return new n(+u);case I:return function(u,e){var d=e?st(u.buffer):u.buffer;return new u.constructor(d,u.byteOffset,u.byteLength)}(u,d);case w:case C:case F:case A:case k:case S:case"[object Uint8ClampedArray]":case O:case j:return pt(u,d);case h:return new n;case b:case D:return new n(u);case _:return function(u){var e=new u.constructor(u.source,nu.exec(u));return e.lastIndex=u.lastIndex,e}(u);case g:return new n;case y:return t=u,wd?hu(wd.call(t)):{}}var t}(u,$,c)}}r||(r=new Ld);var B=r.get(u);if(B)return B;r.set(u,a),Ja(u)?u.forEach((function(n){a.add(Zd(n,e,d,n,u,r))})):Wa(u)&&u.forEach((function(n,t){a.set(t,Zd(n,e,d,t,u,r))}));var L=E?void 0:(s?i?Ht:Gt:i?Dc:gc)(u);return ce(L||u,(function(n,t){L&&(n=u[t=n]),zd(a,t,Zd(n,e,d,t,u,r))})),a}function Vd(u,e,d){var n=d.length;if(null==u)return!n;for(u=hu(u);n--;){var t=d[n],r=e[t],a=u[t];if(void 0===a&&!(t in u)||!r(a))return!1}return!0}function Yd(u,e,d){if("function"!=typeof u)throw new _u(r);return gr((function(){u.apply(void 0,d)}),e)}function Qd(u,e,d,n){var t=-1,r=le,a=!0,c=u.length,f=[],i=e.length;if(!c)return f;d&&(e=pe(e,Se(d))),n?(r=se,a=!1):e.length>=200&&(r=je,a=!1,e=new Bd(e));u:for(;++t-1},$d.prototype.set=function(u,e){var d=this.__data__,n=Kd(d,u);return n<0?(++this.size,d.push([u,e])):d[n][1]=e,this},Nd.prototype.clear=function(){this.size=0,this.__data__={hash:new jd,map:new(sd||$d),string:new jd}},Nd.prototype.delete=function(u){var e=Yt(this,u).delete(u);return this.size-=e?1:0,e},Nd.prototype.get=function(u){return Yt(this,u).get(u)},Nd.prototype.has=function(u){return Yt(this,u).has(u)},Nd.prototype.set=function(u,e){var d=Yt(this,u),n=d.size;return d.set(u,e),this.size+=d.size==n?0:1,this},Bd.prototype.add=Bd.prototype.push=function(u){return this.__data__.set(u,"__lodash_hash_undefined__"),this},Bd.prototype.has=function(u){return this.__data__.has(u)},Ld.prototype.clear=function(){this.__data__=new $d,this.size=0},Ld.prototype.delete=function(u){var e=this.__data__,d=e.delete(u);return this.size=e.size,d},Ld.prototype.get=function(u){return this.__data__.get(u)},Ld.prototype.has=function(u){return this.__data__.has(u)},Ld.prototype.set=function(u,e){var d=this.__data__;if(d instanceof $d){var n=d.__data__;if(!sd||n.length<199)return n.push([u,e]),this.size=++d.size,this;d=this.__data__=new Nd(n)}return d.set(u,e),this.size=d.size,this};var Xd=yt(cn),un=yt(fn,!0);function en(u,e){var d=!0;return Xd(u,(function(u,n,t){return d=!!e(u,n,t)})),d}function dn(u,e,d){for(var n=-1,t=u.length;++n0&&d(c)?e>1?tn(c,e-1,d,n,t):me(t,c):n||(t[t.length]=c)}return t}var rn=Et(),an=Et(!0);function cn(u,e){return u&&rn(u,e,gc)}function fn(u,e){return u&&an(u,e,gc)}function on(u,e){return oe(e,(function(e){return Ta(u[e])}))}function ln(u,e){for(var d=0,n=(e=ct(e,u)).length;null!=u&&de}function hn(u,e){return null!=u&&Iu.call(u,e)}function bn(u,e){return null!=u&&e in hu(u)}function vn(u,e,d){for(var t=d?se:le,r=u[0].length,a=u.length,c=a,f=n(a),i=1/0,o=[];c--;){var l=u[c];c&&e&&(l=pe(l,Se(e))),i=ad(l.length,i),f[c]=!d&&(e||r>=120&&l.length>=120)?new Bd(c&&l):void 0}l=u[0];var s=-1,p=f[0];u:for(;++s=c)return f;var i=d[n];return f*("desc"==i?-1:1)}}return u.index-e.index}(u,e,d)}))}function $n(u,e,d){for(var n=-1,t=e.length,r={};++n-1;)c!==u&&Zu.call(c,f,1),Zu.call(u,f,1);return u}function Bn(u,e){for(var d=u?e.length:0,n=d-1;d--;){var t=e[d];if(d==n||t!==r){var r=t;ar(t)?Zu.call(u,t,1):Xn(u,t)}}return u}function Ln(u,e){return u+Xe(id()*(e-u+1))}function Pn(u,e){var d="";if(!u||e<1||e>9007199254740991)return d;do{e%2&&(d+=u),(e=Xe(e/2))&&(u+=u)}while(e);return d}function Mn(u,e){return Dr(mr(u,e,Gc),u+"")}function Tn(u){return Md(Ac(u))}function Rn(u,e){var d=Ac(u);return xr(d,Jd(e,0,d.length))}function Un(u,e,d,n){if(!za(u))return u;for(var t=-1,r=(e=ct(e,u)).length,a=r-1,c=u;null!=c&&++tr?0:r+e),(d=d>r?r:d)<0&&(d+=r),r=e>d?0:d-e>>>0,e>>>=0;for(var a=n(r);++t>>1,a=u[r];null!==a&&!Va(a)&&(d?a<=e:a=200){var i=e?null:Pt(u);if(i)return Ke(i);a=!1,t=je,f=new Bd}else f=e?[]:c;u:for(;++n=n?u:Gn(u,e,d)}var ot=Ze||function(u){return qu.clearTimeout(u)};function lt(u,e){if(e)return u.slice();var d=u.length,n=zu?zu(d):new u.constructor(d);return u.copy(n),n}function st(u){var e=new u.constructor(u.byteLength);return new Lu(e).set(new Lu(u)),e}function pt(u,e){var d=e?st(u.buffer):u.buffer;return new u.constructor(d,u.byteOffset,u.length)}function mt(u,e){if(u!==e){var d=void 0!==u,n=null===u,t=u==u,r=Va(u),a=void 0!==e,c=null===e,f=e==e,i=Va(e);if(!c&&!i&&!r&&u>e||r&&a&&f&&!c&&!i||n&&a&&f||!d&&f||!t)return 1;if(!n&&!r&&!i&&u1?d[t-1]:void 0,a=t>2?d[2]:void 0;for(r=u.length>3&&"function"==typeof r?(t--,r):void 0,a&&cr(d[0],d[1],a)&&(r=t<3?void 0:r,t=1),e=hu(e);++n-1?t[r?e[a]:a]:void 0}}function Ft(u){return Wt((function(e){var d=e.length,n=d,t=Sd.prototype.thru;for(u&&e.reverse();n--;){var a=e[n];if("function"!=typeof a)throw new _u(r);if(t&&!c&&"wrapper"==Jt(a))var c=new Sd([],!0)}for(n=c?n:d;++n1&&g.reverse(),l&&i<_&&(g.length=i),this&&this!==qu&&this instanceof v&&(w=b||wt(w)),w.apply(I,g)}}function kt(u,e){return function(d,n){return function(u,e,d,n){return cn(u,(function(u,t,r){e(n,d(u),t,r)})),n}(d,u,e(n),{})}}function St(u,e){return function(d,n){var t;if(void 0===d&&void 0===n)return e;if(void 0!==d&&(t=d),void 0!==n){if(void 0===t)return n;"string"==typeof d||"string"==typeof n?(d=Yn(d),n=Yn(n)):(d=Vn(d),n=Vn(n)),t=u(d,n)}return t}}function Ot(u){return Wt((function(e){return e=pe(e,Se(Vt())),Mn((function(d){var n=this;return u(e,(function(u){return re(u,n,d)}))}))}))}function jt(u,e){var d=(e=void 0===e?" ":Yn(e)).length;if(d<2)return d?Pn(e,u):e;var n=Pn(e,Qe(u/Ge(e)));return Te(e)?it(He(n),0,u).join(""):n.slice(0,u)}function $t(u){return function(e,d,t){return t&&"number"!=typeof t&&cr(e,d,t)&&(d=t=void 0),e=ec(e),void 0===d?(d=e,e=0):d=ec(d),function(u,e,d,t){for(var r=-1,a=rd(Qe((e-u)/(d||1)),0),c=n(a);a--;)c[t?a:++r]=u,u+=d;return c}(e,d,t=void 0===t?ec))return!1;var i=r.get(u);if(i&&r.get(e))return i==e;var o=-1,l=!0,s=2&d?new Bd:void 0;for(r.set(u,e),r.set(e,u);++o-1&&u%1==0&&u1?"& ":"")+e[n],e=e.join(d>2?", ":" "),u.replace(Y,"{\n/* [wrapped with "+e+"] */\n")}(n,function(u,e){return ce(c,(function(d){var n="_."+d[0];e&d[1]&&!le(u,n)&&u.push(n)})),u.sort()}(function(u){var e=u.match(Q);return e?e[1].split(X):[]}(n),d)))}function Er(u){var e=0,d=0;return function(){var n=cd(),t=16-(n-d);if(d=n,t>0){if(++e>=800)return arguments[0]}else e=0;return u.apply(void 0,arguments)}}function xr(u,e){var d=-1,n=u.length,t=n-1;for(e=void 0===e?n:e;++d1?u[e-1]:void 0;return d="function"==typeof d?(u.pop(),d):void 0,qr(u,d)}));function ua(u){var e=Fd(u);return e.__chain__=!0,e}function ea(u,e){return e(u)}var da=Wt((function(u){var e=u.length,d=e?u[0]:0,n=this.__wrapped__,t=function(e){return qd(e,u)};return!(e>1||this.__actions__.length)&&n instanceof Od&&ar(d)?((n=n.slice(d,+d+(e?1:0))).__actions__.push({func:ea,args:[t],thisArg:void 0}),new Sd(n,this.__chain__).thru((function(u){return e&&!u.length&&u.push(void 0),u}))):this.thru(t)}));var na=gt((function(u,e,d){Iu.call(u,d)?++u[d]:Hd(u,d,1)}));var ta=Ct(Or),ra=Ct(jr);function aa(u,e){return(ja(u)?ce:Xd)(u,Vt(e,3))}function ca(u,e){return(ja(u)?fe:un)(u,Vt(e,3))}var fa=gt((function(u,e,d){Iu.call(u,d)?u[d].push(e):Hd(u,d,[e])}));var ia=Mn((function(u,e,d){var t=-1,r="function"==typeof e,a=Na(u)?n(u.length):[];return Xd(u,(function(u){a[++t]=r?re(e,u,d):_n(u,e,d)})),a})),oa=gt((function(u,e,d){Hd(u,d,e)}));function la(u,e){return(ja(u)?pe:Fn)(u,Vt(e,3))}var sa=gt((function(u,e,d){u[d?0:1].push(e)}),(function(){return[[],[]]}));var pa=Mn((function(u,e){if(null==u)return[];var d=e.length;return d>1&&cr(u,e[0],e[1])?e=[]:d>2&&cr(e[0],e[1],e[2])&&(e=[e[0]]),jn(u,tn(e,1),[])})),ma=Ve||function(){return qu.Date.now()};function ha(u,e,d){return e=d?void 0:e,Tt(u,128,void 0,void 0,void 0,void 0,e=u&&null==e?u.length:e)}function ba(u,e){var d;if("function"!=typeof e)throw new _u(r);return u=dc(u),function(){return--u>0&&(d=e.apply(this,arguments)),u<=1&&(e=void 0),d}}var va=Mn((function(u,e,d){var n=1;if(d.length){var t=ze(d,Zt(va));n|=32}return Tt(u,n,e,d,t)})),_a=Mn((function(u,e,d){var n=3;if(d.length){var t=ze(d,Zt(_a));n|=32}return Tt(e,n,u,d,t)}));function ga(u,e,d){var n,t,a,c,f,i,o=0,l=!1,s=!1,p=!0;if("function"!=typeof u)throw new _u(r);function m(e){var d=n,r=t;return n=t=void 0,o=e,c=u.apply(r,d)}function h(u){return o=u,f=gr(v,e),l?m(u):c}function b(u){var d=u-i;return void 0===i||d>=e||d<0||s&&u-o>=a}function v(){var u=ma();if(b(u))return _(u);f=gr(v,function(u){var d=e-(u-i);return s?ad(d,a-(u-o)):d}(u))}function _(u){return f=void 0,p&&n?m(u):(n=t=void 0,c)}function g(){var u=ma(),d=b(u);if(n=arguments,t=this,i=u,d){if(void 0===f)return h(i);if(s)return ot(f),f=gr(v,e),m(i)}return void 0===f&&(f=gr(v,e)),c}return e=tc(e)||0,za(d)&&(l=!!d.leading,a=(s="maxWait"in d)?rd(tc(d.maxWait)||0,e):a,p="trailing"in d?!!d.trailing:p),g.cancel=function(){void 0!==f&&ot(f),o=0,n=i=t=f=void 0},g.flush=function(){return void 0===f?c:_(ma())},g}var Da=Mn((function(u,e){return Yd(u,1,e)})),ya=Mn((function(u,e,d){return Yd(u,tc(e)||0,d)}));function Ea(u,e){if("function"!=typeof u||null!=e&&"function"!=typeof e)throw new _u(r);var d=function(){var n=arguments,t=e?e.apply(this,n):n[0],r=d.cache;if(r.has(t))return r.get(t);var a=u.apply(this,n);return d.cache=r.set(t,a)||r,a};return d.cache=new(Ea.Cache||Nd),d}function xa(u){if("function"!=typeof u)throw new _u(r);return function(){var e=arguments;switch(e.length){case 0:return!u.call(this);case 1:return!u.call(this,e[0]);case 2:return!u.call(this,e[0],e[1]);case 3:return!u.call(this,e[0],e[1],e[2])}return!u.apply(this,e)}}Ea.Cache=Nd;var Ia=ft((function(u,e){var d=(e=1==e.length&&ja(e[0])?pe(e[0],Se(Vt())):pe(tn(e,1),Se(Vt()))).length;return Mn((function(n){for(var t=-1,r=ad(n.length,d);++t=e})),Oa=gn(function(){return arguments}())?gn:function(u){return Ka(u)&&Iu.call(u,"callee")&&!Ju.call(u,"callee")},ja=n.isArray,$a=Xu?Se(Xu):function(u){return Ka(u)&&pn(u)==x};function Na(u){return null!=u&&Ua(u.length)&&!Ta(u)}function Ba(u){return Ka(u)&&Na(u)}var La=ed||tf,Pa=ue?Se(ue):function(u){return Ka(u)&&pn(u)==l};function Ma(u){if(!Ka(u))return!1;var e=pn(u);return e==s||"[object DOMException]"==e||"string"==typeof u.message&&"string"==typeof u.name&&!Ha(u)}function Ta(u){if(!za(u))return!1;var e=pn(u);return e==p||e==m||"[object AsyncFunction]"==e||"[object Proxy]"==e}function Ra(u){return"number"==typeof u&&u==dc(u)}function Ua(u){return"number"==typeof u&&u>-1&&u%1==0&&u<=9007199254740991}function za(u){var e=typeof u;return null!=u&&("object"==e||"function"==e)}function Ka(u){return null!=u&&"object"==typeof u}var Wa=ee?Se(ee):function(u){return Ka(u)&&dr(u)==h};function Ga(u){return"number"==typeof u||Ka(u)&&pn(u)==b}function Ha(u){if(!Ka(u)||pn(u)!=v)return!1;var e=Gu(u);if(null===e)return!0;var d=Iu.call(e,"constructor")&&e.constructor;return"function"==typeof d&&d instanceof d&&xu.call(d)==Au}var qa=de?Se(de):function(u){return Ka(u)&&pn(u)==_};var Ja=ne?Se(ne):function(u){return Ka(u)&&dr(u)==g};function Za(u){return"string"==typeof u||!ja(u)&&Ka(u)&&pn(u)==D}function Va(u){return"symbol"==typeof u||Ka(u)&&pn(u)==y}var Ya=te?Se(te):function(u){return Ka(u)&&Ua(u.length)&&!!Ru[pn(u)]};var Qa=Nt(Cn),Xa=Nt((function(u,e){return u<=e}));function uc(u){if(!u)return[];if(Na(u))return Za(u)?He(u):vt(u);if(Qu&&u[Qu])return function(u){for(var e,d=[];!(e=u.next()).done;)d.push(e.value);return d}(u[Qu]());var e=dr(u);return(e==h?Re:e==g?Ke:Ac)(u)}function ec(u){return u?(u=tc(u))===1/0||u===-1/0?17976931348623157e292*(u<0?-1:1):u==u?u:0:0===u?u:0}function dc(u){var e=ec(u),d=e%1;return e==e?d?e-d:e:0}function nc(u){return u?Jd(dc(u),0,4294967295):0}function tc(u){if("number"==typeof u)return u;if(Va(u))return NaN;if(za(u)){var e="function"==typeof u.valueOf?u.valueOf():u;u=za(e)?e+"":e}if("string"!=typeof u)return 0===u?u:+u;u=u.replace(J,"");var d=ru.test(u);return d||cu.test(u)?Wu(u.slice(2),d?2:8):tu.test(u)?NaN:+u}function rc(u){return _t(u,Dc(u))}function ac(u){return null==u?"":Yn(u)}var cc=Dt((function(u,e){if(lr(e)||Na(e))_t(e,gc(e),u);else for(var d in e)Iu.call(e,d)&&zd(u,d,e[d])})),fc=Dt((function(u,e){_t(e,Dc(e),u)})),ic=Dt((function(u,e,d,n){_t(e,Dc(e),u,n)})),oc=Dt((function(u,e,d,n){_t(e,gc(e),u,n)})),lc=Wt(qd);var sc=Mn((function(u,e){u=hu(u);var d=-1,n=e.length,t=n>2?e[2]:void 0;for(t&&cr(e[0],e[1],t)&&(n=1);++d1),e})),_t(u,Ht(u),d),n&&(d=Zd(d,7,zt));for(var t=e.length;t--;)Xn(d,e[t]);return d}));var Ic=Wt((function(u,e){return null==u?{}:function(u,e){return $n(u,e,(function(e,d){return hc(u,d)}))}(u,e)}));function wc(u,e){if(null==u)return{};var d=pe(Ht(u),(function(u){return[u]}));return e=Vt(e),$n(u,d,(function(u,d){return e(u,d[0])}))}var Cc=Mt(gc),Fc=Mt(Dc);function Ac(u){return null==u?[]:Oe(u,gc(u))}var kc=It((function(u,e,d){return e=e.toLowerCase(),u+(d?Sc(e):e)}));function Sc(u){return Mc(ac(u).toLowerCase())}function Oc(u){return(u=ac(u))&&u.replace(iu,Le).replace($u,"")}var jc=It((function(u,e,d){return u+(d?"-":"")+e.toLowerCase()})),$c=It((function(u,e,d){return u+(d?" ":"")+e.toLowerCase()})),Nc=xt("toLowerCase");var Bc=It((function(u,e,d){return u+(d?"_":"")+e.toLowerCase()}));var Lc=It((function(u,e,d){return u+(d?" ":"")+Mc(e)}));var Pc=It((function(u,e,d){return u+(d?" ":"")+e.toUpperCase()})),Mc=xt("toUpperCase");function Tc(u,e,d){return u=ac(u),void 0===(e=d?void 0:e)?function(u){return Pu.test(u)}(u)?function(u){return u.match(Bu)||[]}(u):function(u){return u.match(uu)||[]}(u):u.match(e)||[]}var Rc=Mn((function(u,e){try{return re(u,void 0,e)}catch(d){return Ma(d)?d:new su(d)}})),Uc=Wt((function(u,e){return ce(e,(function(e){e=wr(e),Hd(u,e,va(u[e],u))})),u}));function zc(u){return function(){return u}}var Kc=Ft(),Wc=Ft(!0);function Gc(u){return u}function Hc(u){return xn("function"==typeof u?u:Zd(u,1))}var qc=Mn((function(u,e){return function(d){return _n(d,u,e)}})),Jc=Mn((function(u,e){return function(d){return _n(u,d,e)}}));function Zc(u,e,d){var n=gc(e),t=on(e,n);null!=d||za(e)&&(t.length||!n.length)||(d=e,e=u,u=this,t=on(e,gc(e)));var r=!(za(d)&&"chain"in d&&!d.chain),a=Ta(u);return ce(t,(function(d){var n=e[d];u[d]=n,a&&(u.prototype[d]=function(){var e=this.__chain__;if(r||e){var d=u(this.__wrapped__),t=d.__actions__=vt(this.__actions__);return t.push({func:n,args:arguments,thisArg:u}),d.__chain__=e,d}return n.apply(u,me([this.value()],arguments))})})),u}function Vc(){}var Yc=Ot(pe),Qc=Ot(ie),Xc=Ot(ve);function uf(u){return fr(u)?we(wr(u)):function(u){return function(e){return ln(e,u)}}(u)}var ef=$t(),df=$t(!0);function nf(){return[]}function tf(){return!1}var rf=St((function(u,e){return u+e}),0),af=Lt("ceil"),cf=St((function(u,e){return u/e}),1),ff=Lt("floor");var of,lf=St((function(u,e){return u*e}),1),sf=Lt("round"),pf=St((function(u,e){return u-e}),0);return Fd.after=function(u,e){if("function"!=typeof e)throw new _u(r);return u=dc(u),function(){if(--u<1)return e.apply(this,arguments)}},Fd.ary=ha,Fd.assign=cc,Fd.assignIn=fc,Fd.assignInWith=ic,Fd.assignWith=oc,Fd.at=lc,Fd.before=ba,Fd.bind=va,Fd.bindAll=Uc,Fd.bindKey=_a,Fd.castArray=function(){if(!arguments.length)return[];var u=arguments[0];return ja(u)?u:[u]},Fd.chain=ua,Fd.chunk=function(u,e,d){e=(d?cr(u,e,d):void 0===e)?1:rd(dc(e),0);var t=null==u?0:u.length;if(!t||e<1)return[];for(var r=0,a=0,c=n(Qe(t/e));rt?0:t+d),(n=void 0===n||n>t?t:dc(n))<0&&(n+=t),n=d>n?0:nc(n);d>>0)?(u=ac(u))&&("string"==typeof e||null!=e&&!qa(e))&&!(e=Yn(e))&&Te(u)?it(He(u),0,d):u.split(e,d):[]},Fd.spread=function(u,e){if("function"!=typeof u)throw new _u(r);return e=null==e?0:rd(dc(e),0),Mn((function(d){var n=d[e],t=it(d,0,e);return n&&me(t,n),re(u,this,t)}))},Fd.tail=function(u){var e=null==u?0:u.length;return e?Gn(u,1,e):[]},Fd.take=function(u,e,d){return u&&u.length?Gn(u,0,(e=d||void 0===e?1:dc(e))<0?0:e):[]},Fd.takeRight=function(u,e,d){var n=null==u?0:u.length;return n?Gn(u,(e=n-(e=d||void 0===e?1:dc(e)))<0?0:e,n):[]},Fd.takeRightWhile=function(u,e){return u&&u.length?et(u,Vt(e,3),!1,!0):[]},Fd.takeWhile=function(u,e){return u&&u.length?et(u,Vt(e,3)):[]},Fd.tap=function(u,e){return e(u),u},Fd.throttle=function(u,e,d){var n=!0,t=!0;if("function"!=typeof u)throw new _u(r);return za(d)&&(n="leading"in d?!!d.leading:n,t="trailing"in d?!!d.trailing:t),ga(u,e,{leading:n,maxWait:e,trailing:t})},Fd.thru=ea,Fd.toArray=uc,Fd.toPairs=Cc,Fd.toPairsIn=Fc,Fd.toPath=function(u){return ja(u)?pe(u,wr):Va(u)?[u]:vt(Ir(ac(u)))},Fd.toPlainObject=rc,Fd.transform=function(u,e,d){var n=ja(u),t=n||La(u)||Ya(u);if(e=Vt(e,4),null==d){var r=u&&u.constructor;d=t?n?new r:[]:za(u)&&Ta(r)?Ad(Gu(u)):{}}return(t?ce:cn)(u,(function(u,n,t){return e(d,u,n,t)})),d},Fd.unary=function(u){return ha(u,1)},Fd.union=Kr,Fd.unionBy=Wr,Fd.unionWith=Gr,Fd.uniq=function(u){return u&&u.length?Qn(u):[]},Fd.uniqBy=function(u,e){return u&&u.length?Qn(u,Vt(e,2)):[]},Fd.uniqWith=function(u,e){return e="function"==typeof e?e:void 0,u&&u.length?Qn(u,void 0,e):[]},Fd.unset=function(u,e){return null==u||Xn(u,e)},Fd.unzip=Hr,Fd.unzipWith=qr,Fd.update=function(u,e,d){return null==u?u:ut(u,e,at(d))},Fd.updateWith=function(u,e,d,n){return n="function"==typeof n?n:void 0,null==u?u:ut(u,e,at(d),n)},Fd.values=Ac,Fd.valuesIn=function(u){return null==u?[]:Oe(u,Dc(u))},Fd.without=Jr,Fd.words=Tc,Fd.wrap=function(u,e){return wa(at(e),u)},Fd.xor=Zr,Fd.xorBy=Vr,Fd.xorWith=Yr,Fd.zip=Qr,Fd.zipObject=function(u,e){return tt(u||[],e||[],zd)},Fd.zipObjectDeep=function(u,e){return tt(u||[],e||[],Un)},Fd.zipWith=Xr,Fd.entries=Cc,Fd.entriesIn=Fc,Fd.extend=fc,Fd.extendWith=ic,Zc(Fd,Fd),Fd.add=rf,Fd.attempt=Rc,Fd.camelCase=kc,Fd.capitalize=Sc,Fd.ceil=af,Fd.clamp=function(u,e,d){return void 0===d&&(d=e,e=void 0),void 0!==d&&(d=(d=tc(d))==d?d:0),void 0!==e&&(e=(e=tc(e))==e?e:0),Jd(tc(u),e,d)},Fd.clone=function(u){return Zd(u,4)},Fd.cloneDeep=function(u){return Zd(u,5)},Fd.cloneDeepWith=function(u,e){return Zd(u,5,e="function"==typeof e?e:void 0)},Fd.cloneWith=function(u,e){return Zd(u,4,e="function"==typeof e?e:void 0)},Fd.conformsTo=function(u,e){return null==e||Vd(u,e,gc(e))},Fd.deburr=Oc,Fd.defaultTo=function(u,e){return null==u||u!=u?e:u},Fd.divide=cf,Fd.endsWith=function(u,e,d){u=ac(u),e=Yn(e);var n=u.length,t=d=void 0===d?n:Jd(dc(d),0,n);return(d-=e.length)>=0&&u.slice(d,t)==e},Fd.eq=Aa,Fd.escape=function(u){return(u=ac(u))&&T.test(u)?u.replace(P,Pe):u},Fd.escapeRegExp=function(u){return(u=ac(u))&&q.test(u)?u.replace(H,"\\$&"):u},Fd.every=function(u,e,d){var n=ja(u)?ie:en;return d&&cr(u,e,d)&&(e=void 0),n(u,Vt(e,3))},Fd.find=ta,Fd.findIndex=Or,Fd.findKey=function(u,e){return ge(u,Vt(e,3),cn)},Fd.findLast=ra,Fd.findLastIndex=jr,Fd.findLastKey=function(u,e){return ge(u,Vt(e,3),fn)},Fd.floor=ff,Fd.forEach=aa,Fd.forEachRight=ca,Fd.forIn=function(u,e){return null==u?u:rn(u,Vt(e,3),Dc)},Fd.forInRight=function(u,e){return null==u?u:an(u,Vt(e,3),Dc)},Fd.forOwn=function(u,e){return u&&cn(u,Vt(e,3))},Fd.forOwnRight=function(u,e){return u&&fn(u,Vt(e,3))},Fd.get=mc,Fd.gt=ka,Fd.gte=Sa,Fd.has=function(u,e){return null!=u&&nr(u,e,hn)},Fd.hasIn=hc,Fd.head=Nr,Fd.identity=Gc,Fd.includes=function(u,e,d,n){u=Na(u)?u:Ac(u),d=d&&!n?dc(d):0;var t=u.length;return d<0&&(d=rd(t+d,0)),Za(u)?d<=t&&u.indexOf(e,d)>-1:!!t&&ye(u,e,d)>-1},Fd.indexOf=function(u,e,d){var n=null==u?0:u.length;if(!n)return-1;var t=null==d?0:dc(d);return t<0&&(t=rd(n+t,0)),ye(u,e,t)},Fd.inRange=function(u,e,d){return e=ec(e),void 0===d?(d=e,e=0):d=ec(d),function(u,e,d){return u>=ad(e,d)&&u=-9007199254740991&&u<=9007199254740991},Fd.isSet=Ja,Fd.isString=Za,Fd.isSymbol=Va,Fd.isTypedArray=Ya,Fd.isUndefined=function(u){return void 0===u},Fd.isWeakMap=function(u){return Ka(u)&&dr(u)==E},Fd.isWeakSet=function(u){return Ka(u)&&"[object WeakSet]"==pn(u)},Fd.join=function(u,e){return null==u?"":nd.call(u,e)},Fd.kebabCase=jc,Fd.last=Mr,Fd.lastIndexOf=function(u,e,d){var n=null==u?0:u.length;if(!n)return-1;var t=n;return void 0!==d&&(t=(t=dc(d))<0?rd(n+t,0):ad(t,n-1)),e==e?function(u,e,d){for(var n=d+1;n--;)if(u[n]===e)return n;return n}(u,e,t):De(u,xe,t,!0)},Fd.lowerCase=$c,Fd.lowerFirst=Nc,Fd.lt=Qa,Fd.lte=Xa,Fd.max=function(u){return u&&u.length?dn(u,Gc,mn):void 0},Fd.maxBy=function(u,e){return u&&u.length?dn(u,Vt(e,2),mn):void 0},Fd.mean=function(u){return Ie(u,Gc)},Fd.meanBy=function(u,e){return Ie(u,Vt(e,2))},Fd.min=function(u){return u&&u.length?dn(u,Gc,Cn):void 0},Fd.minBy=function(u,e){return u&&u.length?dn(u,Vt(e,2),Cn):void 0},Fd.stubArray=nf,Fd.stubFalse=tf,Fd.stubObject=function(){return{}},Fd.stubString=function(){return""},Fd.stubTrue=function(){return!0},Fd.multiply=lf,Fd.nth=function(u,e){return u&&u.length?On(u,dc(e)):void 0},Fd.noConflict=function(){return qu._===this&&(qu._=ku),this},Fd.noop=Vc,Fd.now=ma,Fd.pad=function(u,e,d){u=ac(u);var n=(e=dc(e))?Ge(u):0;if(!e||n>=e)return u;var t=(e-n)/2;return jt(Xe(t),d)+u+jt(Qe(t),d)},Fd.padEnd=function(u,e,d){u=ac(u);var n=(e=dc(e))?Ge(u):0;return e&&ne){var n=u;u=e,e=n}if(d||u%1||e%1){var t=id();return ad(u+t*(e-u+Ku("1e-"+((t+"").length-1))),e)}return Ln(u,e)},Fd.reduce=function(u,e,d){var n=ja(u)?he:Fe,t=arguments.length<3;return n(u,Vt(e,4),d,t,Xd)},Fd.reduceRight=function(u,e,d){var n=ja(u)?be:Fe,t=arguments.length<3;return n(u,Vt(e,4),d,t,un)},Fd.repeat=function(u,e,d){return e=(d?cr(u,e,d):void 0===e)?1:dc(e),Pn(ac(u),e)},Fd.replace=function(){var u=arguments,e=ac(u[0]);return u.length<3?e:e.replace(u[1],u[2])},Fd.result=function(u,e,d){var n=-1,t=(e=ct(e,u)).length;for(t||(t=1,u=void 0);++n9007199254740991)return[];var d=4294967295,n=ad(u,4294967295);u-=4294967295;for(var t=ke(n,e=Vt(e));++d=r)return u;var c=d-Ge(n);if(c<1)return n;var f=a?it(a,0,c).join(""):u.slice(0,c);if(void 0===t)return f+n;if(a&&(c+=f.length-c),qa(t)){if(u.slice(c).search(t)){var i,o=f;for(t.global||(t=bu(t.source,ac(nu.exec(t))+"g")),t.lastIndex=0;i=t.exec(o);)var l=i.index;f=f.slice(0,void 0===l?c:l)}}else if(u.indexOf(Yn(t),c)!=c){var s=f.lastIndexOf(t);s>-1&&(f=f.slice(0,s))}return f+n},Fd.unescape=function(u){return(u=ac(u))&&M.test(u)?u.replace(L,qe):u},Fd.uniqueId=function(u){var e=++wu;return ac(u)+e},Fd.upperCase=Pc,Fd.upperFirst=Mc,Fd.each=aa,Fd.eachRight=ca,Fd.first=Nr,Zc(Fd,(of={},cn(Fd,(function(u,e){Iu.call(Fd.prototype,e)||(of[e]=u)})),of),{chain:!1}),Fd.VERSION="4.17.15",ce(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(u){Fd[u].placeholder=Fd})),ce(["drop","take"],(function(u,e){Od.prototype[u]=function(d){d=void 0===d?1:rd(dc(d),0);var n=this.__filtered__&&!e?new Od(this):this.clone();return n.__filtered__?n.__takeCount__=ad(d,n.__takeCount__):n.__views__.push({size:ad(d,4294967295),type:u+(n.__dir__<0?"Right":"")}),n},Od.prototype[u+"Right"]=function(e){return this.reverse()[u](e).reverse()}})),ce(["filter","map","takeWhile"],(function(u,e){var d=e+1,n=1==d||3==d;Od.prototype[u]=function(u){var e=this.clone();return e.__iteratees__.push({iteratee:Vt(u,3),type:d}),e.__filtered__=e.__filtered__||n,e}})),ce(["head","last"],(function(u,e){var d="take"+(e?"Right":"");Od.prototype[u]=function(){return this[d](1).value()[0]}})),ce(["initial","tail"],(function(u,e){var d="drop"+(e?"":"Right");Od.prototype[u]=function(){return this.__filtered__?new Od(this):this[d](1)}})),Od.prototype.compact=function(){return this.filter(Gc)},Od.prototype.find=function(u){return this.filter(u).head()},Od.prototype.findLast=function(u){return this.reverse().find(u)},Od.prototype.invokeMap=Mn((function(u,e){return"function"==typeof u?new Od(this):this.map((function(d){return _n(d,u,e)}))})),Od.prototype.reject=function(u){return this.filter(xa(Vt(u)))},Od.prototype.slice=function(u,e){u=dc(u);var d=this;return d.__filtered__&&(u>0||e<0)?new Od(d):(u<0?d=d.takeRight(-u):u&&(d=d.drop(u)),void 0!==e&&(d=(e=dc(e))<0?d.dropRight(-e):d.take(e-u)),d)},Od.prototype.takeRightWhile=function(u){return this.reverse().takeWhile(u).reverse()},Od.prototype.toArray=function(){return this.take(4294967295)},cn(Od.prototype,(function(u,e){var d=/^(?:filter|find|map|reject)|While$/.test(e),n=/^(?:head|last)$/.test(e),t=Fd[n?"take"+("last"==e?"Right":""):e],r=n||/^find/.test(e);t&&(Fd.prototype[e]=function(){var e=this.__wrapped__,a=n?[1]:arguments,c=e instanceof Od,f=a[0],i=c||ja(e),o=function(u){var e=t.apply(Fd,me([u],a));return n&&l?e[0]:e};i&&d&&"function"==typeof f&&1!=f.length&&(c=i=!1);var l=this.__chain__,s=!!this.__actions__.length,p=r&&!l,m=c&&!s;if(!r&&i){e=m?e:new Od(this);var h=u.apply(e,a);return h.__actions__.push({func:ea,args:[o],thisArg:void 0}),new Sd(h,l)}return p&&m?u.apply(this,a):(h=this.thru(o),p?n?h.value()[0]:h.value():h)})})),ce(["pop","push","shift","sort","splice","unshift"],(function(u){var e=gu[u],d=/^(?:push|sort|unshift)$/.test(u)?"tap":"thru",n=/^(?:pop|shift)$/.test(u);Fd.prototype[u]=function(){var u=arguments;if(n&&!this.__chain__){var t=this.value();return e.apply(ja(t)?t:[],u)}return this[d]((function(d){return e.apply(ja(d)?d:[],u)}))}})),cn(Od.prototype,(function(u,e){var d=Fd[e];if(d){var n=d.name+"";Iu.call(_d,n)||(_d[n]=[]),_d[n].push({name:e,func:d})}})),_d[At(void 0,2).name]=[{name:"wrapper",func:void 0}],Od.prototype.clone=function(){var u=new Od(this.__wrapped__);return u.__actions__=vt(this.__actions__),u.__dir__=this.__dir__,u.__filtered__=this.__filtered__,u.__iteratees__=vt(this.__iteratees__),u.__takeCount__=this.__takeCount__,u.__views__=vt(this.__views__),u},Od.prototype.reverse=function(){if(this.__filtered__){var u=new Od(this);u.__dir__=-1,u.__filtered__=!0}else(u=this.clone()).__dir__*=-1;return u},Od.prototype.value=function(){var u=this.__wrapped__.value(),e=this.__dir__,d=ja(u),n=e<0,t=d?u.length:0,r=function(u,e,d){var n=-1,t=d.length;for(;++n=this.__values__.length;return{done:u,value:u?void 0:this.__values__[this.__index__++]}},Fd.prototype.plant=function(u){for(var e,d=this;d instanceof kd;){var n=Fr(d);n.__index__=0,n.__values__=void 0,e?t.__wrapped__=n:e=n;var t=n;d=d.__wrapped__}return t.__wrapped__=u,e},Fd.prototype.reverse=function(){var u=this.__wrapped__;if(u instanceof Od){var e=u;return this.__actions__.length&&(e=new Od(this)),(e=e.reverse()).__actions__.push({func:ea,args:[zr],thisArg:void 0}),new Sd(e,this.__chain__)}return this.thru(zr)},Fd.prototype.toJSON=Fd.prototype.valueOf=Fd.prototype.value=function(){return dt(this.__wrapped__,this.__actions__)},Fd.prototype.first=Fd.prototype.head,Qu&&(Fd.prototype[Qu]=function(){return this}),Fd}();qu._=Je,void 0===(t=function(){return Je}.call(e,d,e,n))||(n.exports=t)}).call(this)}).call(this,d(76),d(496)(u))},494:function(u,e,d){"use strict";var n=d(0),t=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});e.a=t},495:function(u,e,d){"use strict";d.d(e,"a",(function(){return r}));d(77),d(513),d(479),d(78);var n=d(515),t=d.n(n);function r(u,e){var d=new t.a;return u.map((function(u){var n=u;return"string"==typeof u&&(n={label:u,permalink:"/blog/tags/"+d.slug(u)}),function(u,e){var d=u.label.split(": ",2),n=d[0],t=d[1],r="primary";switch(e){case"blog":case"guides":r=function(u){switch(u){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(n)}return{category:n,count:u.count,label:u.label,permalink:u.permalink,style:r,value:t}}(n,e)}))}},496:function(u,e){u.exports=function(u){return u.webpackPolyfill||(u.deprecate=function(){},u.paths=[],u.children||(u.children=[]),Object.defineProperty(u,"loaded",{enumerable:!0,get:function(){return u.l}}),Object.defineProperty(u,"id",{enumerable:!0,get:function(){return u.i}}),u.webpackPolyfill=1),u}},505:function(u,e,d){var n=d(30),t=d(54),r=d(27),a=d(26),c=d(506);u.exports=function(u,e){var d=1==u,f=2==u,i=3==u,o=4==u,l=6==u,s=5==u||l,p=e||c;return function(e,c,m){for(var h,b,v=r(e),_=t(v),g=n(c,m,3),D=a(_.length),y=0,E=d?p(e,D):f?p(e,0):void 0;D>y;y++)if((s||y in _)&&(b=g(h=_[y],y,v),u))if(d)E[y]=b;else if(b)switch(u){case 3:return!0;case 5:return h;case 6:return y;case 2:E.push(h)}else if(o)return!1;return l?-1:i||o?o:E}}},506:function(u,e,d){var n=d(507);u.exports=function(u,e){return new(n(u))(e)}},507:function(u,e,d){var n=d(13),t=d(508),r=d(2)("species");u.exports=function(u){var e;return t(u)&&("function"!=typeof(e=u.constructor)||e!==Array&&!t(e.prototype)||(e=void 0),n(e)&&null===(e=e[r])&&(e=void 0)),void 0===e?Array:e}},508:function(u,e,d){var n=d(23);u.exports=Array.isArray||function(u){return"Array"==n(u)}},514:function(u,e,d){"use strict";var n=d(0),t=d.n(n),r=d(470),a=d(463),c=d.n(a);e.a=function(u){var e=u.count,d=u.label,n=u.permalink,a=u.style,f=u.value,i=u.valueOnly;return t.a.createElement(r.a,{to:n+"/",className:c()("badge","badge--rounded","badge--"+a)},i?f:d,e&&t.a.createElement(t.a.Fragment,null," (",e,")"))}},515:function(u,e,d){var n=d(516);u.exports=c;var t=Object.hasOwnProperty,r=/\s/g,a=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function c(){if(!(this instanceof c))return new c;this.reset()}function f(u,e){return"string"!=typeof u?"":(e||(u=u.toLowerCase()),u.trim().replace(a,"").replace(n(),"").replace(r,"-"))}c.prototype.slug=function(u,e){for(var d=f(u,!0===e),n=d;t.call(this.occurrences,d);)this.occurrences[n]++,d=n+"-"+this.occurrences[n];return this.occurrences[d]=0,d},c.prototype.reset=function(){this.occurrences=Object.create(null)},c.slug=f},516:function(u,e){u.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},521:function(u,e,d){"use strict";const n=d(533),t=u=>{if("string"!=typeof u)throw new TypeError("Expected a string");return u=(u=(u=n(u)).toLowerCase().replace(/[_-]+/g," ").replace(/\s{2,}/g," ").trim()).charAt(0).toUpperCase()+u.slice(1)};u.exports=t,u.exports.default=t},533:function(u,e,d){"use strict";const n=d(534);u.exports=(u,e)=>{if("string"!=typeof u)throw new TypeError("Expected a string");e=void 0===e?"_":e;const d=n("([\\p{Ll}\\d])(\\p{Lu})","g"),t=n("(\\p{Lu}+)(\\p{Lu}[\\p{Ll}\\d]+)","g");return u.replace(d,`$1${e}$2`).replace(t,`$1${e}$2`).toLowerCase()}},534:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=l(d(535)),t=l(d(536)),r=l(d(537)),a=l(d(538)),c=l(d(539)),f=l(d(540)),i=l(d(541)),o=l(d(542));function l(u){return u&&u.__esModule?u:{default:u}}(0,t.default)(n.default),(0,r.default)(n.default),(0,a.default)(n.default),(0,c.default)(n.default),(0,f.default)(n.default),(0,i.default)(n.default),(0,o.default)(n.default),e.default=n.default,u.exports=e.default},535:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n={astral:!1},t={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},r={},a={},c={},f=[],i={default:/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,class:/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},o=/\$(?:{([\w$]+)}|<([\w$]+)>|(\d\d?|[\s\S]))/g,l=void 0===t.exec.call(/()??/,"")[1],s=void 0!==/x/.flags,p={}.toString;function m(u){var e=!0;try{new RegExp("",u)}catch(d){e=!1}return e}var h=m("u"),b=m("y"),v={g:!0,i:!0,m:!0,u:h,y:b};function _(u,e,d,n,t){var r=void 0;if(u.xregexp={captureNames:e},t)return u;if(u.__proto__)u.__proto__=O.prototype;else for(r in O.prototype)u[r]=O.prototype[r];return u.xregexp.source=d,u.xregexp.flags=n?n.split("").sort().join(""):n,u}function g(u){return t.replace.call(u,/([\s\S])(?=[\s\S]*\1)/g,"")}function D(u,e){if(!O.isRegExp(u))throw new TypeError("Type RegExp expected");var d=u.xregexp||{},n=function(u){return s?u.flags:t.exec.call(/\/([a-z]*)$/i,RegExp.prototype.toString.call(u))[1]}(u),r="",a="",c=null,f=null;return(e=e||{}).removeG&&(a+="g"),e.removeY&&(a+="y"),a&&(n=t.replace.call(n,new RegExp("["+a+"]+","g"),"")),e.addG&&(r+="g"),e.addY&&(r+="y"),r&&(n=g(n+r)),e.isInternalOnly||(void 0!==d.source&&(c=d.source),null!=d.flags&&(f=r?g(d.flags+r):d.flags)),u=_(new RegExp(e.source||u.source,n),function(u){return!(!u.xregexp||!u.xregexp.captureNames)}(u)?d.captureNames.slice(0):null,c,f,e.isInternalOnly)}function y(u){return parseInt(u,16)}function E(u,e,d){return"("===u.input[u.index-1]||")"===u.input[u.index+u[0].length]||function(u,e,d){return t.test.call(-1!==d.indexOf("x")?/^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/,u.slice(e))}(u.input,u.index+u[0].length,d)?"":"(?:)"}function x(u){return parseInt(u,10).toString(16)}function I(u,e){return p.call(u)==="[object "+e+"]"}function w(u){for(;u.length<4;)u="0"+u;return u}function C(u){var e={};return I(u,"String")?(O.forEach(u,/[^\s,]+/,(function(u){e[u]=!0})),e):u}function F(u){if(!/^[\w$]$/.test(u))throw new Error("Flag must be a single character A-Za-z0-9_$");v[u]=!0}function A(u,e,d,n,t){for(var r=f.length,a=u[d],c=null,i=void 0,o=void 0;r--;)if(!((o=f[r]).leadChar&&o.leadChar!==a||o.scope!==n&&"all"!==o.scope||o.flag&&-1===e.indexOf(o.flag))&&(i=O.exec(u,o.regex,d,"sticky"))){c={matchLength:i[0].length,output:o.handler.call(t,i,n,e),reparse:o.reparse};break}return c}function k(u){n.astral=u}function S(u){if(null==u)throw new TypeError("Cannot convert null or undefined to object");return u}function O(u,e){if(O.isRegExp(u)){if(void 0!==e)throw new TypeError("Cannot supply flags when copying a RegExp");return D(u)}if(u=void 0===u?"":String(u),e=void 0===e?"":String(e),O.isInstalled("astral")&&-1===e.indexOf("A")&&(e+="A"),c[u]||(c[u]={}),!c[u][e]){for(var d={hasNamedCapture:!1,captureNames:[]},n="default",r="",a=0,f=void 0,o=function(u,e){var d=void 0;if(g(e)!==e)throw new SyntaxError("Invalid duplicate regex flag "+e);for(u=t.replace.call(u,/^\(\?([\w$]+)\)/,(function(u,d){if(t.test.call(/[gy]/,d))throw new SyntaxError("Cannot use flag g or y in mode modifier "+u);return e=g(e+d),""})),d=0;d"}else if(d)return"\\"+(+d+a);return u}if(!I(u,"Array")||!u.length)throw new TypeError("Must provide a nonempty array of patterns to merge");for(var i=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,o=[],l=void 0,s=0;s1&&-1!==d.indexOf("")){var n=D(this,{removeG:!0,isInternalOnly:!0});t.replace.call(String(u).slice(d.index),n,(function(){for(var u=arguments.length,e=Array(u),n=0;nd.index&&(this.lastIndex=d.index)}return this.global||(this.lastIndex=e),d},r.test=function(u){return!!r.exec.call(this,u)},r.match=function(u){if(O.isRegExp(u)){if(u.global){var e=t.match.apply(this,arguments);return u.lastIndex=0,e}}else u=new RegExp(u);return r.exec.call(u,S(this))},r.replace=function(u,e){var d=O.isRegExp(u),n=void 0,r=void 0,a=void 0;return d?(u.xregexp&&(r=u.xregexp.captureNames),n=u.lastIndex):u+="",a=I(e,"Function")?t.replace.call(String(this),u,(function(){for(var n=arguments.length,t=Array(n),a=0;ad.length-3)throw new SyntaxError("Backreference to undefined group "+u);return d[t]||""}throw new SyntaxError("Invalid token "+u)}})),d&&(u.global?u.lastIndex=0:u.lastIndex=n),a},r.split=function(u,e){if(!O.isRegExp(u))return t.split.apply(this,arguments);var d=String(this),n=[],r=u.lastIndex,a=0,c=void 0;return e=(void 0===e?-1:e)>>>0,O.forEach(d,u,(function(u){u.index+u[0].length>a&&(n.push(d.slice(a,u.index)),u.length>1&&u.indexe?n.slice(0,e):n},O.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,(function(u,e){if("B"===u[1]&&"default"===e)return u[0];throw new SyntaxError("Invalid escape "+u[0])}),{scope:"all",leadChar:"\\"}),O.addToken(/\\u{([\dA-Fa-f]+)}/,(function(u,e,d){var n=y(u[1]);if(n>1114111)throw new SyntaxError("Invalid Unicode code point "+u[0]);if(n<=65535)return"\\u"+w(x(n));if(h&&-1!==d.indexOf("u"))return u[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u")}),{scope:"all",leadChar:"\\"}),O.addToken(/\[(\^?)\]/,(function(u){return u[1]?"[\\s\\S]":"\\b\\B"}),{leadChar:"["}),O.addToken(/\(\?#[^)]*\)/,E,{leadChar:"("}),O.addToken(/\s+|#[^\n]*\n?/,E,{flag:"x"}),O.addToken(/\./,(function(){return"[\\s\\S]"}),{flag:"s",leadChar:"."}),O.addToken(/\\k<([\w$]+)>/,(function(u){var e=isNaN(u[1])?this.captureNames.indexOf(u[1])+1:+u[1],d=u.index+u[0].length;if(!e||e>this.captureNames.length)throw new SyntaxError("Backreference to undefined group "+u[0]);return"\\"+e+(d===u.input.length||isNaN(u.input[d])?"":"(?:)")}),{leadChar:"\\"}),O.addToken(/\\(\d+)/,(function(u,e){if(!("default"===e&&/^[1-9]/.test(u[1])&&+u[1]<=this.captureNames.length)&&"0"!==u[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group "+u[0]);return u[0]}),{scope:"all",leadChar:"\\"}),O.addToken(/\(\?P?<([\w$]+)>/,(function(u){if(!isNaN(u[1]))throw new SyntaxError("Cannot use integer as capture name "+u[0]);if("length"===u[1]||"__proto__"===u[1])throw new SyntaxError("Cannot use reserved word as capture name "+u[0]);if(-1!==this.captureNames.indexOf(u[1]))throw new SyntaxError("Cannot use same name for multiple groups "+u[0]);return this.captureNames.push(u[1]),this.hasNamedCapture=!0,"("}),{leadChar:"("}),O.addToken(/\((?!\?)/,(function(u,e,d){return-1!==d.indexOf("n")?"(?:":(this.captureNames.push(null),"(")}),{optionalFlags:"n",leadChar:"("}),e.default=O,u.exports=e.default},536:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){var e=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,d=u.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,e],"g",{conjunction:"or"});function n(u){var e=/^(?:\(\?:\))*\^/,d=/\$(?:\(\?:\))*$/;return e.test(u)&&d.test(u)&&d.test(u.replace(/\\[\s\S]/g,""))?u.replace(e,"").replace(d,""):u}function t(e,d){var n=d?"x":"";return u.isRegExp(e)?e.xregexp&&e.xregexp.captureNames?e:u(e.source,n):u(e,n)}function r(e){return e instanceof RegExp?e:u.escape(e)}function a(u,e,d){return u["subpattern"+d]=e,u}function c(u,e,d){return u+(e1?n-1:0),f=1;f"):f="(?:",h=m,""+f+o[a].pattern.replace(e,(function(u,e,d){if(e){if(c=o[a].names[m-h],++m,c)return"(?<"+c+">"}else if(d)return i=+d-1,o[a].names[i]?"\\k<"+o[a].names[i]+">":"\\"+(+d+h);return u}))+")"}if(t){if(c=_[b],v[++b]=++m,c)return"(?<"+c+">"}else if(r)return _[i=+r-1]?"\\k<"+_[i]+">":"\\"+v[+r];return u}));return u(g,c)}},u.exports=e.default},537:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){function e(u,e,d,n){return{name:u,value:e,start:d,end:n}}u.matchRecursive=function(d,n,t,r,a){a=a||{};var c=-1!==(r=r||"").indexOf("g"),f=-1!==r.indexOf("y"),i=r.replace(/y/g,""),o=a.escapeChar,l=a.valueNames,s=[],p=0,m=0,h=0,b=0,v=void 0,_=void 0,g=void 0,D=void 0,y=void 0;if(n=u(n,i),t=u(t,i),o){if(o.length>1)throw new Error("Cannot use more than one escape character");o=u.escape(o),y=new RegExp("(?:"+o+"[\\S\\s]|(?:(?!"+u.union([n,t],"",{conjunction:"or"}).source+")[^"+o+"])+)+",r.replace(/[^imu]+/g,""))}for(;;){if(o&&(h+=(u.exec(d,y,h,"sticky")||[""])[0].length),g=u.exec(d,n,h),D=u.exec(d,t,h),g&&D&&(g.index<=D.index?D=null:g=null),g||D)h=(m=(g||D).index)+(g||D)[0].length;else if(!p)break;if(f&&!p&&m>b)break;if(g)p||(v=m,_=h),++p;else{if(!D||!p)throw new Error("Unbalanced delimiter found in string");if(!--p&&(l?(l[0]&&v>b&&s.push(e(l[0],d.slice(b,v),b,v)),l[1]&&s.push(e(l[1],d.slice(v,_),v,_)),l[2]&&s.push(e(l[2],d.slice(_,m),_,m)),l[3]&&s.push(e(l[3],d.slice(m,h),m,h))):s.push(d.slice(_,m)),b=h,!c))break}m===h&&++h}return c&&!f&&l&&l[0]&&d.length>b&&s.push(e(l[0],d.slice(b),b,d.length)),s}},u.exports=e.default},538:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){var e={},d=u._dec,n=u._hex,t=u._pad4;function r(u){return u.replace(/[- _]+/g,"").toLowerCase()}function a(u){var e=/^\\[xu](.+)/.exec(u);return e?d(e[1]):u.charCodeAt("\\"===u[0]?1:0)}function c(d){var r,c,f;return e[d]["b!"]||(e[d]["b!"]=(r=e[d].bmp,c="",f=-1,u.forEach(r,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,(function(u){var e=a(u[1]);e>f+1&&(c+="\\u"+t(n(f+1)),e>f+2&&(c+="-\\u"+t(n(e-1)))),f=a(u[2]||u[1])})),f<65535&&(c+="\\u"+t(n(f+1)),f<65534&&(c+="-\\uFFFF")),c))}function f(u,d){var n=d?"a!":"a=";return e[u][n]||(e[u][n]=function(u,d){var n=e[u],t="";return n.bmp&&!n.isBmpLast&&(t="["+n.bmp+"]"+(n.astral?"|":"")),n.astral&&(t+=n.astral),n.isBmpLast&&n.bmp&&(t+=(n.astral?"|":"")+"["+n.bmp+"]"),d?"(?:(?!"+t+")(?:[\ud800-\udbff][\udc00-\udfff]|[\0-\uffff]))":"(?:"+t+")"}(u,d))}u.addToken(/\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/,(function(u,d,n){var t="P"===u[1]||!!u[2],a=-1!==n.indexOf("A"),i=r(u[4]||u[3]),o=e[i];if("P"===u[1]&&u[2])throw new SyntaxError("Invalid double negation "+u[0]);if(!e.hasOwnProperty(i))throw new SyntaxError("Unknown Unicode token "+u[0]);if(o.inverseOf){if(i=r(o.inverseOf),!e.hasOwnProperty(i))throw new ReferenceError("Unicode token missing data "+u[0]+" -> "+o.inverseOf);o=e[i],t=!t}if(!o.bmp&&!a)throw new SyntaxError("Astral mode required for Unicode token "+u[0]);if(a){if("class"===d)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");return f(i,t)}return"class"===d?t?c(i):o.bmp:(t?"[^":"[")+o.bmp+"]"}),{scope:"all",optionalFlags:"A",leadChar:"\\"}),u.addUnicodeData=function(d){for(var n=void 0,t=0;t\\x5E`\\x7C~\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20be\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83b[\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\x24\xa2-\xa5\u058f\u060b\u09f2\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20be\ua838\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\x5E`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u309b\u309c\ua700-\ua716\ua720\ua721\ua789\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3",astral:"\ud83c[\udffb-\udfff]"},{name:"Sm",alias:"Math_Symbol",bmp:"\\x2B<->\\x7C~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec",astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"\xa6\xa9\xae\xb0\u0482\u058d\u058e\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u214a\u214c\u214d\u214f\u218a\u218b\u2195-\u2199\u219c-\u219f\u21a1\u21a2\u21a4\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udffa]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Z",alias:"Separator",bmp:" \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:" \xa0\u1680\u2000-\u200a\u202f\u205f\u3000"}])},u.exports=e.default},541:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){if(!u.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");var e=[{name:"ASCII",bmp:"\0-\x7f"},{name:"Alphabetic",bmp:"A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0345\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05b0-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0657\u0659-\u065f\u066e-\u06d3\u06d5-\u06dc\u06e1-\u06e8\u06ed-\u06ef\u06fa-\u06fc\u06ff\u0710-\u073f\u074d-\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0817\u081a-\u082c\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08df\u08e3-\u08e9\u08f0-\u093b\u093d-\u094c\u094e-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c4\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac5\u0ac7-\u0ac9\u0acb\u0acc\u0ad0\u0ae0-\u0ae3\u0af9\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d-\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4c\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccc\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e46\u0e4d\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ecd\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f71-\u0f81\u0f88-\u0f97\u0f99-\u0fbc\u1000-\u1036\u1038\u103b-\u103f\u1050-\u1062\u1065-\u1068\u106e-\u1086\u108e\u109c\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135f\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17b3\u17b6-\u17c8\u17d7\u17dc\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u1938\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a61-\u1a74\u1aa7\u1b00-\u1b33\u1b35-\u1b43\u1b45-\u1b4b\u1b80-\u1ba9\u1bac-\u1baf\u1bba-\u1be5\u1be7-\u1bf1\u1c00-\u1c35\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1de7-\u1df4\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua674-\ua67b\ua67f-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua827\ua840-\ua873\ua880-\ua8c3\ua8c5\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua92a\ua930-\ua952\ua960-\ua97c\ua980-\ua9b2\ua9b4-\ua9bf\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a\uaa7e-\uaabe\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc00-\udc45\udc82-\udcb8\udcd0-\udce8\udd00-\udd32\udd50-\udd72\udd76\udd80-\uddbf\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude34\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udee8\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d-\udf44\udf47\udf48\udf4b\udf4c\udf50\udf57\udf5d-\udf63]|\ud805[\udc00-\udc41\udc43-\udc45\udc47-\udc4a\udc80-\udcc1\udcc4\udcc5\udcc7\udd80-\uddb5\uddb8-\uddbe\uddd8-\udddd\ude00-\ude3e\ude40\ude44\ude80-\udeb5\udf00-\udf19\udf1d-\udf2a]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc3e\udc40\udc72-\udc8f\udc92-\udca7\udca9-\udcb6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf36\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9e]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd47]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Any",isBmpLast:!0,bmp:"\0-\uffff",astral:"[\ud800-\udbff][\udc00-\udfff]"},{name:"Default_Ignorable_Code_Point",bmp:"\xad\u034f\u061c\u115f\u1160\u17b4\u17b5\u180b-\u180e\u200b-\u200f\u202a-\u202e\u2060-\u206f\u3164\ufe00-\ufe0f\ufeff\uffa0\ufff0-\ufff8",astral:"\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|[\udb40-\udb43][\udc00-\udfff]"},{name:"Lowercase",bmp:"a-z\xaa\xb5\xba\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02b8\u02c0\u02c1\u02e0-\u02e4\u0345\u0371\u0373\u0377\u037a-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0561-\u0587\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1dbf\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u2071\u207f\u2090-\u209c\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2170-\u217f\u2184\u24d0-\u24e9\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7d\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b-\ua69d\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7b5\ua7b7\ua7f8-\ua7fa\uab30-\uab5a\uab5c-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a",astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud83a[\udd22-\udd43]"},{name:"Noncharacter_Code_Point",bmp:"\ufdd0-\ufdef\ufffe\uffff",astral:"[\ud83f\ud87f\ud8bf\ud8ff\ud93f\ud97f\ud9bf\ud9ff\uda3f\uda7f\udabf\udaff\udb3f\udb7f\udbbf\udbff][\udffe\udfff]"},{name:"Uppercase",bmp:"A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2160-\u216f\u2183\u24b6-\u24cf\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\uff21-\uff3a",astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]"},{name:"White_Space",bmp:"\t-\r \x85\xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"}];e.push({name:"Assigned",inverseOf:"Cn"}),u.addUnicodeData(e)},u.exports=e.default},542:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){if(!u.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");u.addUnicodeData([{name:"Adlam",astral:"\ud83a[\udd00-\udd4a\udd50-\udd59\udd5e\udd5f]"},{name:"Ahom",astral:"\ud805[\udf00-\udf19\udf1d-\udf2b\udf30-\udf3f]"},{name:"Anatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude46]"},{name:"Arabic",bmp:"\u0600-\u0604\u0606-\u060b\u060d-\u061a\u061e\u0620-\u063f\u0641-\u064a\u0656-\u066f\u0671-\u06dc\u06de-\u06ff\u0750-\u077f\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08e1\u08e3-\u08ff\ufb50-\ufbc1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfd\ufe70-\ufe74\ufe76-\ufefc",astral:"\ud803[\ude60-\ude7e]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb\udef0\udef1]"},{name:"Armenian",bmp:"\u0531-\u0556\u0559-\u055f\u0561-\u0587\u058a\u058d-\u058f\ufb13-\ufb17"},{name:"Avestan",astral:"\ud802[\udf00-\udf35\udf39-\udf3f]"},{name:"Balinese",bmp:"\u1b00-\u1b4b\u1b50-\u1b7c"},{name:"Bamum",bmp:"\ua6a0-\ua6f7",astral:"\ud81a[\udc00-\ude38]"},{name:"Bassa_Vah",astral:"\ud81a[\uded0-\udeed\udef0-\udef5]"},{name:"Batak",bmp:"\u1bc0-\u1bf3\u1bfc-\u1bff"},{name:"Bengali",bmp:"\u0980-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09fb"},{name:"Bhaiksuki",astral:"\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc45\udc50-\udc6c]"},{name:"Bopomofo",bmp:"\u02ea\u02eb\u3105-\u312d\u31a0-\u31ba"},{name:"Brahmi",astral:"\ud804[\udc00-\udc4d\udc52-\udc6f\udc7f]"},{name:"Braille",bmp:"\u2800-\u28ff"},{name:"Buginese",bmp:"\u1a00-\u1a1b\u1a1e\u1a1f"},{name:"Buhid",bmp:"\u1740-\u1753"},{name:"Canadian_Aboriginal",bmp:"\u1400-\u167f\u18b0-\u18f5"},{name:"Carian",astral:"\ud800[\udea0-\uded0]"},{name:"Caucasian_Albanian",astral:"\ud801[\udd30-\udd63\udd6f]"},{name:"Chakma",astral:"\ud804[\udd00-\udd34\udd36-\udd43]"},{name:"Cham",bmp:"\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f"},{name:"Cherokee",bmp:"\u13a0-\u13f5\u13f8-\u13fd\uab70-\uabbf"},{name:"Common",bmp:"\0-@\\x5B-`\\x7B-\xa9\xab-\xb9\xbb-\xbf\xd7\xf7\u02b9-\u02df\u02e5-\u02e9\u02ec-\u02ff\u0374\u037e\u0385\u0387\u0589\u0605\u060c\u061b\u061c\u061f\u0640\u06dd\u08e2\u0964\u0965\u0e3f\u0fd5-\u0fd8\u10fb\u16eb-\u16ed\u1735\u1736\u1802\u1803\u1805\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u2000-\u200b\u200e-\u2064\u2066-\u2070\u2074-\u207e\u2080-\u208e\u20a0-\u20be\u2100-\u2125\u2127-\u2129\u212c-\u2131\u2133-\u214d\u214f-\u215f\u2189-\u218b\u2190-\u23fe\u2400-\u2426\u2440-\u244a\u2460-\u27ff\u2900-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2e00-\u2e44\u2ff0-\u2ffb\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303c-\u303f\u309b\u309c\u30a0\u30fb\u30fc\u3190-\u319f\u31c0-\u31e3\u3220-\u325f\u327f-\u32cf\u3358-\u33ff\u4dc0-\u4dff\ua700-\ua721\ua788-\ua78a\ua830-\ua839\ua92e\ua9cf\uab5b\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe66\ufe68-\ufe6b\ufeff\uff01-\uff20\uff3b-\uff40\uff5b-\uff65\uff70\uff9e\uff9f\uffe0-\uffe6\uffe8-\uffee\ufff9-\ufffd",astral:"\ud800[\udd00-\udd02\udd07-\udd33\udd37-\udd3f\udd90-\udd9b\uddd0-\uddfc\udee1-\udefb]|\ud82f[\udca0-\udca3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd66\udd6a-\udd7a\udd83\udd84\udd8c-\udda9\uddae-\udde8\udf00-\udf56\udf60-\udf71]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udfcb\udfce-\udfff]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd00-\udd0c\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\uddff\ude01\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|\udb40[\udc01\udc20-\udc7f]"},{name:"Coptic",bmp:"\u03e2-\u03ef\u2c80-\u2cf3\u2cf9-\u2cff"},{name:"Cuneiform",astral:"\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc70-\udc74\udc80-\udd43]"},{name:"Cypriot",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f]"},{name:"Cyrillic",bmp:"\u0400-\u0484\u0487-\u052f\u1c80-\u1c88\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f"},{name:"Deseret",astral:"\ud801[\udc00-\udc4f]"},{name:"Devanagari",bmp:"\u0900-\u0950\u0953-\u0963\u0966-\u097f\ua8e0-\ua8fd"},{name:"Duployan",astral:"\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9c-\udc9f]"},{name:"Egyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]"},{name:"Elbasan",astral:"\ud801[\udd00-\udd27]"},{name:"Ethiopic",bmp:"\u1200-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u137c\u1380-\u1399\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e"},{name:"Georgian",bmp:"\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u10ff\u2d00-\u2d25\u2d27\u2d2d"},{name:"Glagolitic",bmp:"\u2c00-\u2c2e\u2c30-\u2c5e",astral:"\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]"},{name:"Gothic",astral:"\ud800[\udf30-\udf4a]"},{name:"Grantha",astral:"\ud804[\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3c-\udf44\udf47\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]"},{name:"Greek",bmp:"\u0370-\u0373\u0375-\u0377\u037a-\u037d\u037f\u0384\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03e1\u03f0-\u03ff\u1d26-\u1d2a\u1d5d-\u1d61\u1d66-\u1d6a\u1dbf\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2126\uab65",astral:"\ud800[\udd40-\udd8e\udda0]|\ud834[\ude00-\ude45]"},{name:"Gujarati",bmp:"\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0af1\u0af9"},{name:"Gurmukhi",bmp:"\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75"},{name:"Han",bmp:"\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u3005\u3007\u3021-\u3029\u3038-\u303b\u3400-\u4db5\u4e00-\u9fd5\uf900-\ufa6d\ufa70-\ufad9",astral:"[\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Hangul",bmp:"\u1100-\u11ff\u302e\u302f\u3131-\u318e\u3200-\u321e\u3260-\u327e\ua960-\ua97c\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"},{name:"Hanunoo",bmp:"\u1720-\u1734"},{name:"Hatran",astral:"\ud802[\udce0-\udcf2\udcf4\udcf5\udcfb-\udcff]"},{name:"Hebrew",bmp:"\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufb4f"},{name:"Hiragana",bmp:"\u3041-\u3096\u309d-\u309f",astral:"\ud82c\udc01|\ud83c\ude00"},{name:"Imperial_Aramaic",astral:"\ud802[\udc40-\udc55\udc57-\udc5f]"},{name:"Inherited",bmp:"\u0300-\u036f\u0485\u0486\u064b-\u0655\u0670\u0951\u0952\u1ab0-\u1abe\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u200c\u200d\u20d0-\u20f0\u302a-\u302d\u3099\u309a\ufe00-\ufe0f\ufe20-\ufe2d",astral:"\ud800[\uddfd\udee0]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad]|\udb40[\udd00-\uddef]"},{name:"Inscriptional_Pahlavi",astral:"\ud802[\udf60-\udf72\udf78-\udf7f]"},{name:"Inscriptional_Parthian",astral:"\ud802[\udf40-\udf55\udf58-\udf5f]"},{name:"Javanese",bmp:"\ua980-\ua9cd\ua9d0-\ua9d9\ua9de\ua9df"},{name:"Kaithi",astral:"\ud804[\udc80-\udcc1]"},{name:"Kannada",bmp:"\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2"},{name:"Katakana",bmp:"\u30a1-\u30fa\u30fd-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff6f\uff71-\uff9d",astral:"\ud82c\udc00"},{name:"Kayah_Li",bmp:"\ua900-\ua92d\ua92f"},{name:"Kharoshthi",astral:"\ud802[\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f-\ude47\ude50-\ude58]"},{name:"Khmer",bmp:"\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9\u19e0-\u19ff"},{name:"Khojki",astral:"\ud804[\ude00-\ude11\ude13-\ude3e]"},{name:"Khudawadi",astral:"\ud804[\udeb0-\udeea\udef0-\udef9]"},{name:"Lao",bmp:"\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf"},{name:"Latin",bmp:"A-Za-z\xaa\xba\xc0-\xd6\xd8-\xf6\xf8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua7ff\uab30-\uab5a\uab5c-\uab64\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a"},{name:"Lepcha",bmp:"\u1c00-\u1c37\u1c3b-\u1c49\u1c4d-\u1c4f"},{name:"Limbu",bmp:"\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1940\u1944-\u194f"},{name:"Linear_A",astral:"\ud801[\ude00-\udf36\udf40-\udf55\udf60-\udf67]"},{name:"Linear_B",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa]"},{name:"Lisu",bmp:"\ua4d0-\ua4ff"},{name:"Lycian",astral:"\ud800[\ude80-\ude9c]"},{name:"Lydian",astral:"\ud802[\udd20-\udd39\udd3f]"},{name:"Mahajani",astral:"\ud804[\udd50-\udd76]"},{name:"Malayalam",bmp:"\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4f\u0d54-\u0d63\u0d66-\u0d7f"},{name:"Mandaic",bmp:"\u0840-\u085b\u085e"},{name:"Manichaean",astral:"\ud802[\udec0-\udee6\udeeb-\udef6]"},{name:"Marchen",astral:"\ud807[\udc70-\udc8f\udc92-\udca7\udca9-\udcb6]"},{name:"Meetei_Mayek",bmp:"\uaae0-\uaaf6\uabc0-\uabed\uabf0-\uabf9"},{name:"Mende_Kikakui",astral:"\ud83a[\udc00-\udcc4\udcc7-\udcd6]"},{name:"Meroitic_Cursive",astral:"\ud802[\udda0-\uddb7\uddbc-\uddcf\uddd2-\uddff]"},{name:"Meroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"Miao",astral:"\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]"},{name:"Modi",astral:"\ud805[\ude00-\ude44\ude50-\ude59]"},{name:"Mongolian",bmp:"\u1800\u1801\u1804\u1806-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18aa",astral:"\ud805[\ude60-\ude6c]"},{name:"Mro",astral:"\ud81a[\ude40-\ude5e\ude60-\ude69\ude6e\ude6f]"},{name:"Multani",astral:"\ud804[\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea9]"},{name:"Myanmar",bmp:"\u1000-\u109f\ua9e0-\ua9fe\uaa60-\uaa7f"},{name:"Nabataean",astral:"\ud802[\udc80-\udc9e\udca7-\udcaf]"},{name:"New_Tai_Lue",bmp:"\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de\u19df"},{name:"Newa",astral:"\ud805[\udc00-\udc59\udc5b\udc5d]"},{name:"Nko",bmp:"\u07c0-\u07fa"},{name:"Ogham",bmp:"\u1680-\u169c"},{name:"Ol_Chiki",bmp:"\u1c50-\u1c7f"},{name:"Old_Hungarian",astral:"\ud803[\udc80-\udcb2\udcc0-\udcf2\udcfa-\udcff]"},{name:"Old_Italic",astral:"\ud800[\udf00-\udf23]"},{name:"Old_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"Old_Permic",astral:"\ud800[\udf50-\udf7a]"},{name:"Old_Persian",astral:"\ud800[\udfa0-\udfc3\udfc8-\udfd5]"},{name:"Old_South_Arabian",astral:"\ud802[\ude60-\ude7f]"},{name:"Old_Turkic",astral:"\ud803[\udc00-\udc48]"},{name:"Oriya",bmp:"\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b77"},{name:"Osage",astral:"\ud801[\udcb0-\udcd3\udcd8-\udcfb]"},{name:"Osmanya",astral:"\ud801[\udc80-\udc9d\udca0-\udca9]"},{name:"Pahawh_Hmong",astral:"\ud81a[\udf00-\udf45\udf50-\udf59\udf5b-\udf61\udf63-\udf77\udf7d-\udf8f]"},{name:"Palmyrene",astral:"\ud802[\udc60-\udc7f]"},{name:"Pau_Cin_Hau",astral:"\ud806[\udec0-\udef8]"},{name:"Phags_Pa",bmp:"\ua840-\ua877"},{name:"Phoenician",astral:"\ud802[\udd00-\udd1b\udd1f]"},{name:"Psalter_Pahlavi",astral:"\ud802[\udf80-\udf91\udf99-\udf9c\udfa9-\udfaf]"},{name:"Rejang",bmp:"\ua930-\ua953\ua95f"},{name:"Runic",bmp:"\u16a0-\u16ea\u16ee-\u16f8"},{name:"Samaritan",bmp:"\u0800-\u082d\u0830-\u083e"},{name:"Saurashtra",bmp:"\ua880-\ua8c5\ua8ce-\ua8d9"},{name:"Sharada",astral:"\ud804[\udd80-\uddcd\uddd0-\udddf]"},{name:"Shavian",astral:"\ud801[\udc50-\udc7f]"},{name:"Siddham",astral:"\ud805[\udd80-\uddb5\uddb8-\udddd]"},{name:"SignWriting",astral:"\ud836[\udc00-\ude8b\ude9b-\ude9f\udea1-\udeaf]"},{name:"Sinhala",bmp:"\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4",astral:"\ud804[\udde1-\uddf4]"},{name:"Sora_Sompeng",astral:"\ud804[\udcd0-\udce8\udcf0-\udcf9]"},{name:"Sundanese",bmp:"\u1b80-\u1bbf\u1cc0-\u1cc7"},{name:"Syloti_Nagri",bmp:"\ua800-\ua82b"},{name:"Syriac",bmp:"\u0700-\u070d\u070f-\u074a\u074d-\u074f"},{name:"Tagalog",bmp:"\u1700-\u170c\u170e-\u1714"},{name:"Tagbanwa",bmp:"\u1760-\u176c\u176e-\u1770\u1772\u1773"},{name:"Tai_Le",bmp:"\u1950-\u196d\u1970-\u1974"},{name:"Tai_Tham",bmp:"\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad"},{name:"Tai_Viet",bmp:"\uaa80-\uaac2\uaadb-\uaadf"},{name:"Takri",astral:"\ud805[\ude80-\udeb7\udec0-\udec9]"},{name:"Tamil",bmp:"\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bfa"},{name:"Tangut",astral:"\ud81b\udfe0|[\ud81c-\ud820][\udc00-\udfff]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]"},{name:"Telugu",bmp:"\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f"},{name:"Thaana",bmp:"\u0780-\u07b1"},{name:"Thai",bmp:"\u0e01-\u0e3a\u0e40-\u0e5b"},{name:"Tibetan",bmp:"\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc\u0fce-\u0fd4\u0fd9\u0fda"},{name:"Tifinagh",bmp:"\u2d30-\u2d67\u2d6f\u2d70\u2d7f"},{name:"Tirhuta",astral:"\ud805[\udc80-\udcc7\udcd0-\udcd9]"},{name:"Ugaritic",astral:"\ud800[\udf80-\udf9d\udf9f]"},{name:"Vai",bmp:"\ua500-\ua62b"},{name:"Warang_Citi",astral:"\ud806[\udca0-\udcf2\udcff]"},{name:"Yi",bmp:"\ua000-\ua48c\ua490-\ua4c6"}])},u.exports=e.default},638:function(u,e,d){u.exports=function(){var u=[],e=[],d={},n={},t={};function r(u){return"string"==typeof u?new RegExp("^"+u+"$","i"):u}function a(u,e){return u===e?e:u===u.toLowerCase()?e.toLowerCase():u===u.toUpperCase()?e.toUpperCase():u[0]===u[0].toUpperCase()?e.charAt(0).toUpperCase()+e.substr(1).toLowerCase():e.toLowerCase()}function c(u,e){return u.replace(/\$(\d{1,2})/g,(function(u,d){return e[d]||""}))}function f(u,e){return u.replace(e[0],(function(d,n){var t=c(e[1],arguments);return a(""===d?u[n-1]:d,t)}))}function i(u,e,n){if(!u.length||d.hasOwnProperty(u))return e;for(var t=n.length;t--;){var r=n[t];if(r[0].test(e))return f(e,r)}return e}function o(u,e,d){return function(n){var t=n.toLowerCase();return e.hasOwnProperty(t)?a(n,t):u.hasOwnProperty(t)?a(n,u[t]):i(t,n,d)}}function l(u,e,d,n){return function(n){var t=n.toLowerCase();return!!e.hasOwnProperty(t)||!u.hasOwnProperty(t)&&i(t,t,d)===t}}function s(u,e,d){return(d?e+" ":"")+(1===e?s.singular(u):s.plural(u))}return s.plural=o(t,n,u),s.isPlural=l(t,n,u),s.singular=o(n,t,e),s.isSingular=l(n,t,e),s.addPluralRule=function(e,d){u.push([r(e),d])},s.addSingularRule=function(u,d){e.push([r(u),d])},s.addUncountableRule=function(u){"string"!=typeof u?(s.addPluralRule(u,"$0"),s.addSingularRule(u,"$0")):d[u.toLowerCase()]=!0},s.addIrregularRule=function(u,e){e=e.toLowerCase(),u=u.toLowerCase(),t[u]=e,n[e]=u},[["I","we"],["me","us"],["he","they"],["she","they"],["them","them"],["myself","ourselves"],["yourself","yourselves"],["itself","themselves"],["herself","themselves"],["himself","themselves"],["themself","themselves"],["is","are"],["was","were"],["has","have"],["this","these"],["that","those"],["echo","echoes"],["dingo","dingoes"],["volcano","volcanoes"],["tornado","tornadoes"],["torpedo","torpedoes"],["genus","genera"],["viscus","viscera"],["stigma","stigmata"],["stoma","stomata"],["dogma","dogmata"],["lemma","lemmata"],["schema","schemata"],["anathema","anathemata"],["ox","oxen"],["axe","axes"],["die","dice"],["yes","yeses"],["foot","feet"],["eave","eaves"],["goose","geese"],["tooth","teeth"],["quiz","quizzes"],["human","humans"],["proof","proofs"],["carve","carves"],["valve","valves"],["looey","looies"],["thief","thieves"],["groove","grooves"],["pickaxe","pickaxes"],["passerby","passersby"]].forEach((function(u){return s.addIrregularRule(u[0],u[1])})),[[/s?$/i,"s"],[/[^\u0000-\u007F]$/i,"$0"],[/([^aeiou]ese)$/i,"$1"],[/(ax|test)is$/i,"$1es"],[/(alias|[^aou]us|t[lm]as|gas|ris)$/i,"$1es"],[/(e[mn]u)s?$/i,"$1s"],[/([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$/i,"$1"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1i"],[/(alumn|alg|vertebr)(?:a|ae)$/i,"$1ae"],[/(seraph|cherub)(?:im)?$/i,"$1im"],[/(her|at|gr)o$/i,"$1oes"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i,"$1a"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i,"$1a"],[/sis$/i,"ses"],[/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i,"$1$2ves"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/([^ch][ieo][ln])ey$/i,"$1ies"],[/(x|ch|ss|sh|zz)$/i,"$1es"],[/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i,"$1ices"],[/\b((?:tit)?m|l)(?:ice|ouse)$/i,"$1ice"],[/(pe)(?:rson|ople)$/i,"$1ople"],[/(child)(?:ren)?$/i,"$1ren"],[/eaux$/i,"$0"],[/m[ae]n$/i,"men"],["thou","you"]].forEach((function(u){return s.addPluralRule(u[0],u[1])})),[[/s$/i,""],[/(ss)$/i,"$1"],[/(wi|kni|(?:after|half|high|low|mid|non|night|[^\w]|^)li)ves$/i,"$1fe"],[/(ar|(?:wo|[ae])l|[eo][ao])ves$/i,"$1f"],[/ies$/i,"y"],[/\b([pl]|zomb|(?:neck|cross)?t|coll|faer|food|gen|goon|group|lass|talk|goal|cut)ies$/i,"$1ie"],[/\b(mon|smil)ies$/i,"$1ey"],[/\b((?:tit)?m|l)ice$/i,"$1ouse"],[/(seraph|cherub)im$/i,"$1"],[/(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|t[lm]as|gas|(?:her|at|gr)o|[aeiou]ris)(?:es)?$/i,"$1"],[/(analy|diagno|parenthe|progno|synop|the|empha|cri|ne)(?:sis|ses)$/i,"$1sis"],[/(movie|twelve|abuse|e[mn]u)s$/i,"$1"],[/(test)(?:is|es)$/i,"$1is"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1us"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i,"$1um"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i,"$1on"],[/(alumn|alg|vertebr)ae$/i,"$1a"],[/(cod|mur|sil|vert|ind)ices$/i,"$1ex"],[/(matr|append)ices$/i,"$1ix"],[/(pe)(rson|ople)$/i,"$1rson"],[/(child)ren$/i,"$1"],[/(eau)x?$/i,"$1"],[/men$/i,"man"]].forEach((function(u){return s.addSingularRule(u[0],u[1])})),["adulthood","advice","agenda","aid","aircraft","alcohol","ammo","analytics","anime","athletics","audio","bison","blood","bream","buffalo","butter","carp","cash","chassis","chess","clothing","cod","commerce","cooperation","corps","debris","diabetes","digestion","elk","energy","equipment","excretion","expertise","firmware","flounder","fun","gallows","garbage","graffiti","hardware","headquarters","health","herpes","highjinks","homework","housework","information","jeans","justice","kudos","labour","literature","machinery","mackerel","mail","media","mews","moose","music","mud","manga","news","only","personnel","pike","plankton","pliers","police","pollution","premises","rain","research","rice","salmon","scissors","series","sewage","shambles","shrimp","software","species","staff","swine","tennis","traffic","transportation","trout","tuna","wealth","welfare","whiting","wildebeest","wildlife","you",/pok[e\xe9]mon$/i,/[^aeiou]ese$/i,/deer$/i,/fish$/i,/measles$/i,/o[iu]s$/i,/pox$/i,/sheep$/i].forEach(s.addUncountableRule),s}()}}]); \ No newline at end of file diff --git a/3116c1fa.c98a3097.js.LICENSE.txt b/3116c1fa.facd92c7.js.LICENSE.txt similarity index 100% rename from 3116c1fa.c98a3097.js.LICENSE.txt rename to 3116c1fa.facd92c7.js.LICENSE.txt diff --git a/3ccabad0.2f605f51.js b/3ccabad0.dca281c4.js similarity index 99% rename from 3ccabad0.2f605f51.js rename to 3ccabad0.dca281c4.js index 40102f2f7b..b188c2fafb 100644 --- a/3ccabad0.2f605f51.js +++ b/3ccabad0.dca281c4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{226:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return m}));var a=n(1),r=n(9),l=(n(0),n(465)),o=n(477),s=n(479),i=(n(472),n(464)),c={last_modified_on:"2024-02-06",title:"Configuration",description:"Configure Qovery BYOK on your Kubernetes cluster"},b={id:"getting-started/install-qovery/kubernetes/byok-config",title:"Configuration",description:"Configure Qovery BYOK on your Kubernetes cluster",source:"@site/docs/getting-started/install-qovery/kubernetes/byok-config.md",permalink:"/docs/getting-started/install-qovery/kubernetes/byok-config",sidebar:"docs",previous:{title:"Quickstart",permalink:"/docs/getting-started/install-qovery/kubernetes/quickstart"},next:{title:"Validate the installation",permalink:"/docs/getting-started/install-qovery/kubernetes/validate-installation"}},u=[{value:"Components",id:"components",children:[]},{value:"Configuration",id:"configuration",children:[{value:"Qovery",id:"qovery",children:[]},{value:"Ingress",id:"ingress",children:[]},{value:"DNS",id:"dns",children:[]},{value:"Logging",id:"logging",children:[]},{value:"Certificates",id:"certificates",children:[]},{value:"Observability",id:"observability",children:[]}]}],d={rightToc:u};function m(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(l.b)("wrapper",Object(a.a)({},d,n,{components:t,mdxType:"MDXLayout"}),Object(l.b)("p",null,"Qovery BYOK is a set of Kubernetes components that you can configure to fit your needs. It is used to connect your Kubernetes cluster to Qovery control plane."),Object(l.b)("h2",{id:"components"},"Components"),Object(l.b)("p",{align:"center"},Object(l.b)("img",{src:"/img/qovery_byok_how_it_works.jpg",alt:"How Qovery works with Self Managed Kubernetes cluster"})),Object(l.b)("p",null,"They are two types of components:"),Object(l.b)("p",null,"Qovery components:"),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"Qovery Control Plane: the Qovery Control Plane is the brain of Qovery. It is responsible for managing your applications and providing the API to interact with Qovery."),Object(l.b)("li",{parentName:"ul"},"Qovery Cluster Agent (mandatory): the Qovery Cluster Agent is responsible for securely forwarding logs and metrics from your Kubernetes cluster to Qovery control plane."),Object(l.b)("li",{parentName:"ul"},"Qovery Shell Agent (mandatory): the Qovery Shell Agent is responsible for giving you a secure remote shell access to your Kubernetes pods if you need it. E.g. when using ",Object(l.b)("inlineCode",{parentName:"li"},"qovery shell")," command."),Object(l.b)("li",{parentName:"ul"},"Qovery Engine (optional): the Qovery Engine is responsible for managing your applications deployment on your Kubernetes cluster. It can be used Qovery side or is installed on your Kubernetes cluster.")),Object(l.b)("p",null,"Third-party components:"),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"NGINX Ingress Controller (optional)"),Object(l.b)("li",{parentName:"ul"},"External DNS (optional)"),Object(l.b)("li",{parentName:"ul"},"Loki (optional)"),Object(l.b)("li",{parentName:"ul"},"Promtail (optional)"),Object(l.b)("li",{parentName:"ul"},"Cert Manager (optional)"),Object(l.b)("li",{parentName:"ul"},"...")),Object(l.b)("p",null,"Within the values.yaml file of the helm chart you can choose what you want to install and manage, and you will have a description of what services are used, and responsible for. You can disable them if you don't want to use them. And you can even install other components if you want to."),Object(l.b)("h2",{id:"configuration"},"Configuration"),Object(l.b)("p",null,"At the top of the values file you will find a list of component that you can activate or not. "),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"services:\n qovery:\n qovery-cluster-agent:\n enabled: true\n qovery-shell-agent:\n enabled: true\n qovery-engine:\n enabled: false\n ingress:\n ingress-nginx:\n enabled: true\n...\n")),Object(l.b)("p",null,"Here's the complete list and the documentation explaining how to configure it."),Object(l.b)("h3",{id:"qovery"},"Qovery"),Object(l.b)("p",null,"This is the configuration of Qovery itself and it is used by all Qovery components. This configuration is automatically generated when creating the cluster on the Qovery console (see ","[docs.getting-started.install-qovery.kubernetes.quickstart#install-qovery]",")"),Object(l.b)(i.a,{type:"danger",mdxType:"Alert"},Object(l.b)("p",null,Object(l.b)("strong",{parentName:"p"},"Do not share the jwtToken! Keep it in a safe place.")," It is used to authenticate the cluster.")),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Key"),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Required"),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.clusterId")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The cluster ID. It is used to identify your cluster.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.clusterShortId")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The short cluster ID. It is used to identify your cluster.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.organizationId")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The organization ID. It is used to identify your organization.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.jwtToken")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The JWT token. It is used to authenticate your cluster.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.domain")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The domain name used by Qovery.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.domainWildcard")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The wildcard domain name used by Qovery.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.qoveryDnsUrl")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Qovery DNS url in case you want to use Qovery provided DNS")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.lokiUrl")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Local Loki URL (required if Loki is set)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.promtailLokiUrl")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Promtail Loki URL (required if Promtail and Loki are set)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.acmeEmailAddr")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Email address used for ",Object(l.b)("inlineCode",{parentName:"td"},"Let's Encrypt")," TLS requests")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.externalDnsPrefix")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"ExernalDNS TXT record prefix (required if ExternalDNS is set)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.architectures")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Set cluster architectures (comma separated)")))),Object(l.b)("h4",{id:"qovery-cluster-agent"},"Qovery Cluster Agent"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The cluster agent is responsible for securely forwarding logs and metrics from your Kubernetes cluster to Qovery control plane")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The cluster will not report to Qovery control plane Kubernetes information, so the Qovery console will report unknown satus values")))),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"qovery-cluster-agent:\n fullnameOverride: qovery-cluster-agent\n")),Object(l.b)("h4",{id:"qovery-shell-agent"},"Qovery Shell Agent"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Used to give a remote shell access to you Kubernetes pods (if user is allowed from Qovery RBAC) with the Qovery CLI")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No remote connection will be possible, and Qovery support will not be able to help you to diagnose issues")))),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"qovery-shell-agent:\n fullnameOverride: qovery-shell-agent\n")),Object(l.b)("h3",{id:"ingress"},"Ingress"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No (but strongly recommended)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Web services can be privately or publicly exposed")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No web services will be exposed")))),Object(l.b)("p",null,"Qovery us will be exposed ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.nginx.com/nginx-ingress-controller/"}),"NGINX Ingress Controller")," by default to route traffic to your applications."),Object(l.b)("h4",{id:"nginx-ingress-controller"},"Nginx Ingress Controller"),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"demo",placeholder:"Select a platform",select:!1,size:null,values:[{group:"NginxIngress",label:"Demo",value:"demo"},{group:"NginxIngress",label:"AWS",value:"aws"},{group:"NginxIngress",label:"GCP",value:"gcp"},{group:"NginxIngress",label:"Scaleway",value:"scaleway"}],mdxType:"Tabs"},Object(l.b)(s.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("p",null,"Here is the minimum override configuration to be used:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'ingress-nginx:\n fullnameOverride: ingress-nginx\n controller:\n useComponentLabel: true\n admissionWebhooks:\n enabled: false\n # Ingress class used when an application/container with public access is set\n ingressClass: nginx-qovery\n extraArgs:\n # Default TLS certificate name and path\n default-ssl-certificate: "qovery/letsencrypt-acme-qovery-cert"\n # Allows customization of the source of the IP address or FQDN to report in the ingress status field\n publishService:\n enabled: true\n'))),Object(l.b)(s.a,{value:"aws",mdxType:"TabItem"},Object(l.b)("p",null,"Here is an example with Nginx Ingress Controller on AWS with NLB:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'ingress-nginx:\n controller:\n useComponentLabel: true\n admissionWebhooks:\n enabled: set-by-customer\n # enable if you want metrics scrapped by prometheus\n metrics:\n enabled: set-by-customer\n serviceMonitor:\n enabled: set-by-customer\n config:\n # set global default file size limit to 100m\n proxy-body-size: 100m\n # hide Nginx version\n server-tokens: "false"\n # the Ingress Class name to be used by Ingresses (use "nginx-qovery" for Qovery application/container deployments)\n ingressClass: nginx-qovery\n extraArgs:\n # Kubernetes path of the default Cert-manager TLS certificate (if used)\n default-ssl-certificate: "cert-manager/letsencrypt-acme-qovery-cert"\n updateStrategy:\n rollingUpdate:\n # set the minimum acceptable number of unavailable pods during a rolling update\n maxUnavailable: 1\n # enable auoscaling if you want to scale the number of replicas based on CPU usage\n autoscaling:\n enabled: true\n minReplicas: set-by-customer\n maxReplicas: set-by-customer\n targetCPUUtilizationPercentage: set-by-customer\n # required if you rely on a load balancer\n # the controller mirrors the address of this service\'s endpoints to the load-balancer status of all Ingress objects it satisfies.\n publishService:\n enabled: true\n # set a load balancer if you want your Nginx to be publicly accessible\n service:\n enabled: true\n annotations:\n service.beta.kubernetes.io/aws-load-balancer-type: nlb\n # Qovery managed DNS requieres *.$domain (something like: *..)\n external-dns.alpha.kubernetes.io/hostname: "set-by-customer"\n externalTrafficPolicy: "Local"\n sessionAffinity: ""\n healthCheckNodePort: 0\n'))),Object(l.b)(s.a,{value:"gcp",mdxType:"TabItem"},Object(l.b)("p",null,"Here is an example with Nginx Ingress Controller on AWS with NLB:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'ingress-nginx:\n controller:\n useComponentLabel: true\n admissionWebhooks:\n enabled: set-by-customer\n # enable if you want metrics scrapped by prometheus\n metrics:\n enabled: set-by-customer\n serviceMonitor:\n enabled: set-by-customer\n config:\n # set global default file size limit to 100m\n proxy-body-size: 100m\n # hide Nginx version\n server-tokens: "false"\n # the Ingress Class name to be used by Ingresses (use "nginx-qovery" for Qovery application/container deployments)\n ingressClass: nginx-qovery\n extraArgs:\n # Kubernetes path of the default Cert-manager TLS certificate (if used)\n default-ssl-certificate: "qovery/letsencrypt-acme-qovery-cert"\n updateStrategy:\n rollingUpdate:\n # set the minimum acceptable number of unavailable pods during a rolling update\n maxUnavailable: 1\n # enable auoscaling if you want to scale the number of replicas based on CPU usage\n autoscaling:\n enabled: true\n minReplicas: set-by-customer\n maxReplicas: set-by-customer\n targetCPUUtilizationPercentage: set-by-customer\n # required if you rely on a load balancer\n # the controller mirrors the address of this service\'s endpoints to the load-balancer status of all Ingress objects it satisfies.\n publishService:\n enabled: true\n # set a load balancer if you want your Nginx to be publicly accessible\n service:\n enabled: true\n annotations:\n # Qovery managed DNS requieres *.$domain (something like: *..)\n external-dns.alpha.kubernetes.io/hostname: "set-by-customer"\n externalTrafficPolicy: "Local"\n sessionAffinity: ""\n healthCheckNodePort: 0\n'))),Object(l.b)(s.a,{value:"scaleway",mdxType:"TabItem"},Object(l.b)("p",null,"Here is an example with Nginx Ingress Controller on Scaleway:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'ingress-nginx:\n controller:\n useComponentLabel: true\n admissionWebhooks:\n enabled: set-by-customer\n # enable if you want metrics scrapped by prometheus\n metrics:\n enabled: set-by-customer\n serviceMonitor:\n enabled: set-by-customer\n config:\n # set global default file size limit to 100m\n proxy-body-size: 100m\n # hide Nginx version\n server-tokens: "false"\n # required for X-Forwarded-for to work\n use-proxy-protocol: "true"\n # the Ingress Class name to be used by Ingresses (use "nginx-qovery" for Qovery application/container deployments)\n ingressClass: nginx-qovery\n extraArgs:\n # Kubernetes path of the default Cert-manager TLS certificate (if used)\n default-ssl-certificate: "cert-manager/letsencrypt-acme-qovery-cert"\n updateStrategy:\n rollingUpdate:\n # set the minimum acceptable number of unavailable pods during a rolling update\n maxUnavailable: 1\n # enable auoscaling if you want to scale the number of replicas based on CPU usage\n autoscaling:\n enabled: true\n minReplicas: set-by-customer\n maxReplicas: set-by-customer\n targetCPUUtilizationPercentage: set-by-customer\n # required if you rely on a load balancer\n # the controller mirrors the address of this service\'s endpoints to the load-balancer status of all Ingress objects it satisfies.\n publishService:\n enabled: true\n # set a load balancer if you want your Nginx to be publicly accessible\n service:\n enabled: true\n # https://github.com/scaleway/scaleway-cloud-controller-manager/blob/master/docs/loadbalancer-annotations.md\n annotations:\n service.beta.kubernetes.io/scw-loadbalancer-forward-port-algorithm: "leastconn"\n service.beta.kubernetes.io/scw-loadbalancer-protocol-http: "false"\n service.beta.kubernetes.io/scw-loadbalancer-proxy-protocol-v1: "false"\n service.beta.kubernetes.io/scw-loadbalancer-proxy-protocol-v2: "true"\n service.beta.kubernetes.io/scw-loadbalancer-health-check-type: tcp\n service.beta.kubernetes.io/scw-loadbalancer-use-hostname: "true"\n # set Scaleway load balancer type https://www.scaleway.com/en/load-balancer/ (ex: LB-GP-S, LB-GP-M, LB-GP-L, LB-GP-XL)\n service.beta.kubernetes.io/scw-loadbalancer-type: "set-by-customer"\n # Qovery managed DNS requieres *.$domain (something like: *..)\n external-dns.alpha.kubernetes.io/hostname: "set-by-customer"\n externalTrafficPolicy: "Local"\n')))),Object(l.b)("h4",{id:"other-ingress-controllers"},"Other Ingress Controllers"),Object(l.b)("p",null,"Qovery supports other Ingress Controllers. Please contact us if you want to use another one. We will be happy to help you."),Object(l.b)("h3",{id:"dns"},"DNS"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No (but strongly recommended)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Used to easily reach your applications with DNS records, even on private network")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"You will have easy access with dns names to your services, you'll have to use IPs")))),Object(l.b)("p",null,"Qovery uses ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/kubernetes-sigs/external-dns"}),"External DNS")," to automatically configure DNS records for your applications."),Object(l.b)("p",null,"If you don't want or can't add your own DNS provider, Qovery proposes it's own managed sub-domain DNS provider for free.\nYou'll then be able to later add your custom DNS record (no matter the provider) to point to your Qovery DNS sub-domain."),Object(l.b)("h4",{id:"external-dns"},"External DNS"),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"demo",placeholder:"Select a platform",select:!1,size:null,values:[{group:"ExternalDns",label:"Demo & QoveryDNS",value:"demo"},{group:"ExternalDns",label:"Cloudflare",value:"cloudflare"}],mdxType:"Tabs"},Object(l.b)(s.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("p",null,"Here is one example with Qovery DNS provider:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"external-dns:\n fullnameOverride: external-dns\n # set pdns for Qovery DNS managed (or you can use any supported provider by external-dns)\n provider: pdns\n # will use the domain name given by Qovery during the cluster setup phease\n domainFilters: [*domain]\n # an owner ID is set to avoid conflicts in case of multiple Qovery clusters\n txtOwnerId: *shortClusterId\n # a prefix to help Qovery to debug in case of issues\n txtPrefix: *externalDnsPrefix\n # set the Qovery DNS provider configuration\n pdns:\n apiUrl: *qoveryDnsUrl\n apiKey: *jwtToken\n apiPort: 443\n"))),Object(l.b)(s.a,{value:"cloudflare",mdxType:"TabItem"},Object(l.b)("p",null,"Here is one example with Cloudflare:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'external-dns:\n # set the provider to use\n provider: set-by-customer\n # keep the config you want to use and remove the others. Configure the provider you want to use.\n cloudflare:\n apiToken: set-by-customer\n email: set-by-customer\n proxied: set-by-customer\n pdns:\n # Qovery DNS: apiUrl: *qoveryDnsUrl\n apiUrl: set-by-customer\n # Qovery DNS: apiPort: "443"\n apiPort: set-by-customer\n # Qovery DNS: apiKey: "443"\n apiKey: set-by-customer\n # Make external DNS ignore this ingress https://github.com/kubernetes-sigs/external-dns/issues/1910#issuecomment-976371247\n annotationFilter: external-dns.alpha.kubernetes.io/exclude notin (true)\n # set domainFilters to the domain you want to manage: [*domain]\n domainFilters: set-by-customer\n triggerLoopOnEvent: true\n policy: sync\n # avoid dns collision with other external-dns instances\n txtOwnerId: set-by-customer\n txtPrefix: set-by-customer\n # set the number of replicas you want to use\n replicas: 1\n # set the rolling update strategy you want to apply\n updateStrategy:\n type: set-by-customer\n # remove if you don\'t want to use a custom image\n image:\n registry: set-by-customer\n repository: set-by-customer\n tag: 0.13.2-debian-11-r17\n # set resources\n resources:\n limits:\n cpu: 50m\n memory: 100Mi\n requests:\n cpu: 50m\n memory: 100Mi\n')))),Object(l.b)("h3",{id:"logging"},"Logging"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No (but strongly recommended)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Retrieve and store application's log history")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"You'll have live logs, but you will miss log history for debugging purpose")))),Object(l.b)("p",null,"Qovery uses ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://grafana.com/oss/loki/"}),"Loki")," to store your logs in a S3 compatible bucket and ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://grafana.com/docs/loki/latest/clients/promtail/"}),"Promtail")," to collect your logs."),Object(l.b)("h4",{id:"loki"},"Loki"),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"demo",placeholder:"Select a platform",select:!1,size:null,values:[{group:"Loki",label:"Demo",value:"demo"},{group:"Loki",label:"AWS S3",value:"s3"}],mdxType:"Tabs"},Object(l.b)(s.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("p",null,"Here is a configuration ",Object(l.b)("strong",{parentName:"p"},"in Memory (no persistence)")," for Loki:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"loki:\n fullnameOverride: loki\n loki:\n # no auth is set for internal cluster usage\n auth_enabled: false\n ingester:\n lifecycler:\n ring:\n kvstore:\n # we store it in memory for the demo, you'll lose history once Loki restarts\n store: inmemory\n replication_factor: 1\n schema_config:\n configs:\n - from: 2020-05-15\n store: boltdb-shipper\n object_store: filesystem\n schema: v11\n index:\n prefix: index_\n period: 24h\n monitoring:\n # all the monitoring part is disabled to reduce resource footprint for the demo usage\n dashboards:\n enabled: false\n rules:\n enabled: false\n serviceMonitor:\n enabled: false\n metricsInstance:\n enabled: false\n selfMonitoring:\n enabled: false\n grafanaAgent:\n installOperator: false\n grafanaAgent:\n enabled: false\n lokiCanary:\n enabled: false\n test:\n enabled: false\n gateway:\n enabled: false\n # we use a single binary to reduce resource footprint for the demo usage\n singleBinary:\n replicas: 1\n persistence:\n enabled: false\n extraVolumes:\n - name: data\n emptyDir: {}\n - name: storage\n emptyDir: {}\n extraVolumeMounts:\n - name: data\n mountPath: /data\n - name: storage\n mountPath: /var/loki\n"))),Object(l.b)(s.a,{value:"s3",mdxType:"TabItem"},Object(l.b)("p",null,"Here is a configuration example with AWS S3 as storage backend:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"loki:\n # remove if you don't want to use a custom image\n kubectlImage:\n registry: set-by-customer\n repository: set-by-customer\n loki:\n # remove if you don't want to use a custom image\n image:\n registry: set-by-customer\n repository: set-by-customer\n # set if you want to use authentication\n auth_enabled: false\n commonConfig:\n # for simple usage, without high throughput, you can use the 1 replica only\n # note: replication is assured by the storage backend\n replication_factor: 1\n ingester:\n chunk_idle_period: 3m\n chunk_block_size: 262144\n chunk_retain_period: 1m\n max_transfer_retries: 0\n lifecycler:\n ring:\n kvstore:\n store: memberlist\n replication_factor: 1\n memberlist:\n abort_if_cluster_join_fails: false\n bind_port: 7946\n join_members:\n # set loki headless service\n - loki-headless.logging.svc:7946\n max_join_backoff: 1m\n max_join_retries: 10\n min_join_backoff: 1s\n limits_config:\n ingestion_rate_mb: 20\n ingestion_burst_size_mb: 30\n enforce_metric_name: false\n reject_old_samples: true\n reject_old_samples_max_age: 168h\n max_concurrent_tail_requests: 100\n split_queries_by_interval: 15m\n max_query_lookback: 12w\n compactor:\n working_directory: /data/retention\n # configure storage provider for the compactor\n shared_store: aws\n compaction_interval: 10m\n retention_enabled: set-by-customer\n retention_delete_delay: 2h\n retention_delete_worker_count: 150\n table_manager:\n retention_deletes_enabled: set-by-customer\n retention_period: set-by-customer\n schema_config:\n configs:\n # set the schema for the index (2020 version can be deleted on a fresh install)\n - from: 2020-05-15\n store: boltdb-shipper\n object_store: s3\n schema: v11\n index:\n prefix: index_\n period: 24h\n - from: 2023-06-01\n store: boltdb-shipper\n object_store: s3\n schema: v12\n index:\n prefix: index_\n period: 24h\n storage:\n # configure the object storage backend\n bucketNames:\n chunks:\n ruler:\n admin:\n type: s3\n s3:\n s3:\n region:\n s3ForcePathStyle:\n insecure:\n storage_config:\n boltdb_shipper:\n active_index_directory: /data/loki/index\n shared_store: s3\n resync_interval: 5s\n cache_location: /data/loki/boltdb-cache\n monitoring:\n dashboards:\n enabled: false\n rules:\n enabled: false\n serviceMonitor:\n enabled: false\n metricsInstance:\n enabled: false\n selfMonitoring:\n enabled: false\n grafanaAgent:\n installOperator: false\n grafanaAgent:\n enabled: false\n lokiCanary:\n enabled: false\n test:\n enabled: false\n gateway:\n enabled: false\n # set the single binary version for basic usage\n singleBinary:\n replicas: 1\n # set resources\n resources:\n limits:\n cpu: 1\n memory: 2Gi\n requests:\n cpu: 300m\n memory: 1Gi\n persistence:\n enabled: false\n extraVolumes:\n - name: data\n emptyDir: {}\n - name: storage\n emptyDir: {}\n extraVolumeMounts:\n - name: data\n mountPath: /data\n - name: storage\n mountPath: /var/loki\n # set disk persistence to reduce data loss in case of pod crash\n # persistence:\n # storageClass: set-by-customer\n serviceAccount:\n annotations: {}\n")))),Object(l.b)("h4",{id:"promtail"},"Promtail"),Object(l.b)("p",null,"A configuration example compatible with all providers:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"promtail:\n fullnameOverride: promtail\n # promtail requires to be spawned in kube-system namespace\n namespace: kube-system\n priorityClassName: system-node-critical\n config:\n clients:\n # forward logs to Loki\n - url: *promtailLokiUrl\n snippets:\n extraRelabelConfigs:\n - action: labelmap\n # required to be able to watch logs from Qovery console interface\n regex: __meta_kubernetes_pod_label_(qovery_com_service_id|qovery_com_service_type|qovery_com_environment_id)\n")),Object(l.b)("h3",{id:"certificates"},"Certificates"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No (but strongly recommended)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Cert-manager helps you to get TLS certificates through Let's Encrypt")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Without it, you will not be able to automatically get TLS certificates")))),Object(l.b)("p",null,"Qovery uses ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://cert-manager.io/"}),"Cert Manager")," to automatically get TLS certificates for your applications."),Object(l.b)("h4",{id:"cert-manager"},"Cert Manager"),Object(l.b)("p",null,"Here is the minimal setup for all cloud providers:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"cert-manager:\n fullnameOverride: cert-manager\n # CRD are required\n installCRDs: true\n replicaCount: 1\n startupapicheck:\n jobAnnotations:\n helm.sh/hook: post-install,post-upgrade\n rbac:\n annotations:\n helm.sh/hook: post-install,post-upgrade\n serviceAccount:\n annotations:\n helm.sh/hook: post-install,post-upgrade\n")),Object(l.b)("h4",{id:"qovery-cert-manager-webhook"},"Qovery Cert Manager Webhook"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No (but if you're using Qovery DNS Provider)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Required to get Let's Encrypt TLS if Qovery DNS Provider is used")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Without it, you will not be able to automatically get TLS certificates with Qovery DNS Provider")))),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"qovery",placeholder:"Select a platform",select:!1,size:null,values:[{group:"QoveryCertManagerWebhook",label:"Qovery DNS",value:"qovery"},{group:"QoveryCertManagerWebhook",label:"",value:""}],mdxType:"Tabs"},Object(l.b)(s.a,{value:"qovery",mdxType:"TabItem"},Object(l.b)("p",null,"A configuration example compatible with all providers:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"qovery-cert-manager-webhook:\n fullnameOverride: qovery-cert-manager-webhook\n certManager:\n # set the same namespace than cert-manager\n namespace: qovery\n serviceAccountName: cert-manager\n secret:\n apiUrl: *qoveryDnsUrl\n apiKey: *jwtToken\n")))),Object(l.b)("h4",{id:"cert-manager-configs"},"Cert Manager Configs"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"This is an helper to deploy cert-manager config. But you can manually set it")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Installing Cert-manager is not enough, you have to configure it to get TLS working")))),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"demo",placeholder:"Select a platform",select:!1,size:null,values:[{group:"ExternalDns",label:"Demo",value:"demo"},{group:"ExternalDns",label:"Qovery DNS",value:"qovery"},{group:"ExternalDns",label:"Cloudflare",value:"cloudflare"}],mdxType:"Tabs"},Object(l.b)(s.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("p",null,"This is the configuration of Cert Manager itself. It is used by all Cert Manager components."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"cert-manager-configs:\n fullnameOverride: cert-manager-configs\n # set pdns to use Qovery DNS provider\n externalDnsProvider: pdns\n managedDns: [*domain]\n acme:\n letsEncrypt:\n emailReport: *acmeEmailAddr\n # As it's a demo cluster, we use the staging environment to avoid rate limit issues\n acmeUrl: https://acme-staging-v02.api.letsencrypt.org/directory\n provider:\n # set the provider of your choice or use the Qovery DNS provider\n pdns:\n apiPort: 443\n apiUrl: *qoveryDnsUrl\n apiKey: *jwtToken\n"))),Object(l.b)(s.a,{value:"qovery",mdxType:"TabItem"},Object(l.b)("p",null,"This is the configuration of Cert Manager itself. It is used by all Cert Manager components."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"cert-manager-configs:\n fullnameOverride: cert-manager-configs\n # set pdns to use Qovery DNS provider\n externalDnsProvider: pdns\n managedDns: [*domain]\n acme:\n letsEncrypt:\n emailReport: *acmeEmailAddr\n # set the Let's Encrypt URL\n # Test: https://acme-staging-v02.api.letsencrypt.org/directory\n # Prod: https://acme-v02.api.letsencrypt.org/directory\n acmeUrl: https://acme-v02.api.letsencrypt.org/directory\n provider:\n # set the provider of your choice or use the Qovery DNS provider\n pdns:\n apiPort: 443\n apiUrl: *qoveryDnsUrl\n apiKey: *jwtToken\n"))),Object(l.b)(s.a,{value:"cloudflare",mdxType:"TabItem"},Object(l.b)("p",null,"This is the configuration of Cert Manager itself. It is used by all Cert Manager components."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'cert-manager-configs:\n fullnameOverride: cert-manager-configs\n # set pdns to use Qovery DNS provider\n externalDnsProvider: cloudflare\n managedDns: [*domain]\n acme:\n letsEncrypt:\n emailReport: *acmeEmailAddr\n acmeUrl: https://acme-v02.api.letsencrypt.org/directory\n provider:\n cloudflare:\n apiToken: "set your Cloudflare API token here"\n email: "set your Cloudflare email here"\n')))),Object(l.b)("p",null,"Qovery uses ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/kubernetes-sigs/metrics-server"}),"Metrics Server")," to collect metrics from your Kubernetes cluster and scale your applications automatically based on custom metrics."),Object(l.b)("h3",{id:"observability"},"Observability"),Object(l.b)("h4",{id:"metrics-server"},"Metrics Server"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No (but strongly recommended)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Mandatory if you want to retrive pod metrics for the Qovery agent and if you want to be able to use the horizontal pod scaling")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No HPA and no application metrics in the QOveyr console")))),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"demo",placeholder:"Select a platform",select:!1,size:null,values:[{group:"MetricsServer",label:"Demo",value:"demo"},{group:"MetricsServer",label:"AWS",value:"aws"},{group:"MetricsServer",label:"GCP",value:"gcp"},{group:"MetricsServer",label:"Scaleway",value:"scaleway"}],mdxType:"Tabs"},Object(l.b)(s.a,{value:"aws",mdxType:"TabItem"},Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"metrics-server:\n # create api service to be able to use hpa/vpa\n apiService:\n create: true\n # set rolling restart strategy\n updateStrategy:\n type: set-by-customer\n # set resources\n resources:\n limits:\n cpu: set-by-customer\n memory: set-by-customer\n requests:\n cpu: set-by-customer\n memory: set-by-customer\n"))),Object(l.b)(s.a,{value:"gcp",mdxType:"TabItem"},Object(l.b)("p",null,"Nothing needs to be deployed, as GCP already provides a managed metrics server.")),Object(l.b)(s.a,{value:"scaleway",mdxType:"TabItem"},Object(l.b)("p",null,"Nothing needs to be deployed, as Scaleway already provides a managed metrics server.")),Object(l.b)(s.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"metrics-server:\n fullnameOverride: metrics-server\n defaultArgs:\n - --cert-dir=/tmp\n - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname\n - --kubelet-use-node-status-port\n - --metric-resolution=15s\n - --kubelet-insecure-tls\n apiService:\n create: false\n")))))}m.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),l=n(463),o=n.n(l);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,l=e.icon,s=e.type,i=null;switch(s){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return r.a.createElement("div",{className:o()(n,"alert","alert--"+s,{"alert--fill":a,"alert--icon":!1!==l}),role:"alert"},!1!==l&&r.a.createElement("i",{className:o()("feather","icon-"+(l||i))}),t)}},472:function(e,t,n){"use strict";var a=n(0),r=n.n(a),l=(n(463),n(471)),o=n.n(l);n(133);t.a=function(e){var t=e.children,n=e.headingDepth,l=e.hideFeedbackQuestion,s="undefined"!=typeof window?window.location:null,i={title:"Tutorial on "+s+" failed",body:"The tutorial on:\n\n"+s+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+o.a.stringify(i),b=Object(a.useState)(null),u=b[0],d=b[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!l&&!u&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return d("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,t,n){"use strict";var a=n(1),r=(n(481),n(478),n(52),n(29),n(22),n(21),n(0)),l=n.n(r),o=n(483),s=n(463),i=n.n(s),c=n(471),b=n.n(c),u=n(482),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,o=e.handleKeydown,s=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return l.a.createElement("div",{className:n?"tabs--centered":null},l.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",r,{"tabs--block":t}),style:s},c.map((function(e){var t=e.value,n=e.label;return l.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:i()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return o(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,s=e.values,i=s;if(i[0].group){var c=_.groupBy(i,"group");i=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return l.a.createElement(o.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:i,isClearable:n,placeholder:t,value:s.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,o=e.groupId,s=e.label,i=e.placeholder,c=e.select,y=e.size,O=(e.style,e.values),j=e.urlKey,h=Object(u.a)(),f=h.tabGroupChoices,v=h.setTabGroupChoices,N=Object(r.useState)(n),w=N[0],x=N[1];if(null!=o){var k=f[o];null!=k&&k!==w&&x(k)}var _=function(e){x(e),null!=o&&v(o,e)},C=[],q=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=b.a.parse(window.location.search);e[j]&&x(e[j])}}),[]),l.a.createElement(l.a.Fragment,null,l.a.createElement("div",{className:"margin-bottom--"+(y||"md")},s&&l.a.createElement("div",{className:"margin-vert--sm"},s),O.length>1&&(c?l.a.createElement(g,Object(a.a)({changeSelectedValue:_,handleKeydown:q,placeholder:i,selectedValue:w,size:y,tabRefs:C},e)):l.a.createElement(p,Object(a.a)({changeSelectedValue:_,handleKeydown:q,selectedValue:w,tabRefs:C},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===w}))[0])}},479:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{226:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return m}));var a=n(1),r=n(9),l=(n(0),n(465)),o=n(477),s=n(478),i=(n(472),n(464)),c={last_modified_on:"2024-02-06",title:"Configuration",description:"Configure Qovery BYOK on your Kubernetes cluster"},b={id:"getting-started/install-qovery/kubernetes/byok-config",title:"Configuration",description:"Configure Qovery BYOK on your Kubernetes cluster",source:"@site/docs/getting-started/install-qovery/kubernetes/byok-config.md",permalink:"/docs/getting-started/install-qovery/kubernetes/byok-config",sidebar:"docs",previous:{title:"Quickstart",permalink:"/docs/getting-started/install-qovery/kubernetes/quickstart"},next:{title:"Validate the installation",permalink:"/docs/getting-started/install-qovery/kubernetes/validate-installation"}},u=[{value:"Components",id:"components",children:[]},{value:"Configuration",id:"configuration",children:[{value:"Qovery",id:"qovery",children:[]},{value:"Ingress",id:"ingress",children:[]},{value:"DNS",id:"dns",children:[]},{value:"Logging",id:"logging",children:[]},{value:"Certificates",id:"certificates",children:[]},{value:"Observability",id:"observability",children:[]}]}],d={rightToc:u};function m(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(l.b)("wrapper",Object(a.a)({},d,n,{components:t,mdxType:"MDXLayout"}),Object(l.b)("p",null,"Qovery BYOK is a set of Kubernetes components that you can configure to fit your needs. It is used to connect your Kubernetes cluster to Qovery control plane."),Object(l.b)("h2",{id:"components"},"Components"),Object(l.b)("p",{align:"center"},Object(l.b)("img",{src:"/img/qovery_byok_how_it_works.jpg",alt:"How Qovery works with Self Managed Kubernetes cluster"})),Object(l.b)("p",null,"They are two types of components:"),Object(l.b)("p",null,"Qovery components:"),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"Qovery Control Plane: the Qovery Control Plane is the brain of Qovery. It is responsible for managing your applications and providing the API to interact with Qovery."),Object(l.b)("li",{parentName:"ul"},"Qovery Cluster Agent (mandatory): the Qovery Cluster Agent is responsible for securely forwarding logs and metrics from your Kubernetes cluster to Qovery control plane."),Object(l.b)("li",{parentName:"ul"},"Qovery Shell Agent (mandatory): the Qovery Shell Agent is responsible for giving you a secure remote shell access to your Kubernetes pods if you need it. E.g. when using ",Object(l.b)("inlineCode",{parentName:"li"},"qovery shell")," command."),Object(l.b)("li",{parentName:"ul"},"Qovery Engine (optional): the Qovery Engine is responsible for managing your applications deployment on your Kubernetes cluster. It can be used Qovery side or is installed on your Kubernetes cluster.")),Object(l.b)("p",null,"Third-party components:"),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"NGINX Ingress Controller (optional)"),Object(l.b)("li",{parentName:"ul"},"External DNS (optional)"),Object(l.b)("li",{parentName:"ul"},"Loki (optional)"),Object(l.b)("li",{parentName:"ul"},"Promtail (optional)"),Object(l.b)("li",{parentName:"ul"},"Cert Manager (optional)"),Object(l.b)("li",{parentName:"ul"},"...")),Object(l.b)("p",null,"Within the values.yaml file of the helm chart you can choose what you want to install and manage, and you will have a description of what services are used, and responsible for. You can disable them if you don't want to use them. And you can even install other components if you want to."),Object(l.b)("h2",{id:"configuration"},"Configuration"),Object(l.b)("p",null,"At the top of the values file you will find a list of component that you can activate or not. "),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"services:\n qovery:\n qovery-cluster-agent:\n enabled: true\n qovery-shell-agent:\n enabled: true\n qovery-engine:\n enabled: false\n ingress:\n ingress-nginx:\n enabled: true\n...\n")),Object(l.b)("p",null,"Here's the complete list and the documentation explaining how to configure it."),Object(l.b)("h3",{id:"qovery"},"Qovery"),Object(l.b)("p",null,"This is the configuration of Qovery itself and it is used by all Qovery components. This configuration is automatically generated when creating the cluster on the Qovery console (see ","[docs.getting-started.install-qovery.kubernetes.quickstart#install-qovery]",")"),Object(l.b)(i.a,{type:"danger",mdxType:"Alert"},Object(l.b)("p",null,Object(l.b)("strong",{parentName:"p"},"Do not share the jwtToken! Keep it in a safe place.")," It is used to authenticate the cluster.")),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Key"),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Required"),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.clusterId")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The cluster ID. It is used to identify your cluster.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.clusterShortId")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The short cluster ID. It is used to identify your cluster.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.organizationId")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The organization ID. It is used to identify your organization.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.jwtToken")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The JWT token. It is used to authenticate your cluster.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.domain")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The domain name used by Qovery.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.domainWildcard")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The wildcard domain name used by Qovery.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.qoveryDnsUrl")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Qovery DNS url in case you want to use Qovery provided DNS")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.lokiUrl")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Local Loki URL (required if Loki is set)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.promtailLokiUrl")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Promtail Loki URL (required if Promtail and Loki are set)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.acmeEmailAddr")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Email address used for ",Object(l.b)("inlineCode",{parentName:"td"},"Let's Encrypt")," TLS requests")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.externalDnsPrefix")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"ExernalDNS TXT record prefix (required if ExternalDNS is set)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.architectures")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Set cluster architectures (comma separated)")))),Object(l.b)("h4",{id:"qovery-cluster-agent"},"Qovery Cluster Agent"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The cluster agent is responsible for securely forwarding logs and metrics from your Kubernetes cluster to Qovery control plane")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"The cluster will not report to Qovery control plane Kubernetes information, so the Qovery console will report unknown satus values")))),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"qovery-cluster-agent:\n fullnameOverride: qovery-cluster-agent\n")),Object(l.b)("h4",{id:"qovery-shell-agent"},"Qovery Shell Agent"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Used to give a remote shell access to you Kubernetes pods (if user is allowed from Qovery RBAC) with the Qovery CLI")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No remote connection will be possible, and Qovery support will not be able to help you to diagnose issues")))),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"qovery-shell-agent:\n fullnameOverride: qovery-shell-agent\n")),Object(l.b)("h3",{id:"ingress"},"Ingress"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No (but strongly recommended)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Web services can be privately or publicly exposed")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No web services will be exposed")))),Object(l.b)("p",null,"Qovery us will be exposed ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.nginx.com/nginx-ingress-controller/"}),"NGINX Ingress Controller")," by default to route traffic to your applications."),Object(l.b)("h4",{id:"nginx-ingress-controller"},"Nginx Ingress Controller"),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"demo",placeholder:"Select a platform",select:!1,size:null,values:[{group:"NginxIngress",label:"Demo",value:"demo"},{group:"NginxIngress",label:"AWS",value:"aws"},{group:"NginxIngress",label:"GCP",value:"gcp"},{group:"NginxIngress",label:"Scaleway",value:"scaleway"}],mdxType:"Tabs"},Object(l.b)(s.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("p",null,"Here is the minimum override configuration to be used:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'ingress-nginx:\n fullnameOverride: ingress-nginx\n controller:\n useComponentLabel: true\n admissionWebhooks:\n enabled: false\n # Ingress class used when an application/container with public access is set\n ingressClass: nginx-qovery\n extraArgs:\n # Default TLS certificate name and path\n default-ssl-certificate: "qovery/letsencrypt-acme-qovery-cert"\n # Allows customization of the source of the IP address or FQDN to report in the ingress status field\n publishService:\n enabled: true\n'))),Object(l.b)(s.a,{value:"aws",mdxType:"TabItem"},Object(l.b)("p",null,"Here is an example with Nginx Ingress Controller on AWS with NLB:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'ingress-nginx:\n controller:\n useComponentLabel: true\n admissionWebhooks:\n enabled: set-by-customer\n # enable if you want metrics scrapped by prometheus\n metrics:\n enabled: set-by-customer\n serviceMonitor:\n enabled: set-by-customer\n config:\n # set global default file size limit to 100m\n proxy-body-size: 100m\n # hide Nginx version\n server-tokens: "false"\n # the Ingress Class name to be used by Ingresses (use "nginx-qovery" for Qovery application/container deployments)\n ingressClass: nginx-qovery\n extraArgs:\n # Kubernetes path of the default Cert-manager TLS certificate (if used)\n default-ssl-certificate: "cert-manager/letsencrypt-acme-qovery-cert"\n updateStrategy:\n rollingUpdate:\n # set the minimum acceptable number of unavailable pods during a rolling update\n maxUnavailable: 1\n # enable auoscaling if you want to scale the number of replicas based on CPU usage\n autoscaling:\n enabled: true\n minReplicas: set-by-customer\n maxReplicas: set-by-customer\n targetCPUUtilizationPercentage: set-by-customer\n # required if you rely on a load balancer\n # the controller mirrors the address of this service\'s endpoints to the load-balancer status of all Ingress objects it satisfies.\n publishService:\n enabled: true\n # set a load balancer if you want your Nginx to be publicly accessible\n service:\n enabled: true\n annotations:\n service.beta.kubernetes.io/aws-load-balancer-type: nlb\n # Qovery managed DNS requieres *.$domain (something like: *..)\n external-dns.alpha.kubernetes.io/hostname: "set-by-customer"\n externalTrafficPolicy: "Local"\n sessionAffinity: ""\n healthCheckNodePort: 0\n'))),Object(l.b)(s.a,{value:"gcp",mdxType:"TabItem"},Object(l.b)("p",null,"Here is an example with Nginx Ingress Controller on AWS with NLB:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'ingress-nginx:\n controller:\n useComponentLabel: true\n admissionWebhooks:\n enabled: set-by-customer\n # enable if you want metrics scrapped by prometheus\n metrics:\n enabled: set-by-customer\n serviceMonitor:\n enabled: set-by-customer\n config:\n # set global default file size limit to 100m\n proxy-body-size: 100m\n # hide Nginx version\n server-tokens: "false"\n # the Ingress Class name to be used by Ingresses (use "nginx-qovery" for Qovery application/container deployments)\n ingressClass: nginx-qovery\n extraArgs:\n # Kubernetes path of the default Cert-manager TLS certificate (if used)\n default-ssl-certificate: "qovery/letsencrypt-acme-qovery-cert"\n updateStrategy:\n rollingUpdate:\n # set the minimum acceptable number of unavailable pods during a rolling update\n maxUnavailable: 1\n # enable auoscaling if you want to scale the number of replicas based on CPU usage\n autoscaling:\n enabled: true\n minReplicas: set-by-customer\n maxReplicas: set-by-customer\n targetCPUUtilizationPercentage: set-by-customer\n # required if you rely on a load balancer\n # the controller mirrors the address of this service\'s endpoints to the load-balancer status of all Ingress objects it satisfies.\n publishService:\n enabled: true\n # set a load balancer if you want your Nginx to be publicly accessible\n service:\n enabled: true\n annotations:\n # Qovery managed DNS requieres *.$domain (something like: *..)\n external-dns.alpha.kubernetes.io/hostname: "set-by-customer"\n externalTrafficPolicy: "Local"\n sessionAffinity: ""\n healthCheckNodePort: 0\n'))),Object(l.b)(s.a,{value:"scaleway",mdxType:"TabItem"},Object(l.b)("p",null,"Here is an example with Nginx Ingress Controller on Scaleway:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'ingress-nginx:\n controller:\n useComponentLabel: true\n admissionWebhooks:\n enabled: set-by-customer\n # enable if you want metrics scrapped by prometheus\n metrics:\n enabled: set-by-customer\n serviceMonitor:\n enabled: set-by-customer\n config:\n # set global default file size limit to 100m\n proxy-body-size: 100m\n # hide Nginx version\n server-tokens: "false"\n # required for X-Forwarded-for to work\n use-proxy-protocol: "true"\n # the Ingress Class name to be used by Ingresses (use "nginx-qovery" for Qovery application/container deployments)\n ingressClass: nginx-qovery\n extraArgs:\n # Kubernetes path of the default Cert-manager TLS certificate (if used)\n default-ssl-certificate: "cert-manager/letsencrypt-acme-qovery-cert"\n updateStrategy:\n rollingUpdate:\n # set the minimum acceptable number of unavailable pods during a rolling update\n maxUnavailable: 1\n # enable auoscaling if you want to scale the number of replicas based on CPU usage\n autoscaling:\n enabled: true\n minReplicas: set-by-customer\n maxReplicas: set-by-customer\n targetCPUUtilizationPercentage: set-by-customer\n # required if you rely on a load balancer\n # the controller mirrors the address of this service\'s endpoints to the load-balancer status of all Ingress objects it satisfies.\n publishService:\n enabled: true\n # set a load balancer if you want your Nginx to be publicly accessible\n service:\n enabled: true\n # https://github.com/scaleway/scaleway-cloud-controller-manager/blob/master/docs/loadbalancer-annotations.md\n annotations:\n service.beta.kubernetes.io/scw-loadbalancer-forward-port-algorithm: "leastconn"\n service.beta.kubernetes.io/scw-loadbalancer-protocol-http: "false"\n service.beta.kubernetes.io/scw-loadbalancer-proxy-protocol-v1: "false"\n service.beta.kubernetes.io/scw-loadbalancer-proxy-protocol-v2: "true"\n service.beta.kubernetes.io/scw-loadbalancer-health-check-type: tcp\n service.beta.kubernetes.io/scw-loadbalancer-use-hostname: "true"\n # set Scaleway load balancer type https://www.scaleway.com/en/load-balancer/ (ex: LB-GP-S, LB-GP-M, LB-GP-L, LB-GP-XL)\n service.beta.kubernetes.io/scw-loadbalancer-type: "set-by-customer"\n # Qovery managed DNS requieres *.$domain (something like: *..)\n external-dns.alpha.kubernetes.io/hostname: "set-by-customer"\n externalTrafficPolicy: "Local"\n')))),Object(l.b)("h4",{id:"other-ingress-controllers"},"Other Ingress Controllers"),Object(l.b)("p",null,"Qovery supports other Ingress Controllers. Please contact us if you want to use another one. We will be happy to help you."),Object(l.b)("h3",{id:"dns"},"DNS"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No (but strongly recommended)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Used to easily reach your applications with DNS records, even on private network")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"You will have easy access with dns names to your services, you'll have to use IPs")))),Object(l.b)("p",null,"Qovery uses ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/kubernetes-sigs/external-dns"}),"External DNS")," to automatically configure DNS records for your applications."),Object(l.b)("p",null,"If you don't want or can't add your own DNS provider, Qovery proposes it's own managed sub-domain DNS provider for free.\nYou'll then be able to later add your custom DNS record (no matter the provider) to point to your Qovery DNS sub-domain."),Object(l.b)("h4",{id:"external-dns"},"External DNS"),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"demo",placeholder:"Select a platform",select:!1,size:null,values:[{group:"ExternalDns",label:"Demo & QoveryDNS",value:"demo"},{group:"ExternalDns",label:"Cloudflare",value:"cloudflare"}],mdxType:"Tabs"},Object(l.b)(s.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("p",null,"Here is one example with Qovery DNS provider:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"external-dns:\n fullnameOverride: external-dns\n # set pdns for Qovery DNS managed (or you can use any supported provider by external-dns)\n provider: pdns\n # will use the domain name given by Qovery during the cluster setup phease\n domainFilters: [*domain]\n # an owner ID is set to avoid conflicts in case of multiple Qovery clusters\n txtOwnerId: *shortClusterId\n # a prefix to help Qovery to debug in case of issues\n txtPrefix: *externalDnsPrefix\n # set the Qovery DNS provider configuration\n pdns:\n apiUrl: *qoveryDnsUrl\n apiKey: *jwtToken\n apiPort: 443\n"))),Object(l.b)(s.a,{value:"cloudflare",mdxType:"TabItem"},Object(l.b)("p",null,"Here is one example with Cloudflare:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'external-dns:\n # set the provider to use\n provider: set-by-customer\n # keep the config you want to use and remove the others. Configure the provider you want to use.\n cloudflare:\n apiToken: set-by-customer\n email: set-by-customer\n proxied: set-by-customer\n pdns:\n # Qovery DNS: apiUrl: *qoveryDnsUrl\n apiUrl: set-by-customer\n # Qovery DNS: apiPort: "443"\n apiPort: set-by-customer\n # Qovery DNS: apiKey: "443"\n apiKey: set-by-customer\n # Make external DNS ignore this ingress https://github.com/kubernetes-sigs/external-dns/issues/1910#issuecomment-976371247\n annotationFilter: external-dns.alpha.kubernetes.io/exclude notin (true)\n # set domainFilters to the domain you want to manage: [*domain]\n domainFilters: set-by-customer\n triggerLoopOnEvent: true\n policy: sync\n # avoid dns collision with other external-dns instances\n txtOwnerId: set-by-customer\n txtPrefix: set-by-customer\n # set the number of replicas you want to use\n replicas: 1\n # set the rolling update strategy you want to apply\n updateStrategy:\n type: set-by-customer\n # remove if you don\'t want to use a custom image\n image:\n registry: set-by-customer\n repository: set-by-customer\n tag: 0.13.2-debian-11-r17\n # set resources\n resources:\n limits:\n cpu: 50m\n memory: 100Mi\n requests:\n cpu: 50m\n memory: 100Mi\n')))),Object(l.b)("h3",{id:"logging"},"Logging"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No (but strongly recommended)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Retrieve and store application's log history")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"You'll have live logs, but you will miss log history for debugging purpose")))),Object(l.b)("p",null,"Qovery uses ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://grafana.com/oss/loki/"}),"Loki")," to store your logs in a S3 compatible bucket and ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://grafana.com/docs/loki/latest/clients/promtail/"}),"Promtail")," to collect your logs."),Object(l.b)("h4",{id:"loki"},"Loki"),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"demo",placeholder:"Select a platform",select:!1,size:null,values:[{group:"Loki",label:"Demo",value:"demo"},{group:"Loki",label:"AWS S3",value:"s3"}],mdxType:"Tabs"},Object(l.b)(s.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("p",null,"Here is a configuration ",Object(l.b)("strong",{parentName:"p"},"in Memory (no persistence)")," for Loki:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"loki:\n fullnameOverride: loki\n loki:\n # no auth is set for internal cluster usage\n auth_enabled: false\n ingester:\n lifecycler:\n ring:\n kvstore:\n # we store it in memory for the demo, you'll lose history once Loki restarts\n store: inmemory\n replication_factor: 1\n schema_config:\n configs:\n - from: 2020-05-15\n store: boltdb-shipper\n object_store: filesystem\n schema: v11\n index:\n prefix: index_\n period: 24h\n monitoring:\n # all the monitoring part is disabled to reduce resource footprint for the demo usage\n dashboards:\n enabled: false\n rules:\n enabled: false\n serviceMonitor:\n enabled: false\n metricsInstance:\n enabled: false\n selfMonitoring:\n enabled: false\n grafanaAgent:\n installOperator: false\n grafanaAgent:\n enabled: false\n lokiCanary:\n enabled: false\n test:\n enabled: false\n gateway:\n enabled: false\n # we use a single binary to reduce resource footprint for the demo usage\n singleBinary:\n replicas: 1\n persistence:\n enabled: false\n extraVolumes:\n - name: data\n emptyDir: {}\n - name: storage\n emptyDir: {}\n extraVolumeMounts:\n - name: data\n mountPath: /data\n - name: storage\n mountPath: /var/loki\n"))),Object(l.b)(s.a,{value:"s3",mdxType:"TabItem"},Object(l.b)("p",null,"Here is a configuration example with AWS S3 as storage backend:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"loki:\n # remove if you don't want to use a custom image\n kubectlImage:\n registry: set-by-customer\n repository: set-by-customer\n loki:\n # remove if you don't want to use a custom image\n image:\n registry: set-by-customer\n repository: set-by-customer\n # set if you want to use authentication\n auth_enabled: false\n commonConfig:\n # for simple usage, without high throughput, you can use the 1 replica only\n # note: replication is assured by the storage backend\n replication_factor: 1\n ingester:\n chunk_idle_period: 3m\n chunk_block_size: 262144\n chunk_retain_period: 1m\n max_transfer_retries: 0\n lifecycler:\n ring:\n kvstore:\n store: memberlist\n replication_factor: 1\n memberlist:\n abort_if_cluster_join_fails: false\n bind_port: 7946\n join_members:\n # set loki headless service\n - loki-headless.logging.svc:7946\n max_join_backoff: 1m\n max_join_retries: 10\n min_join_backoff: 1s\n limits_config:\n ingestion_rate_mb: 20\n ingestion_burst_size_mb: 30\n enforce_metric_name: false\n reject_old_samples: true\n reject_old_samples_max_age: 168h\n max_concurrent_tail_requests: 100\n split_queries_by_interval: 15m\n max_query_lookback: 12w\n compactor:\n working_directory: /data/retention\n # configure storage provider for the compactor\n shared_store: aws\n compaction_interval: 10m\n retention_enabled: set-by-customer\n retention_delete_delay: 2h\n retention_delete_worker_count: 150\n table_manager:\n retention_deletes_enabled: set-by-customer\n retention_period: set-by-customer\n schema_config:\n configs:\n # set the schema for the index (2020 version can be deleted on a fresh install)\n - from: 2020-05-15\n store: boltdb-shipper\n object_store: s3\n schema: v11\n index:\n prefix: index_\n period: 24h\n - from: 2023-06-01\n store: boltdb-shipper\n object_store: s3\n schema: v12\n index:\n prefix: index_\n period: 24h\n storage:\n # configure the object storage backend\n bucketNames:\n chunks:\n ruler:\n admin:\n type: s3\n s3:\n s3:\n region:\n s3ForcePathStyle:\n insecure:\n storage_config:\n boltdb_shipper:\n active_index_directory: /data/loki/index\n shared_store: s3\n resync_interval: 5s\n cache_location: /data/loki/boltdb-cache\n monitoring:\n dashboards:\n enabled: false\n rules:\n enabled: false\n serviceMonitor:\n enabled: false\n metricsInstance:\n enabled: false\n selfMonitoring:\n enabled: false\n grafanaAgent:\n installOperator: false\n grafanaAgent:\n enabled: false\n lokiCanary:\n enabled: false\n test:\n enabled: false\n gateway:\n enabled: false\n # set the single binary version for basic usage\n singleBinary:\n replicas: 1\n # set resources\n resources:\n limits:\n cpu: 1\n memory: 2Gi\n requests:\n cpu: 300m\n memory: 1Gi\n persistence:\n enabled: false\n extraVolumes:\n - name: data\n emptyDir: {}\n - name: storage\n emptyDir: {}\n extraVolumeMounts:\n - name: data\n mountPath: /data\n - name: storage\n mountPath: /var/loki\n # set disk persistence to reduce data loss in case of pod crash\n # persistence:\n # storageClass: set-by-customer\n serviceAccount:\n annotations: {}\n")))),Object(l.b)("h4",{id:"promtail"},"Promtail"),Object(l.b)("p",null,"A configuration example compatible with all providers:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"promtail:\n fullnameOverride: promtail\n # promtail requires to be spawned in kube-system namespace\n namespace: kube-system\n priorityClassName: system-node-critical\n config:\n clients:\n # forward logs to Loki\n - url: *promtailLokiUrl\n snippets:\n extraRelabelConfigs:\n - action: labelmap\n # required to be able to watch logs from Qovery console interface\n regex: __meta_kubernetes_pod_label_(qovery_com_service_id|qovery_com_service_type|qovery_com_environment_id)\n")),Object(l.b)("h3",{id:"certificates"},"Certificates"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No (but strongly recommended)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Cert-manager helps you to get TLS certificates through Let's Encrypt")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Without it, you will not be able to automatically get TLS certificates")))),Object(l.b)("p",null,"Qovery uses ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://cert-manager.io/"}),"Cert Manager")," to automatically get TLS certificates for your applications."),Object(l.b)("h4",{id:"cert-manager"},"Cert Manager"),Object(l.b)("p",null,"Here is the minimal setup for all cloud providers:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"cert-manager:\n fullnameOverride: cert-manager\n # CRD are required\n installCRDs: true\n replicaCount: 1\n startupapicheck:\n jobAnnotations:\n helm.sh/hook: post-install,post-upgrade\n rbac:\n annotations:\n helm.sh/hook: post-install,post-upgrade\n serviceAccount:\n annotations:\n helm.sh/hook: post-install,post-upgrade\n")),Object(l.b)("h4",{id:"qovery-cert-manager-webhook"},"Qovery Cert Manager Webhook"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No (but if you're using Qovery DNS Provider)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Required to get Let's Encrypt TLS if Qovery DNS Provider is used")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Without it, you will not be able to automatically get TLS certificates with Qovery DNS Provider")))),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"qovery",placeholder:"Select a platform",select:!1,size:null,values:[{group:"QoveryCertManagerWebhook",label:"Qovery DNS",value:"qovery"},{group:"QoveryCertManagerWebhook",label:"",value:""}],mdxType:"Tabs"},Object(l.b)(s.a,{value:"qovery",mdxType:"TabItem"},Object(l.b)("p",null,"A configuration example compatible with all providers:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"qovery-cert-manager-webhook:\n fullnameOverride: qovery-cert-manager-webhook\n certManager:\n # set the same namespace than cert-manager\n namespace: qovery\n serviceAccountName: cert-manager\n secret:\n apiUrl: *qoveryDnsUrl\n apiKey: *jwtToken\n")))),Object(l.b)("h4",{id:"cert-manager-configs"},"Cert Manager Configs"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"This is an helper to deploy cert-manager config. But you can manually set it")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Installing Cert-manager is not enough, you have to configure it to get TLS working")))),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"demo",placeholder:"Select a platform",select:!1,size:null,values:[{group:"ExternalDns",label:"Demo",value:"demo"},{group:"ExternalDns",label:"Qovery DNS",value:"qovery"},{group:"ExternalDns",label:"Cloudflare",value:"cloudflare"}],mdxType:"Tabs"},Object(l.b)(s.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("p",null,"This is the configuration of Cert Manager itself. It is used by all Cert Manager components."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"cert-manager-configs:\n fullnameOverride: cert-manager-configs\n # set pdns to use Qovery DNS provider\n externalDnsProvider: pdns\n managedDns: [*domain]\n acme:\n letsEncrypt:\n emailReport: *acmeEmailAddr\n # As it's a demo cluster, we use the staging environment to avoid rate limit issues\n acmeUrl: https://acme-staging-v02.api.letsencrypt.org/directory\n provider:\n # set the provider of your choice or use the Qovery DNS provider\n pdns:\n apiPort: 443\n apiUrl: *qoveryDnsUrl\n apiKey: *jwtToken\n"))),Object(l.b)(s.a,{value:"qovery",mdxType:"TabItem"},Object(l.b)("p",null,"This is the configuration of Cert Manager itself. It is used by all Cert Manager components."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"cert-manager-configs:\n fullnameOverride: cert-manager-configs\n # set pdns to use Qovery DNS provider\n externalDnsProvider: pdns\n managedDns: [*domain]\n acme:\n letsEncrypt:\n emailReport: *acmeEmailAddr\n # set the Let's Encrypt URL\n # Test: https://acme-staging-v02.api.letsencrypt.org/directory\n # Prod: https://acme-v02.api.letsencrypt.org/directory\n acmeUrl: https://acme-v02.api.letsencrypt.org/directory\n provider:\n # set the provider of your choice or use the Qovery DNS provider\n pdns:\n apiPort: 443\n apiUrl: *qoveryDnsUrl\n apiKey: *jwtToken\n"))),Object(l.b)(s.a,{value:"cloudflare",mdxType:"TabItem"},Object(l.b)("p",null,"This is the configuration of Cert Manager itself. It is used by all Cert Manager components."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'cert-manager-configs:\n fullnameOverride: cert-manager-configs\n # set pdns to use Qovery DNS provider\n externalDnsProvider: cloudflare\n managedDns: [*domain]\n acme:\n letsEncrypt:\n emailReport: *acmeEmailAddr\n acmeUrl: https://acme-v02.api.letsencrypt.org/directory\n provider:\n cloudflare:\n apiToken: "set your Cloudflare API token here"\n email: "set your Cloudflare email here"\n')))),Object(l.b)("p",null,"Qovery uses ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/kubernetes-sigs/metrics-server"}),"Metrics Server")," to collect metrics from your Kubernetes cluster and scale your applications automatically based on custom metrics."),Object(l.b)("h3",{id:"observability"},"Observability"),Object(l.b)("h4",{id:"metrics-server"},"Metrics Server"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(a.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No (but strongly recommended)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Mandatory if you want to retrive pod metrics for the Qovery agent and if you want to be able to use the horizontal pod scaling")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No HPA and no application metrics in the QOveyr console")))),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"demo",placeholder:"Select a platform",select:!1,size:null,values:[{group:"MetricsServer",label:"Demo",value:"demo"},{group:"MetricsServer",label:"AWS",value:"aws"},{group:"MetricsServer",label:"GCP",value:"gcp"},{group:"MetricsServer",label:"Scaleway",value:"scaleway"}],mdxType:"Tabs"},Object(l.b)(s.a,{value:"aws",mdxType:"TabItem"},Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"metrics-server:\n # create api service to be able to use hpa/vpa\n apiService:\n create: true\n # set rolling restart strategy\n updateStrategy:\n type: set-by-customer\n # set resources\n resources:\n limits:\n cpu: set-by-customer\n memory: set-by-customer\n requests:\n cpu: set-by-customer\n memory: set-by-customer\n"))),Object(l.b)(s.a,{value:"gcp",mdxType:"TabItem"},Object(l.b)("p",null,"Nothing needs to be deployed, as GCP already provides a managed metrics server.")),Object(l.b)(s.a,{value:"scaleway",mdxType:"TabItem"},Object(l.b)("p",null,"Nothing needs to be deployed, as Scaleway already provides a managed metrics server.")),Object(l.b)(s.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"metrics-server:\n fullnameOverride: metrics-server\n defaultArgs:\n - --cert-dir=/tmp\n - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname\n - --kubelet-use-node-status-port\n - --metric-resolution=15s\n - --kubelet-insecure-tls\n apiService:\n create: false\n")))))}m.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),l=n(463),o=n.n(l);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,l=e.icon,s=e.type,i=null;switch(s){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return r.a.createElement("div",{className:o()(n,"alert","alert--"+s,{"alert--fill":a,"alert--icon":!1!==l}),role:"alert"},!1!==l&&r.a.createElement("i",{className:o()("feather","icon-"+(l||i))}),t)}},472:function(e,t,n){"use strict";var a=n(0),r=n.n(a),l=(n(463),n(471)),o=n.n(l);n(133);t.a=function(e){var t=e.children,n=e.headingDepth,l=e.hideFeedbackQuestion,s="undefined"!=typeof window?window.location:null,i={title:"Tutorial on "+s+" failed",body:"The tutorial on:\n\n"+s+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+o.a.stringify(i),b=Object(a.useState)(null),u=b[0],d=b[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!l&&!u&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return d("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,t,n){"use strict";var a=n(1),r=(n(480),n(479),n(52),n(29),n(22),n(21),n(0)),l=n.n(r),o=n(483),s=n(463),i=n.n(s),c=n(471),b=n.n(c),u=n(482),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,o=e.handleKeydown,s=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return l.a.createElement("div",{className:n?"tabs--centered":null},l.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",r,{"tabs--block":t}),style:s},c.map((function(e){var t=e.value,n=e.label;return l.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:i()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return o(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,s=e.values,i=s;if(i[0].group){var c=_.groupBy(i,"group");i=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return l.a.createElement(o.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:i,isClearable:n,placeholder:t,value:s.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,o=e.groupId,s=e.label,i=e.placeholder,c=e.select,y=e.size,O=(e.style,e.values),j=e.urlKey,h=Object(u.a)(),f=h.tabGroupChoices,v=h.setTabGroupChoices,N=Object(r.useState)(n),w=N[0],x=N[1];if(null!=o){var k=f[o];null!=k&&k!==w&&x(k)}var _=function(e){x(e),null!=o&&v(o,e)},C=[],q=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=b.a.parse(window.location.search);e[j]&&x(e[j])}}),[]),l.a.createElement(l.a.Fragment,null,l.a.createElement("div",{className:"margin-bottom--"+(y||"md")},s&&l.a.createElement("div",{className:"margin-vert--sm"},s),O.length>1&&(c?l.a.createElement(g,Object(a.a)({changeSelectedValue:_,handleKeydown:q,placeholder:i,selectedValue:w,size:y,tabRefs:C},e)):l.a.createElement(p,Object(a.a)({changeSelectedValue:_,handleKeydown:q,selectedValue:w,tabRefs:C},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===w}))[0])}},478:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/3da71a70.151b017c.js b/3da71a70.079f94a5.js similarity index 99% rename from 3da71a70.151b017c.js rename to 3da71a70.079f94a5.js index 80583787d1..99f2211d6d 100644 --- a/3da71a70.151b017c.js +++ b/3da71a70.079f94a5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{228:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),r=a(9),o=(a(0),a(465)),l=a(477),i=a(479),c=a(464),s=a(469),u=a(473),b={last_modified_on:"2024-05-03",$schema:"/.meta/.schemas/guides.json",title:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},p={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",permalink:"/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease",readingTime:"8 min read",source:"@site/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"How to deploy a Rust REST API application on AWS with ease",truncated:!1,prevItem:{title:"How to create an RDS instance through the AWS console",permalink:"/guides/tutorial/how-to-create-an-rds-instance-through-aws-console"},nextItem:{title:"How to integrate Qovery with GitHub Actions",permalink:"/guides/tutorial/how-to-integrate-qovery-with-github-actions"}},m=[{value:"Create a Rust REST API app",id:"create-a-rust-rest-api-app",children:[]},{value:"Dockerized our Rust REST API app",id:"dockerized-our-rust-rest-api-app",children:[]},{value:"Deploy our Rust REST API app on AWS",id:"deploy-our-rust-rest-api-app-on-aws",children:[{value:"Sign up into Qovery",id:"sign-up-into-qovery",children:[]},{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Connect your AWS account",id:"connect-your-aws-account",children:[]},{value:"Deploy our Rust REST API app",id:"deploy-our-rust-rest-api-app",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],d={rightToc:m};function g(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(o.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety."),Object(o.b)("p",null,"In this article, you will learn how to deploy a Rust API easily in a few steps. This article is separate into two parts:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Create a Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Dockerized our Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Deploy our Rust REST API app on AWS")),Object(o.b)(s.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Rust installed on your system (instructions ",Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.rust-lang.org/learn/get-started"}),"here"),")"),Object(o.b)("li",{parentName:"ul"},"You have an AWS account"),Object(o.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(o.b)("p",null,"Let's go!"),Object(o.b)("h2",{id:"create-a-rust-rest-api-app"},"Create a Rust REST API app"),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Check out the Rust REST API repo ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"here"),". You can fork it!")),Object(o.b)("p",null,"To illustrate the deployment of our Rust API application, we are going to create an API to know if a number is prime number. Let's create our Rust project using cargo"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="create our rust project"',title:'"create',our:!0,rust:!0,'project"':!0}),"cargo new --bin rust-prime-number-api\n")),Object(o.b)("p",null,"Now you must have a ",Object(o.b)("inlineCode",{parentName:"p"},"rust-prime-number-api")," folder with 2 files:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Cargo.toml")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"src/main.rs"))),Object(o.b)("p",null,"To build our Rust REST API we are going to use Rocket - a web framework for Rust that makes it simple to write fast web application."),Object(o.b)("p",null,"Add the ",Object(o.b)("inlineCode",{parentName:"p"},"rocket")," and ",Object(o.b)("inlineCode",{parentName:"p"},"serde")," (JSON serializer/deserializer) dependencies to your ",Object(o.b)("inlineCode",{parentName:"p"},"Cargo.toml"),", then run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo fetch")," (optional) to update your local dependencies."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-toml",metastring:'title="Cargo.toml" {9-12}',title:'"Cargo.toml"',"{9-12}":!0}),'[package]\nname = "rust-prime-number-api"\nversion = "0.1.0"\nauthors = ["Romaric Philogene "]\nedition = "2018"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nrocket = { version = "0.5.0-rc.1", features = ["json"] }\nserde = { version = "1.0.130", features = ["derive"] }\nserde_json = "1.0.68"\n')),Object(o.b)("p",null,"Put inside your ",Object(o.b)("inlineCode",{parentName:"p"},"src/main.rs")," the following Rust code"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'}),'#[macro_use]\nextern crate rocket;\n\nuse rocket::serde::json::Json;\nuse serde::Serialize;\nuse std::time::SystemTime;\nuse std::net::{IpAddr, Ipv4Addr};\n\n#[derive(Serialize)]\nstruct NumberResponse {\n number: u64,\n is_prime_number: bool,\n execution_time_in_micros: u128\n}\n\n#[get("/")]\nfn index() -> &\'static str {\n "This is my Rust prime number REST API"\n}\n\n#[get("/isPrime?")]\nfn get_is_prime(number: u64) -> Json {\n let now = SystemTime::now();\n\n Json(NumberResponse {\n number,\n is_prime_number: is_prime(number),\n execution_time_in_micros: now.elapsed().unwrap().as_micros(),\n })\n}\n\nfn is_prime(n: u64) -> bool {\n if n <= 1 {\n return false;\n }\n\n for a in 2..n {\n if n % a == 0 {\n return false;\n }\n }\n\n true\n}\n\n#[rocket::main]\nasync fn main() {\n let mut config = rocket::config::Config::default();\n config.address = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));\n\n let _ = rocket::build()\n .configure(config)\n .mount("/", routes![index, get_is_prime])\n .launch()\n .await;\n}\n')),Object(o.b)("p",null,"Run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo run")," and you are supposed to get the following output"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"\ud83d\udd27 Configured for debug.\n >> address: 0.0.0.0\n >> port: 8000\n >> workers: 16\n >> ident: Rocket\n >> keep-alive: 5s\n >> limits: bytes = 8KiB, data-form = 2MiB, file = 1MiB, form = 32KiB, json = 1MiB, msgpack = 1MiB, string = 8KiB\n >> tls: disabled\n >> temp dir: /var/folders/td/bjr48yg96gd2xgd3s44fg40c0000gn/T/\n >> log level: normal\n >> cli colors: true\n >> shutdown: ctrlc = true, force = true, signals = [SIGTERM], grace = 2s, mercy = 3s\n\ud83d\udef0 Routes:\n >> (index) GET /\n >> (get_is_prime) GET /isPrime?\n\ud83d\udce1 Fairings:\n >> Shield (liftoff, response, singleton)\n\ud83d\udee1\ufe0f Shield:\n >> X-Frame-Options: SAMEORIGIN\n >> Permissions-Policy: interest-cohort=()\n >> X-Content-Type-Options: nosniff\n\ud83d\ude80 Rocket has launched from http://127.0.0.1:8000\n")),Object(o.b)("p",null,"You can try your Rust REST API by opening ",Object(o.b)("inlineCode",{parentName:"p"},"http://127.0.0.1:8000/isPrime?number=9293029022983991")," in your browser."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-json"}),'{\n "number": 9293029022983992,\n "is_prime_number": false,\n "execution_time_in_micros": 942894\n}\n')),Object(o.b)("p",null,"Let's now containerized our app with Docker to deploy it on our AWS account."),Object(o.b)("h2",{id:"dockerized-our-rust-rest-api-app"},"Dockerized our Rust REST API app"),Object(o.b)("p",null,"To run our Rust app we need to provide a valid Dockerfile. If you are not familiar with Docker, you can take a look to ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),". Here is the content of our Dockerfile."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Our Dockerfile contains a multi-stage build. That is why we have two ",Object(o.b)("inlineCode",{parentName:"p"},"FROM")," instructions.\nOur final container image is optimized to be as light as possible.")),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-Dockerfile",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'####################################################################################################\n## Builder\n####################################################################################################\nFROM rust:latest AS builder\n\nRUN rustup target add x86_64-unknown-linux-musl\nRUN apt update && apt install -y musl-tools musl-dev\nRUN update-ca-certificates\n\n# Create appuser\nENV USER=app\nENV UID=10001\n\nRUN adduser \\\n --disabled-password \\\n --gecos "" \\\n --home "/nonexistent" \\\n --shell "/sbin/nologin" \\\n --no-create-home \\\n --uid "${UID}" \\\n "${USER}"\n\nWORKDIR /app\n\nCOPY ./ .\n\nRUN cargo build --target x86_64-unknown-linux-musl --release\n\n####################################################################################################\n## Final image\n####################################################################################################\nFROM scratch\n\n# Import from builder.\nCOPY --from=builder /etc/passwd /etc/passwd\nCOPY --from=builder /etc/group /etc/group\n\nWORKDIR /app\n\n# Copy our build\nCOPY --from=builder /app/target/x86_64-unknown-linux-musl/release/rust-prime-number-api ./\n\n# Use an unprivileged user.\nUSER app:app\n\nCMD ["/app/rust-prime-number-api"]\n')),Object(o.b)("h2",{id:"deploy-our-rust-rest-api-app-on-aws"},"Deploy our Rust REST API app on AWS"),Object(o.b)("p",null,"To deploy our Rust app on AWS we are going to use Qovery. Qovery is the simplest way to deploy any app on AWS. It is the perfect candidate to deploy our Rust REST API in a few steps."),Object(o.b)("h3",{id:"sign-up-into-qovery"},"Sign up into Qovery"),Object(o.b)("p",null,"First, you need to sign up or sign in on Qovery."),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://console.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.png",alt:"Qovery Sign-up page"}))))),Object(o.b)(i.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(i.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(i.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")))),Object(o.b)("h3",{id:"connect-your-aws-account"},"Connect your AWS account"),Object(o.b)("p",null,"To connect your AWS account check out ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"this guide"),"."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Qovery installation on your AWS account takes up to 30 minutes. You will be notified by email when it is over.")),Object(o.b)("h3",{id:"deploy-our-rust-rest-api-app"},"Deploy our Rust REST API app"),Object(o.b)("p",null,"Once your AWS account is set-up, you can deploy your Rust app by.."),Object(o.b)("p",null,"Creating a project ",Object(o.b)("inlineCode",{parentName:"p"},"prime number"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_project.png",alt:"Create a project"})),Object(o.b)("p",null,"Creating an environment ",Object(o.b)("inlineCode",{parentName:"p"},"prod"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_environment.png",alt:"Create an environment"})),Object(o.b)("p",null,"Creating an app by selecting your Rust app repository, build mode > ",Object(o.b)("strong",{parentName:"p"},"Dockerfile"),", and the port ",Object(o.b)("strong",{parentName:"p"},"8000"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app.png",alt:"Create an app"})),Object(o.b)("p",null,"And deploy! That's it \ud83d\udd25... nothing more. Our Rust REST API app is ready"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app_deployed.png",alt:"Our app is deployed"})),Object(o.b)("p",null,"Check out this video to see how I quickly deploy my Rust REST API with Qovery."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7ae48d3383da40159d8aa97c23aadb3e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Watch this video showing the final result \ud83d\udc47"),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/30cc34ef166a4fdaaeb0a9e864bf7836",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"Rust combined to Rocket web framework turns building REST API super easy. Deploying your Rust app on AWS with Qovery is as simple as selecting your GitHub repository. Nothing more. Hope you liked it."),Object(o.b)("h2",{id:"useful-resources"},"Useful resources"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"Source code")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://rocket.rs"}),"Rocket framework")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://circleci.com/blog/rust-cd/"}),"Rust Circle CI"))),Object(o.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),r=a.n(n),o=a(463),l=a.n(o);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":n,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},468:function(e,t,a){var n=a(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||a(10)&&n(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),r=a.n(n),o=a(464);t.a=function(e){var t=e.children,a=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),r=a(0),o=a.n(r),l=a(39),i=a(474),c=a(20),s=a.n(c);t.a=function(e){var t,a=e.to,c=e.href,u=a||c,b=Object(i.a)(u),p=Object(r.useRef)(!1),m=s.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!m&&b&&window.docusaurus.prefetch(u),function(){m&&t&&t.disconnect()}}),[u,m,b]),u&&b?o.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(u),p.current=!0)},innerRef:function(e){var a,n;m&&e&&b&&(a=e,n=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:u})):o.a.createElement("a",Object(n.a)({},e,{href:u}))}},473:function(e,t,a){"use strict";var n=a(0),r=a.n(n),o=a(470),l=a(463),i=a.n(l);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,c=e.rightIcon,s=e.size,u=e.target,b=e.to,p=i()("jump-to","jump-to--"+s,a),m=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},l&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+l})),r.a.createElement("div",{className:"jump-to--main"},n?r.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(c||"chevron-right")+" arrow"}))));return u?r.a.createElement("a",{href:b,target:u,className:p},m):r.a.createElement(o.a,{to:b,className:p},m)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),r=(a(481),a(478),a(52),a(29),a(22),a(21),a(0)),o=a.n(r),l=a(483),i=a(463),c=a.n(i),s=a(471),u=a.n(s),b=a(482),p=37,m=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:a?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},s.map((function(e){var t=e.value,a=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function g(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,s=e.select,h=e.size,O=(e.style,e.values),j=e.urlKey,f=Object(b.a)(),y=f.tabGroupChoices,v=f.setTabGroupChoices,w=Object(r.useState)(a),N=w[0],R=w[1];if(null!=l){var T=y[l];null!=T&&T!==N&&R(T)}var I=function(e){R(e),null!=l&&v(l,e)},k=[],S=function(e,t,a){switch(a.keyCode){case m:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=u.a.parse(window.location.search);e[j]&&R(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(h||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),O.length>1&&(s?o.a.createElement(g,Object(n.a)({changeSelectedValue:I,handleKeydown:S,placeholder:c,selectedValue:N,size:h,tabRefs:k},e)):o.a.createElement(d,Object(n.a)({changeSelectedValue:I,handleKeydown:S,selectedValue:N,tabRefs:k},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},479:function(e,t,a){"use strict";var n=a(0),r=a.n(n);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{228:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),r=a(9),o=(a(0),a(465)),l=a(477),i=a(478),c=a(464),s=a(469),u=a(473),b={last_modified_on:"2024-05-03",$schema:"/.meta/.schemas/guides.json",title:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},p={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",permalink:"/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease",readingTime:"8 min read",source:"@site/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"How to deploy a Rust REST API application on AWS with ease",truncated:!1,prevItem:{title:"How to create an RDS instance through the AWS console",permalink:"/guides/tutorial/how-to-create-an-rds-instance-through-aws-console"},nextItem:{title:"How to integrate Qovery with GitHub Actions",permalink:"/guides/tutorial/how-to-integrate-qovery-with-github-actions"}},m=[{value:"Create a Rust REST API app",id:"create-a-rust-rest-api-app",children:[]},{value:"Dockerized our Rust REST API app",id:"dockerized-our-rust-rest-api-app",children:[]},{value:"Deploy our Rust REST API app on AWS",id:"deploy-our-rust-rest-api-app-on-aws",children:[{value:"Sign up into Qovery",id:"sign-up-into-qovery",children:[]},{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Connect your AWS account",id:"connect-your-aws-account",children:[]},{value:"Deploy our Rust REST API app",id:"deploy-our-rust-rest-api-app",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],d={rightToc:m};function g(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(o.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety."),Object(o.b)("p",null,"In this article, you will learn how to deploy a Rust API easily in a few steps. This article is separate into two parts:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Create a Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Dockerized our Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Deploy our Rust REST API app on AWS")),Object(o.b)(s.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Rust installed on your system (instructions ",Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.rust-lang.org/learn/get-started"}),"here"),")"),Object(o.b)("li",{parentName:"ul"},"You have an AWS account"),Object(o.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(o.b)("p",null,"Let's go!"),Object(o.b)("h2",{id:"create-a-rust-rest-api-app"},"Create a Rust REST API app"),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Check out the Rust REST API repo ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"here"),". You can fork it!")),Object(o.b)("p",null,"To illustrate the deployment of our Rust API application, we are going to create an API to know if a number is prime number. Let's create our Rust project using cargo"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="create our rust project"',title:'"create',our:!0,rust:!0,'project"':!0}),"cargo new --bin rust-prime-number-api\n")),Object(o.b)("p",null,"Now you must have a ",Object(o.b)("inlineCode",{parentName:"p"},"rust-prime-number-api")," folder with 2 files:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Cargo.toml")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"src/main.rs"))),Object(o.b)("p",null,"To build our Rust REST API we are going to use Rocket - a web framework for Rust that makes it simple to write fast web application."),Object(o.b)("p",null,"Add the ",Object(o.b)("inlineCode",{parentName:"p"},"rocket")," and ",Object(o.b)("inlineCode",{parentName:"p"},"serde")," (JSON serializer/deserializer) dependencies to your ",Object(o.b)("inlineCode",{parentName:"p"},"Cargo.toml"),", then run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo fetch")," (optional) to update your local dependencies."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-toml",metastring:'title="Cargo.toml" {9-12}',title:'"Cargo.toml"',"{9-12}":!0}),'[package]\nname = "rust-prime-number-api"\nversion = "0.1.0"\nauthors = ["Romaric Philogene "]\nedition = "2018"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nrocket = { version = "0.5.0-rc.1", features = ["json"] }\nserde = { version = "1.0.130", features = ["derive"] }\nserde_json = "1.0.68"\n')),Object(o.b)("p",null,"Put inside your ",Object(o.b)("inlineCode",{parentName:"p"},"src/main.rs")," the following Rust code"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'}),'#[macro_use]\nextern crate rocket;\n\nuse rocket::serde::json::Json;\nuse serde::Serialize;\nuse std::time::SystemTime;\nuse std::net::{IpAddr, Ipv4Addr};\n\n#[derive(Serialize)]\nstruct NumberResponse {\n number: u64,\n is_prime_number: bool,\n execution_time_in_micros: u128\n}\n\n#[get("/")]\nfn index() -> &\'static str {\n "This is my Rust prime number REST API"\n}\n\n#[get("/isPrime?")]\nfn get_is_prime(number: u64) -> Json {\n let now = SystemTime::now();\n\n Json(NumberResponse {\n number,\n is_prime_number: is_prime(number),\n execution_time_in_micros: now.elapsed().unwrap().as_micros(),\n })\n}\n\nfn is_prime(n: u64) -> bool {\n if n <= 1 {\n return false;\n }\n\n for a in 2..n {\n if n % a == 0 {\n return false;\n }\n }\n\n true\n}\n\n#[rocket::main]\nasync fn main() {\n let mut config = rocket::config::Config::default();\n config.address = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));\n\n let _ = rocket::build()\n .configure(config)\n .mount("/", routes![index, get_is_prime])\n .launch()\n .await;\n}\n')),Object(o.b)("p",null,"Run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo run")," and you are supposed to get the following output"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"\ud83d\udd27 Configured for debug.\n >> address: 0.0.0.0\n >> port: 8000\n >> workers: 16\n >> ident: Rocket\n >> keep-alive: 5s\n >> limits: bytes = 8KiB, data-form = 2MiB, file = 1MiB, form = 32KiB, json = 1MiB, msgpack = 1MiB, string = 8KiB\n >> tls: disabled\n >> temp dir: /var/folders/td/bjr48yg96gd2xgd3s44fg40c0000gn/T/\n >> log level: normal\n >> cli colors: true\n >> shutdown: ctrlc = true, force = true, signals = [SIGTERM], grace = 2s, mercy = 3s\n\ud83d\udef0 Routes:\n >> (index) GET /\n >> (get_is_prime) GET /isPrime?\n\ud83d\udce1 Fairings:\n >> Shield (liftoff, response, singleton)\n\ud83d\udee1\ufe0f Shield:\n >> X-Frame-Options: SAMEORIGIN\n >> Permissions-Policy: interest-cohort=()\n >> X-Content-Type-Options: nosniff\n\ud83d\ude80 Rocket has launched from http://127.0.0.1:8000\n")),Object(o.b)("p",null,"You can try your Rust REST API by opening ",Object(o.b)("inlineCode",{parentName:"p"},"http://127.0.0.1:8000/isPrime?number=9293029022983991")," in your browser."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-json"}),'{\n "number": 9293029022983992,\n "is_prime_number": false,\n "execution_time_in_micros": 942894\n}\n')),Object(o.b)("p",null,"Let's now containerized our app with Docker to deploy it on our AWS account."),Object(o.b)("h2",{id:"dockerized-our-rust-rest-api-app"},"Dockerized our Rust REST API app"),Object(o.b)("p",null,"To run our Rust app we need to provide a valid Dockerfile. If you are not familiar with Docker, you can take a look to ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),". Here is the content of our Dockerfile."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Our Dockerfile contains a multi-stage build. That is why we have two ",Object(o.b)("inlineCode",{parentName:"p"},"FROM")," instructions.\nOur final container image is optimized to be as light as possible.")),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-Dockerfile",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'####################################################################################################\n## Builder\n####################################################################################################\nFROM rust:latest AS builder\n\nRUN rustup target add x86_64-unknown-linux-musl\nRUN apt update && apt install -y musl-tools musl-dev\nRUN update-ca-certificates\n\n# Create appuser\nENV USER=app\nENV UID=10001\n\nRUN adduser \\\n --disabled-password \\\n --gecos "" \\\n --home "/nonexistent" \\\n --shell "/sbin/nologin" \\\n --no-create-home \\\n --uid "${UID}" \\\n "${USER}"\n\nWORKDIR /app\n\nCOPY ./ .\n\nRUN cargo build --target x86_64-unknown-linux-musl --release\n\n####################################################################################################\n## Final image\n####################################################################################################\nFROM scratch\n\n# Import from builder.\nCOPY --from=builder /etc/passwd /etc/passwd\nCOPY --from=builder /etc/group /etc/group\n\nWORKDIR /app\n\n# Copy our build\nCOPY --from=builder /app/target/x86_64-unknown-linux-musl/release/rust-prime-number-api ./\n\n# Use an unprivileged user.\nUSER app:app\n\nCMD ["/app/rust-prime-number-api"]\n')),Object(o.b)("h2",{id:"deploy-our-rust-rest-api-app-on-aws"},"Deploy our Rust REST API app on AWS"),Object(o.b)("p",null,"To deploy our Rust app on AWS we are going to use Qovery. Qovery is the simplest way to deploy any app on AWS. It is the perfect candidate to deploy our Rust REST API in a few steps."),Object(o.b)("h3",{id:"sign-up-into-qovery"},"Sign up into Qovery"),Object(o.b)("p",null,"First, you need to sign up or sign in on Qovery."),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://console.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.png",alt:"Qovery Sign-up page"}))))),Object(o.b)(i.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(i.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(i.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")))),Object(o.b)("h3",{id:"connect-your-aws-account"},"Connect your AWS account"),Object(o.b)("p",null,"To connect your AWS account check out ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"this guide"),"."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Qovery installation on your AWS account takes up to 30 minutes. You will be notified by email when it is over.")),Object(o.b)("h3",{id:"deploy-our-rust-rest-api-app"},"Deploy our Rust REST API app"),Object(o.b)("p",null,"Once your AWS account is set-up, you can deploy your Rust app by.."),Object(o.b)("p",null,"Creating a project ",Object(o.b)("inlineCode",{parentName:"p"},"prime number"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_project.png",alt:"Create a project"})),Object(o.b)("p",null,"Creating an environment ",Object(o.b)("inlineCode",{parentName:"p"},"prod"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_environment.png",alt:"Create an environment"})),Object(o.b)("p",null,"Creating an app by selecting your Rust app repository, build mode > ",Object(o.b)("strong",{parentName:"p"},"Dockerfile"),", and the port ",Object(o.b)("strong",{parentName:"p"},"8000"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app.png",alt:"Create an app"})),Object(o.b)("p",null,"And deploy! That's it \ud83d\udd25... nothing more. Our Rust REST API app is ready"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app_deployed.png",alt:"Our app is deployed"})),Object(o.b)("p",null,"Check out this video to see how I quickly deploy my Rust REST API with Qovery."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7ae48d3383da40159d8aa97c23aadb3e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Watch this video showing the final result \ud83d\udc47"),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/30cc34ef166a4fdaaeb0a9e864bf7836",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"Rust combined to Rocket web framework turns building REST API super easy. Deploying your Rust app on AWS with Qovery is as simple as selecting your GitHub repository. Nothing more. Hope you liked it."),Object(o.b)("h2",{id:"useful-resources"},"Useful resources"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"Source code")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://rocket.rs"}),"Rocket framework")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://circleci.com/blog/rust-cd/"}),"Rust Circle CI"))),Object(o.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),r=a.n(n),o=a(463),l=a.n(o);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":n,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},468:function(e,t,a){var n=a(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||a(10)&&n(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),r=a.n(n),o=a(464);t.a=function(e){var t=e.children,a=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),r=a(0),o=a.n(r),l=a(39),i=a(474),c=a(20),s=a.n(c);t.a=function(e){var t,a=e.to,c=e.href,u=a||c,b=Object(i.a)(u),p=Object(r.useRef)(!1),m=s.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!m&&b&&window.docusaurus.prefetch(u),function(){m&&t&&t.disconnect()}}),[u,m,b]),u&&b?o.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(u),p.current=!0)},innerRef:function(e){var a,n;m&&e&&b&&(a=e,n=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:u})):o.a.createElement("a",Object(n.a)({},e,{href:u}))}},473:function(e,t,a){"use strict";var n=a(0),r=a.n(n),o=a(470),l=a(463),i=a.n(l);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,c=e.rightIcon,s=e.size,u=e.target,b=e.to,p=i()("jump-to","jump-to--"+s,a),m=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},l&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+l})),r.a.createElement("div",{className:"jump-to--main"},n?r.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(c||"chevron-right")+" arrow"}))));return u?r.a.createElement("a",{href:b,target:u,className:p},m):r.a.createElement(o.a,{to:b,className:p},m)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),r=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),o=a.n(r),l=a(483),i=a(463),c=a.n(i),s=a(471),u=a.n(s),b=a(482),p=37,m=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:a?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},s.map((function(e){var t=e.value,a=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function g(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,s=e.select,h=e.size,O=(e.style,e.values),j=e.urlKey,f=Object(b.a)(),y=f.tabGroupChoices,v=f.setTabGroupChoices,w=Object(r.useState)(a),N=w[0],R=w[1];if(null!=l){var T=y[l];null!=T&&T!==N&&R(T)}var I=function(e){R(e),null!=l&&v(l,e)},k=[],S=function(e,t,a){switch(a.keyCode){case m:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=u.a.parse(window.location.search);e[j]&&R(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(h||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),O.length>1&&(s?o.a.createElement(g,Object(n.a)({changeSelectedValue:I,handleKeydown:S,placeholder:c,selectedValue:N,size:h,tabRefs:k},e)):o.a.createElement(d,Object(n.a)({changeSelectedValue:I,handleKeydown:S,selectedValue:N,tabRefs:k},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},478:function(e,t,a){"use strict";var n=a(0),r=a.n(n);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/3ecdd190.293940c0.js b/3ecdd190.293940c0.js new file mode 100644 index 0000000000..4e2de981d1 --- /dev/null +++ b/3ecdd190.293940c0.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{231:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return s})),a.d(t,"metadata",(function(){return b})),a.d(t,"rightToc",(function(){return p})),a.d(t,"default",(function(){return m}));var n=a(1),r=a(9),l=(a(0),a(465)),i=a(477),o=a(478),u=a(472),c=a(469),s={last_modified_on:"2024-11-30",$schema:"/.meta/.schemas/guides.json",title:"Deploy JupyterHub using Helm",description:"How to deploy JupyterHub on Qovery using the official Helm chart.",author_github:"https://github.com/baalooos",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},b={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Deploy JupyterHub using Helm",description:"How to deploy JupyterHub on Qovery using the official Helm chart.",permalink:"/guides/tutorial/deploy-jupyterhub-qovery",readingTime:"3 min read",source:"@site/guides/tutorial/deploy-jupyterhub-qovery.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Deploy JupyterHub using Helm",truncated:!1,prevItem:{title:"Deploy Frontend App",permalink:"/guides/advanced/deploy-frontend"},nextItem:{title:"Deploy Rails with PostgreSQL and Sidekiq",permalink:"/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq"}},p=[{value:"Installation",id:"installation",children:[]},{value:"Conclusion",id:"conclusion",children:[]}],d={rightToc:p};function m(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(l.b)("wrapper",Object(n.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(l.b)("p",null,"JupyterHub is an easy way to interact with a computing environment through a webpage. It provides a standardized way to serve Jupyter Notebooks for multiple users. Pairing it with Kubernetes and Qovery makes it easier to manage and scale."),Object(l.b)(c.a,{name:"guide",mdxType:"Assumptions"},Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"You have a Qovery cluster ready"),Object(l.b)("li",{parentName:"ul"},"You have a dedicated Qovery project and environment to deploy JupyterHub (example: Project=JupyterHub, Environment=Production)"))),Object(l.b)("h2",{id:"installation"},"Installation"),Object(l.b)("p",null,"The easiest way to deploy JupyterHub is using the official ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/jupyterhub/helm-chart"}),"Helm Chart"),". It will create all the resources you need to run JupyterHub."),Object(l.b)("p",null,"For more information, the official documentation is available ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/jupyterhub/installation.html"}),"here"),"."),Object(l.b)(u.a,{headingDepth:3,mdxType:"Steps"},Object(l.b)("ol",null,Object(l.b)("li",null,Object(l.b)("h4",{id:"add-the-jupyterhub-helm-repository"},"Add the JupyterHub helm repository"),Object(l.b)("p",null,"Add the JupyterHub helm repository in your Qovery settings by following ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/organization/helm-repository/"}),"this documentation")),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"Repository name: ",Object(l.b)("inlineCode",{parentName:"li"},"JupyterHub")),Object(l.b)("li",{parentName:"ul"},"Kind: ",Object(l.b)("inlineCode",{parentName:"li"},"HTTPS")),Object(l.b)("li",{parentName:"ul"},"Repository URL: ",Object(l.b)("inlineCode",{parentName:"li"},"https://hub.jupyter.org/helm-chart/")))),Object(l.b)("li",null,Object(l.b)("h4",{id:"create-the-jupyterhub-service-within-qovery"},"Create the JupyterHub service within Qovery"),Object(l.b)("p",null,"Create the JupyterHub service in the Qovery environment of your choice (preferably within a dedicated JupyterHub project) by following ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/helm/"}),"this documentation")," and these values:"),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"General:",Object(l.b)("ul",{parentName:"li"},Object(l.b)("li",{parentName:"ul"},"Application name: ",Object(l.b)("inlineCode",{parentName:"li"},"JupyterHub")),Object(l.b)("li",{parentName:"ul"},"Source:",Object(l.b)("ul",{parentName:"li"},Object(l.b)("li",{parentName:"ul"},"Helm source: ",Object(l.b)("inlineCode",{parentName:"li"},"Helm repository")),Object(l.b)("li",{parentName:"ul"},"Repository: ",Object(l.b)("inlineCode",{parentName:"li"},"JupyterHub")," (the name given during the JupyterHub helm repository added in the previous step)"),Object(l.b)("li",{parentName:"ul"},"Chart name: ",Object(l.b)("inlineCode",{parentName:"li"},"jupyterhub")),Object(l.b)("li",{parentName:"ul"},"Version: ",Object(l.b)("inlineCode",{parentName:"li"},"3.3.7")," (this is the version we used for this setup, update it based on the chosen version)"),Object(l.b)("li",{parentName:"ul"},"Allow cluster-wide resources \u2714\ufe0f"))))),Object(l.b)("li",{parentName:"ul"},"Values",Object(l.b)("ul",{parentName:"li"},Object(l.b)("li",{parentName:"ul"},"Values override as file:"),Object(l.b)("li",{parentName:"ul"},"File source: ",Object(l.b)("inlineCode",{parentName:"li"},"Raw YAML")),Object(l.b)("li",{parentName:"ul"},"Raw YAML:")))),Object(l.b)(i.a,{centered:!0,className:"rounded",defaultValue:"default",placeholder:"Select your cluster type",select:!1,size:null,values:[{group:"Cluster",label:"Default",value:"default"},{group:"Cluster",label:"AWS with Karpenter",value:"karpenter"}],mdxType:"Tabs"},Object(l.b)(o.a,{value:"default",mdxType:"TabItem"},Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'fullnameOverride: "jupyterhub"\nproxy:\n service:\n type: ClusterIP\n'))),Object(l.b)(o.a,{value:"EKS with karpenter",mdxType:"TabItem"},Object(l.b)("p",null,"To ensure every node created by Karpenter is monitored by Datadog, we need to configure a priority class."),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'fullnameOverride: "jupyterhub"\nproxy:\n service:\n type: ClusterIP\nscheduling:\n podPriority:\n enabled: true\n globalDefault: true\n defaultPriority: 50\n imagePullerPriority: 1000\n userPlaceholderPriority: 0\n')))),Object(l.b)("p",null,"There are many other values you can set to modify the JupyterHub behavior. For advanced usage, check: ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/jupyterhub/customization.html"}),"JupyterHub Customization")),Object(l.b)("p",null,"Now get to the last step and ",Object(l.b)("inlineCode",{parentName:"p"},"Create")," the service on Qovery.")),Object(l.b)("li",null,Object(l.b)("h4",{id:"add-network-configuration"},"Add Network configuration"),Object(l.b)("p",null,"In the previous step, we created the JupyterHub service. In this step, we will update its configuration to make it available on the public network (through Qovery Nginx Ingress)."),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"Open the JupyterHub service details"),Object(l.b)("li",{parentName:"ul"},"Enter the ",Object(l.b)("inlineCode",{parentName:"li"},"Settings")," section"),Object(l.b)("li",{parentName:"ul"},"Click on ",Object(l.b)("inlineCode",{parentName:"li"},"Networking")),Object(l.b)("li",{parentName:"ul"},"Add a new Port with:",Object(l.b)("ul",{parentName:"li"},Object(l.b)("li",{parentName:"ul"},"Service name: jupyterhub-proxy-public"),Object(l.b)("li",{parentName:"ul"},"Service port: 80"),Object(l.b)("li",{parentName:"ul"},"Select protocol: HTTP"),Object(l.b)("li",{parentName:"ul"},"External port: 443"),Object(l.b)("li",{parentName:"ul"},"Port name: jupyterhub-proxy-public-p80")))),Object(l.b)("p",null,"If you need more information on how to manage your ports, have a look at ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://hub.qovery.com/docs/using-qovery/configuration/application/#ports"}),"this"))),Object(l.b)("li",null,Object(l.b)("h4",{id:"deploy-your-chart"},"Deploy your chart"),Object(l.b)("p",null,"Open the ",Object(l.b)("inlineCode",{parentName:"p"},"Play")," button and trigger the deployment of your chart."),Object(l.b)("p",{align:"center"},Object(l.b)("img",{src:"/img/deploy-jupyterhub-qovery/deploy.png",alt:"JupyterHub - Deploy"}))),Object(l.b)("li",null,Object(l.b)("h4",{id:"access-jupyterhub"},"Access JupyterHub"),Object(l.b)("p",null,"You can click the ",Object(l.b)("inlineCode",{parentName:"p"},"Link")," button to access JupyterHub on your cluster."),Object(l.b)("p",{align:"center"},Object(l.b)("img",{src:"/img/deploy-jupyterhub-qovery/link.png",alt:"JupyterHub - Link"})),Object(l.b)("p",null,"Now you can login to the webUI and start playing with Jupyter Notebooks.")))),Object(l.b)("h2",{id:"conclusion"},"Conclusion"),Object(l.b)("p",null,"JupyterHub is running on your Qovery cluster. This is a simple installation and you should try to ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/jupyterhub/customization.html"}),"customize")," it according to your needs. You can also check the",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/administrator/index.html"}),"Adminstrator Guide"),"to better understand how it works."))}m.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),r=a.n(n),l=a(463),i=a.n(l);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,l=e.icon,o=e.type,u=null;switch(o){case"danger":u="alert-triangle";break;case"success":u="check-circle";break;case"warning":u="alert-triangle";break;default:u="info"}return r.a.createElement("div",{className:i()(a,"alert","alert--"+o,{"alert--fill":n,"alert--icon":!1!==l}),role:"alert"},!1!==l&&r.a.createElement("i",{className:i()("feather","icon-"+(l||u))}),t)}},468:function(e,t,a){var n=a(28).f,r=Function.prototype,l=/^\s*function ([^ (]*)/;"name"in r||a(10)&&n(r,"name",{configurable:!0,get:function(){try{return(""+this).match(l)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),r=a.n(n),l=a(464);t.a=function(e){var t=e.children,a=e.name;return r.a.createElement(l.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},472:function(e,t,a){"use strict";var n=a(0),r=a.n(n),l=(a(463),a(471)),i=a.n(l);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,l=e.hideFeedbackQuestion,o="undefined"!=typeof window?window.location:null,u={title:"Tutorial on "+o+" failed",body:"The tutorial on:\n\n"+o+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(u),s=Object(n.useState)(null),b=s[0],p=s[1];return r.a.createElement("div",{className:"steps steps--h"+a},t,!l&&!b&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==b&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,t,a){"use strict";var n=a(1),r=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),l=a.n(r),i=a(483),o=a(463),u=a.n(o),c=a(471),s=a.n(c),b=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,r=e.className,i=e.handleKeydown,o=e.style,c=e.values,s=e.selectedValue,b=e.tabRefs;return l.a.createElement("div",{className:a?"tabs--centered":null},l.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:u()("tabs",r,{"tabs--block":t}),style:o},c.map((function(e){var t=e.value,a=e.label;return l.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:u()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return i(b,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,r=e.size,o=e.values,u=o;if(u[0].group){var c=_.groupBy(u,"group");u=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return l.a.createElement(i.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:u,isClearable:a,placeholder:t,value:o.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,i=e.groupId,o=e.label,u=e.placeholder,c=e.select,y=e.size,j=(e.style,e.values),g=e.urlKey,f=Object(b.a)(),O=f.tabGroupChoices,v=f.setTabGroupChoices,N=Object(r.useState)(a),w=N[0],k=N[1];if(null!=i){var H=O[i];null!=H&&H!==w&&k(H)}var C=function(e){k(e),null!=i&&v(i,e)},J=[],T=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=s.a.parse(window.location.search);e[g]&&k(e[g])}}),[]),l.a.createElement(l.a.Fragment,null,l.a.createElement("div",{className:"margin-bottom--"+(y||"md")},o&&l.a.createElement("div",{className:"margin-vert--sm"},o),j.length>1&&(c?l.a.createElement(h,Object(n.a)({changeSelectedValue:C,handleKeydown:T,placeholder:u,selectedValue:w,size:y,tabRefs:J},e)):l.a.createElement(m,Object(n.a)({changeSelectedValue:C,handleKeydown:T,selectedValue:w,tabRefs:J},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===w}))[0])}},478:function(e,t,a){"use strict";var n=a(0),r=a.n(n);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/3ecdd190.64c8efaf.js b/3ecdd190.64c8efaf.js deleted file mode 100644 index 0cbbeebe22..0000000000 --- a/3ecdd190.64c8efaf.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 3ecdd190.64c8efaf.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{231:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return u})),n.d(t,"metadata",(function(){return c})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return b}));var r=n(1),a=n(9),o=(n(0),n(465)),i=n(472),l=n(469),u={last_modified_on:"2024-07-19",$schema:"/.meta/.schemas/guides.json",title:"Deploy JupyterHub using Helm",description:"How to deploy JupyterHub on Qovery using the official Helm chart.",author_github:"https://github.com/baalooos",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},c={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Deploy JupyterHub using Helm",description:"How to deploy JupyterHub on Qovery using the official Helm chart.",permalink:"/guides/tutorial/deploy-jupyterhub-qovery",readingTime:"3 min read",source:"@site/guides/tutorial/deploy-jupyterhub-qovery.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Deploy JupyterHub using Helm",truncated:!1,prevItem:{title:"Deploy Frontend App",permalink:"/guides/advanced/deploy-frontend"},nextItem:{title:"Deploy Rails with PostgreSQL and Sidekiq",permalink:"/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq"}},s=[{value:"Installation",id:"installation",children:[]},{value:"Conclusion",id:"conclusion",children:[]}],p={rightToc:s};function b(e){var t=e.components,n=Object(a.a)(e,["components"]);return Object(o.b)("wrapper",Object(r.a)({},p,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"JupyterHub is an easy way to interact with a computing environment through a webpage. It provides a standardized way to serve Jupyter Notebooks for multiple users. Pairing it with Kubernetes and Qovery makes it easier to manage and scale."),Object(o.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have a Qovery cluster ready"),Object(o.b)("li",{parentName:"ul"},"You have a dedicated Qovery project and environment to deploy JupyterHub (example: Project=JupyterHub, Environment=Production)"))),Object(o.b)("h2",{id:"installation"},"Installation"),Object(o.b)("p",null,"The easiest way to deploy JupyterHub is using the official ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://github.com/jupyterhub/helm-chart"}),"Helm Chart"),". It will create all the resources you need to run JupyterHub."),Object(o.b)("p",null,"For more information, the official documentation is available ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/jupyterhub/installation.html"}),"here"),"."),Object(o.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("h4",{id:"add-the-jupyterhub-helm-repository"},"Add the JupyterHub helm repository"),Object(o.b)("p",null,"Add the JupyterHub helm repository in your Qovery settings by following ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/organization/helm-repository/"}),"this documentation")),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Repository name: ",Object(o.b)("inlineCode",{parentName:"li"},"JupyterHub")),Object(o.b)("li",{parentName:"ul"},"Kind: ",Object(o.b)("inlineCode",{parentName:"li"},"HTTPS")),Object(o.b)("li",{parentName:"ul"},"Repository URL: ",Object(o.b)("inlineCode",{parentName:"li"},"https://hub.jupyter.org/helm-chart/")))),Object(o.b)("li",null,Object(o.b)("h4",{id:"create-the-jupyterhub-service-within-qovery"},"Create the JupyterHub service within Qovery"),Object(o.b)("p",null,"Create the JupyterHub service in the Qovery environment of your choice (preferably within a dedicated JupyterHub project) by following ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/helm/"}),"this documentation")," and these values:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"General:",Object(o.b)("ul",{parentName:"li"},Object(o.b)("li",{parentName:"ul"},"Application name: ",Object(o.b)("inlineCode",{parentName:"li"},"JupyterHub")),Object(o.b)("li",{parentName:"ul"},"Source:",Object(o.b)("ul",{parentName:"li"},Object(o.b)("li",{parentName:"ul"},"Helm source: ",Object(o.b)("inlineCode",{parentName:"li"},"Helm repository")),Object(o.b)("li",{parentName:"ul"},"Repository: ",Object(o.b)("inlineCode",{parentName:"li"},"JupyterHub")," (the name given during the JupyterHub helm repository added in the previous step)"),Object(o.b)("li",{parentName:"ul"},"Chart name: ",Object(o.b)("inlineCode",{parentName:"li"},"jupyterhub")),Object(o.b)("li",{parentName:"ul"},"Version: ",Object(o.b)("inlineCode",{parentName:"li"},"3.3.7")," (this is the version we used for this setup, update it based on the chosen version)"),Object(o.b)("li",{parentName:"ul"},"Allow cluster-wide resources \u2714\ufe0f"))))),Object(o.b)("li",{parentName:"ul"},"Values",Object(o.b)("ul",{parentName:"li"},Object(o.b)("li",{parentName:"ul"},"Values override as file:"),Object(o.b)("li",{parentName:"ul"},"File source: ",Object(o.b)("inlineCode",{parentName:"li"},"Raw YAML")),Object(o.b)("li",{parentName:"ul"},"Raw YAML:")))),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-yaml"}),'fullnameOverride: "jupyterhub"\nproxy:\n service:\n type: ClusterIP\n')),Object(o.b)("p",null,"There are many other values you can set to modify the JupyterHub behavior. For advanced usage, check: ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/jupyterhub/customization.html"}),"JupyterHub Customization")),Object(o.b)("p",null,"Now get to the last step and ",Object(o.b)("inlineCode",{parentName:"p"},"Create")," the service on Qovery.")),Object(o.b)("li",null,Object(o.b)("h4",{id:"add-network-configuration"},"Add Network configuration"),Object(o.b)("p",null,"In the previous step, we created the JupyterHub service. In this step, we will update its configuration to make it available on the public network (through Qovery Nginx Ingress)."),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Open the JupyterHub service details"),Object(o.b)("li",{parentName:"ul"},"Enter the ",Object(o.b)("inlineCode",{parentName:"li"},"Settings")," section"),Object(o.b)("li",{parentName:"ul"},"Click on ",Object(o.b)("inlineCode",{parentName:"li"},"Networking")),Object(o.b)("li",{parentName:"ul"},"Add a new Port with:",Object(o.b)("ul",{parentName:"li"},Object(o.b)("li",{parentName:"ul"},"Service name: jupyterhub-proxy-public"),Object(o.b)("li",{parentName:"ul"},"Service port: 80"),Object(o.b)("li",{parentName:"ul"},"Select protocol: HTTP"),Object(o.b)("li",{parentName:"ul"},"External port: 443"),Object(o.b)("li",{parentName:"ul"},"Port name: jupyterhub-proxy-public-p80")))),Object(o.b)("p",null,"If you need more information on how to manage your ports, have a look at ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://hub.qovery.com/docs/using-qovery/configuration/application/#ports"}),"this"))),Object(o.b)("li",null,Object(o.b)("h4",{id:"deploy-your-chart"},"Deploy your chart"),Object(o.b)("p",null,"Open the ",Object(o.b)("inlineCode",{parentName:"p"},"Play")," button and trigger the deployment of your chart."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-jupyterhub-qovery/deploy.png",alt:"JupyterHub - Deploy"}))),Object(o.b)("li",null,Object(o.b)("h4",{id:"access-jupyterhub"},"Access JupyterHub"),Object(o.b)("p",null,"You can click the ",Object(o.b)("inlineCode",{parentName:"p"},"Link")," button to access JupyterHub on your cluster."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-jupyterhub-qovery/link.png",alt:"JupyterHub - Link"})),Object(o.b)("p",null,"Now you can login to the webUI and start playing with Jupyter Notebooks.")))),Object(o.b)("h2",{id:"conclusion"},"Conclusion"),Object(o.b)("p",null,"JupyterHub is running on your Qovery cluster. This is a simple installation and you should try to ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/jupyterhub/customization.html"}),"customize")," it according to your needs. You can also check the",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/administrator/index.html"}),"Adminstrator Guide"),"to better understand how it works."))}b.isMDXComponent=!0},463:function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function a(){for(var e=[],t=0;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),s=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l({},t,{},e)),n},p=function(e){var t=s(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},m=Object(r.forwardRef)((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,c=u(e,["components","mdxType","originalType","parentName"]),p=s(n),m=r,d=p["".concat(i,".").concat(m)]||p[m]||b[m]||o;return n?a.a.createElement(d,l({ref:t},c,{components:n})):a.a.createElement(d,l({ref:t},c))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var c=2;c1?arguments[1]:void 0,n),u=i>2?arguments[2]:void 0,c=void 0===u?n:a(u,n);c>l;)t[l++]=e;return t}},468:function(e,t,n){var r=n(28).f,a=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in a||n(10)&&r(a,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var r=n(0),a=n.n(r),o=n(464);t.a=function(e){var t=e.children,n=e.name;return a.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},a.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},471:function(e,t,n){"use strict";var r=n(475),a=n(51);function o(e,t){return t.encode?t.strict?r(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var n=function(e){var t;switch(e.arrayFormat){case"index":return function(e,n,r){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===r[e]&&(r[e]={}),r[e][t[1]]=n):r[e]=n};case"bracket":return function(e,n,r){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==r[e]?r[e]=[].concat(r[e],n):r[e]=[n]:r[e]=n};default:return function(e,t,n){void 0!==n[e]?n[e]=[].concat(n[e],t):n[e]=t}}}(t=a({arrayFormat:"none"},t)),r=Object.create(null);return"string"!=typeof e?r:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),a=t.shift(),o=t.length>0?t.join("="):void 0;o=void 0===o?null:decodeURIComponent(o),n(decodeURIComponent(a),o,r)})),Object.keys(r).sort().reduce((function(e,t){var n=r[t];return Boolean(n)&&"object"==typeof n&&!Array.isArray(n)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(n):e[t]=n,e}),Object.create(null))):r},t.stringify=function(e,t){var n=function(e){switch(e.arrayFormat){case"index":return function(t,n,r){return null===n?[o(t,e),"[",r,"]"].join(""):[o(t,e),"[",o(r,e),"]=",o(n,e)].join("")};case"bracket":return function(t,n){return null===n?o(t,e):[o(t,e),"[]=",o(n,e)].join("")};default:return function(t,n){return null===n?o(t,e):[o(t,e),"=",o(n,e)].join("")}}}(t=a({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(r){var a=e[r];if(void 0===a)return"";if(null===a)return o(r,t);if(Array.isArray(a)){var i=[];return a.slice().forEach((function(e){void 0!==e&&i.push(n(r,e,i.length))})),i.join("&")}return o(r,t)+"="+o(a,t)})).filter((function(e){return e.length>0})).join("&"):""}},472:function(e,t,n){"use strict";var r=n(0),a=n.n(r),o=(n(463),n(471)),i=n.n(o);n(133);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,u={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(u),s=Object(r.useState)(null),p=s[0],b=s[1];return a.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!p&&a.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",a.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return b("yes")}},"Yes"),"\xa0\xa0",a.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==p&&a.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",a.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},475:function(e,t,n){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}}}]); \ No newline at end of file diff --git a/4.b2810696.js b/4.73945e41.js similarity index 99% rename from 4.b2810696.js rename to 4.73945e41.js index 434473c64f..576eb405a5 100644 --- a/4.b2810696.js +++ b/4.73945e41.js @@ -1,2 +1,2 @@ -/*! For license information please see 4.b2810696.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{485:function(e,t,n){"use strict";var r=n(0),o=n(525);t.a=function(){return Object(r.useContext)(o.a)}},492:function(e,t,n){"use strict";var r=n(0);t.a=function(e){void 0===e&&(e=!0),Object(r.useEffect)((function(){return document.body.style.overflow=e?"hidden":"visible",function(){document.body.style.overflow="visible"}}),[e])}},493:function(e,t,n){"use strict";var r=n(476),o=n(485),a=n(480),c=n(474);t.a=function(){var e=Object(r.a)().siteConfig,t=(e=void 0===e?{}:e).baseUrl,n=e.themeConfig.navbar,i=(n=void 0===n?{}:n).logo,l=void 0===i?{}:i,s=Object(o.a)().isDarkTheme,u=l.href||t,d={};l.target?d={target:l.target}:Object(c.a)(u)||(d={rel:"noopener noreferrer",target:"_blank"});var h=l.srcDark&&s?l.srcDark:l.src;return{logoLink:u,logoLinkProps:d,logoImageUrl:Object(a.a)(h),logoAlt:l.alt}}},497:function(e,t,n){"use strict";var r=n(12),o=n(26),a=n(557),c="".endsWith;r(r.P+r.F*n(558)("endsWith"),"String",{endsWith:function(e){var t=a(this,e,"endsWith"),n=arguments.length>1?arguments[1]:void 0,r=o(t.length),i=void 0===n?r:Math.min(o(n),r),l=String(e);return c?c.call(t,l,i):t.slice(i-l.length,i)===l}})},498:function(e,t,n){"use strict";var r=n(0),o=n.n(r),a=n(476),c=n(145),i=n.n(c);t.a=function(){var e=Object(a.a)().siteConfig,t=(e=void 0===e?{}:e).themeConfig.announcementBar,n=void 0===t?{}:t,c=n.id,l=n.content,s=n.backgroundColor,u=n.textColor,d=Object(r.useState)(!0),h=d[0],f=d[1];return Object(r.useEffect)((function(){var e=localStorage.getItem("docusaurus.announcement.id"),t=c!==e;localStorage.setItem("docusaurus.announcement.id",c),t&&localStorage.setItem("docusaurus.announcement.dismiss",!1),(t||"false"===localStorage.getItem("docusaurus.announcement.dismiss"))&&f(!1)}),[]),!l||h?null:o.a.createElement("div",{className:i.a.announcementBar,style:{backgroundColor:s,color:u},role:"banner"},o.a.createElement("div",{className:i.a.announcementBarContent,dangerouslySetInnerHTML:{__html:l}}),o.a.createElement("button",{type:"button",className:i.a.announcementBarClose,onClick:function(){localStorage.setItem("docusaurus.announcement.dismiss",!0),f(!0)},"aria-label":"Close"},o.a.createElement("span",{"aria-hidden":"true"},"\xd7")))}},499:function(e,t,n){"use strict";var r=n(0);r.PureComponent},500:function(e,t,n){"use strict";n(58),n(29),n(22),n(21),n(79);var r=n(0),o=n.n(r),a=n(463),c=n.n(a),i=n(476),l=n(512);n(146);t.a=function(e){var t=Object(r.useState)(!1),a=t[0],s=t[1],u=Object(r.useRef)(null),d=Object(i.a)().siteConfig,h=(void 0===d?{}:d).themeConfig.algolia,f=Object(l.c)();var p=function(e){void 0===e&&(e=!0),a||Promise.all([n.e(309).then(n.t.bind(null,610,7)),n.e(209).then(n.t.bind(null,623,7))]).then((function(t){var n=t[0].default;s(!0),window.docsearch=n,function(e){window.docsearch({appId:h.appId,apiKey:h.apiKey,indexName:h.indexName,inputSelector:"#search_input_react",algoliaOptions:h.algoliaOptions,handleSelected:function(e,t,n){var r=document.createElement("a");r.href=n.url;var o="#__docusaurus"===r.hash?""+r.pathname:""+r.pathname+r.hash;f.push(o)}}),e&&u.current.focus()}(e)}))},g=Object(r.useCallback)((function(){p(),a&&u.current.focus(),e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]),v=Object(r.useCallback)((function(){e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]),b=Object(r.useCallback)((function(e){var t="mouseover"!==e.type;p(t)}));return o.a.createElement("div",{className:"navbar__search",key:"search-box"},o.a.createElement("span",{"aria-label":"expand searchbar",role:"button",className:c()("search-icon",{"search-icon-hidden":e.isSearchBarExpanded}),onClick:g,onKeyDown:g,tabIndex:0}),o.a.createElement("input",{id:"search_input_react",type:"search",placeholder:"Search","aria-label":"Search",className:c()("navbar__search-input",{"search-bar-expanded":e.isSearchBarExpanded},{"search-bar":!e.isSearchBarExpanded}),onMouseOver:b,onFocus:b,onBlur:v,ref:u}))}},501:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;tthis.startX&&(this.setState({checked:!0}),this.startX=t,this.activated=tn?this.previouslyChecked!==this.state.checked&&(this.setState({checked:!1}),this.previouslyChecked=this.state.checked,t.click()):this.startX-4=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(t,["className","icons"])),a=(0,i.default)("react-toggle",{"react-toggle--checked":this.state.checked,"react-toggle--focus":this.state.hasFocus,"react-toggle--disabled":this.props.disabled},n);return c.default.createElement("div",{className:a,onClick:this.handleClick,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEnd},c.default.createElement("div",{className:"react-toggle-track"},c.default.createElement("div",{className:"react-toggle-track-check"},this.getIcon("checked")),c.default.createElement("div",{className:"react-toggle-track-x"},this.getIcon("unchecked"))),c.default.createElement("div",{className:"react-toggle-thumb"}),c.default.createElement("input",r({},o,{ref:function(t){e.input=t},onFocus:this.handleFocus,onBlur:this.handleBlur,className:"react-toggle-screenreader-only",type:"checkbox"})))}}]),t}(a.PureComponent);t.default=f,f.displayName="Toggle",f.defaultProps={icons:{checked:c.default.createElement(s.default,null),unchecked:c.default.createElement(u.default,null)}},f.propTypes={checked:l.default.bool,disabled:l.default.bool,defaultChecked:l.default.bool,onChange:l.default.func,onFocus:l.default.func,onBlur:l.default.func,className:l.default.string,name:l.default.string,value:l.default.string,id:l.default.string,"aria-labelledby":l.default.string,"aria-label":l.default.string,icons:l.default.oneOfType([l.default.bool,l.default.shape({checked:l.default.node,unchecked:l.default.node})])}},502:function(e,t,n){"use strict";var r=n(0),o=n.n(r),a=(n(84),n(513),function(){var e=Object(r.useState)({}),t=e[0],n=e[1],o=Object(r.useCallback)((function(e,t){try{localStorage.setItem("docusaurus.tab."+e,t)}catch(n){console.error(n)}}),[]);return Object(r.useEffect)((function(){try{for(var e={},t=0;t=d?c(!1):e+n'},heart:{width:12,height:16,path:''},eye:{width:16,height:16,path:''},star:{width:14,height:16,path:''},"repo-forked":{width:10,height:16,path:''},"repo-template":{width:14,height:16,path:''},"issue-opened":{width:14,height:16,path:''},"cloud-download":{width:16,height:16,path:''}},m={},k=function(e,t){var n=m[e]||(m[e]=[]);if(!(n.push(t)>1)){var r=function(e){var t;return function(){t||(t=1,e.apply(this,arguments))}}((function(){for(delete m[e];t=n.shift();)t.apply(null,arguments)}));if(u){var o=new c;h(o,"abort",r),h(o,"error",r),h(o,"load",(function(){var e;try{e=JSON.parse(o.responseText)}catch(t){return void r(t)}r(200!==o.status,e)})),o.open("GET",e),o.send()}else{var a=this||window;a._=function(e){a._=null,r(200!==e.meta.status,e.data)};var l=i(a.document)("script",{async:!0,src:e+(/\?/.test(e)?"&":"?")+"callback=_"}),s=function(){a._&&a._({meta:{}})};h(l,"load",s),h(l,"error",s),l.readyState&&function(e,t,n){var r=function(o){if(t.test(e.readyState))return f(e,"readystatechange",r),n(o)};h(e,"readystatechange",r)}(l,/de|m/,s),a.document.getElementsByTagName("head")[0].appendChild(l)}}},w=function(e,t,n){var r=i(e.ownerDocument),o=e.appendChild(r("style",{type:"text/css"})),a="body{margin:0}a{text-decoration:none;outline:0}.widget{display:inline-block;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:0;white-space:nowrap}.btn,.social-count{position:relative;display:inline-block;height:14px;padding:2px 5px;font-size:11px;font-weight:600;line-height:14px;vertical-align:bottom;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-repeat:repeat-x;background-position:-1px -1px;background-size:110% 110%;border:1px solid}.btn{border-radius:.25em}.btn:not(:last-child){border-radius:.25em 0 0 .25em}.social-count{border-left:0;border-radius:0 .25em .25em 0}.widget-lg .btn,.widget-lg .social-count{height:20px;padding:3px 10px;font-size:12px;line-height:20px}.octicon{display:inline-block;vertical-align:text-top;fill:currentColor}"+v(t["data-color-scheme"]);o.styleSheet?o.styleSheet.cssText=a:o.appendChild(e.ownerDocument.createTextNode(a));var c,l,u=r("a",{className:"btn",href:t.href,target:"_blank",rel:"noopener",innerHTML:(c=t["data-icon"],l=/^large$/i.test(t["data-size"])?16:14,c=(""+c).toLowerCase().replace(/^octicon-/,""),s(b,c)||(c="mark-github"),'"),"aria-label":t["aria-label"]||void 0},[" ",r("span",{},[t["data-text"]||""])]),d=e.appendChild(r("div",{className:"widget"+(/^large$/i.test(t["data-size"])?" widget-lg":"")},[u])),h=u.hostname.split(".").reverse();if(""===h[0]&&h.shift(),"com"!==h[0]||"github"!==h[1])return u.href="#",u.target="_self",void n(d);var f=h.length,p=(" /"+u.pathname).split(/\/+/);if(((2===f||3===f&&"gist"===h[2])&&"archive"===p[3]||2===f&&"releases"===p[3]&&"download"===p[4]||3===f&&"codeload"===h[2])&&(u.target="_top"),/^true$/i.test(t["data-show-count"])&&2===f){var g,m;if(!p[2]&&p[1])g=m="followers";else if(!p[3]&&p[2])m="stargazers_count",g="stargazers";else if(p[4]||"subscription"!==p[3])if(p[4]||"fork"!==p[3]){if("issues"!==p[3])return void n(d);m="open_issues_count",g="issues"}else m="forks_count",g="network/members";else m="subscribers_count",g="watchers";var w=p[2]?"/repos/"+p[1]+"/"+p[2]:"/users/"+p[1];k.call(this,"https://api.github.com"+w,(function(e,t){if(!e){var o=t[m];d.appendChild(r("a",{className:"social-count",href:t.html_url+"/"+g,target:"_blank",rel:"noopener","aria-label":o+" "+m.replace(/_count$/,"").replace("_"," ").slice(0,o<2?-1:void 0)+" on GitHub"},[(""+o).replace(/\B(?=(\d{3})+(?!\d))/g,",")]))}n(d)}))}else n(d)},y=window.devicePixelRatio||1,C=function(e){return(y>1?o.ceil(o.round(e*y)/y*2)/2:o.ceil(e))||0},x=function(e,t){e.style.width=t[0]+"px",e.style.height=t[1]+"px"},E=function(e,t){if(null!=e&&null!=t)if(e.getAttribute&&(e=function(e){for(var t={href:e.href,title:e.title,"aria-label":e.getAttribute("aria-label")},n=["icon","color-scheme","text","size","show-count"],r=0,o=n.length;r0){var n=t[0];return{x:n.clientX,y:n.clientY}}var r=e.pageX;if(void 0!==r)return{x:r,y:e.pageY}}return{x:0,y:0}}}}]); \ No newline at end of file +/*! For license information please see 4.73945e41.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{485:function(e,t,n){"use strict";var r=n(0),o=n(525);t.a=function(){return Object(r.useContext)(o.a)}},492:function(e,t,n){"use strict";var r=n(0);t.a=function(e){void 0===e&&(e=!0),Object(r.useEffect)((function(){return document.body.style.overflow=e?"hidden":"visible",function(){document.body.style.overflow="visible"}}),[e])}},493:function(e,t,n){"use strict";var r=n(476),o=n(485),a=n(481),c=n(474);t.a=function(){var e=Object(r.a)().siteConfig,t=(e=void 0===e?{}:e).baseUrl,n=e.themeConfig.navbar,i=(n=void 0===n?{}:n).logo,l=void 0===i?{}:i,s=Object(o.a)().isDarkTheme,u=l.href||t,d={};l.target?d={target:l.target}:Object(c.a)(u)||(d={rel:"noopener noreferrer",target:"_blank"});var h=l.srcDark&&s?l.srcDark:l.src;return{logoLink:u,logoLinkProps:d,logoImageUrl:Object(a.a)(h),logoAlt:l.alt}}},497:function(e,t,n){"use strict";var r=n(12),o=n(26),a=n(557),c="".endsWith;r(r.P+r.F*n(558)("endsWith"),"String",{endsWith:function(e){var t=a(this,e,"endsWith"),n=arguments.length>1?arguments[1]:void 0,r=o(t.length),i=void 0===n?r:Math.min(o(n),r),l=String(e);return c?c.call(t,l,i):t.slice(i-l.length,i)===l}})},498:function(e,t,n){"use strict";var r=n(0),o=n.n(r),a=n(476),c=n(145),i=n.n(c);t.a=function(){var e=Object(a.a)().siteConfig,t=(e=void 0===e?{}:e).themeConfig.announcementBar,n=void 0===t?{}:t,c=n.id,l=n.content,s=n.backgroundColor,u=n.textColor,d=Object(r.useState)(!0),h=d[0],f=d[1];return Object(r.useEffect)((function(){var e=localStorage.getItem("docusaurus.announcement.id"),t=c!==e;localStorage.setItem("docusaurus.announcement.id",c),t&&localStorage.setItem("docusaurus.announcement.dismiss",!1),(t||"false"===localStorage.getItem("docusaurus.announcement.dismiss"))&&f(!1)}),[]),!l||h?null:o.a.createElement("div",{className:i.a.announcementBar,style:{backgroundColor:s,color:u},role:"banner"},o.a.createElement("div",{className:i.a.announcementBarContent,dangerouslySetInnerHTML:{__html:l}}),o.a.createElement("button",{type:"button",className:i.a.announcementBarClose,onClick:function(){localStorage.setItem("docusaurus.announcement.dismiss",!0),f(!0)},"aria-label":"Close"},o.a.createElement("span",{"aria-hidden":"true"},"\xd7")))}},499:function(e,t,n){"use strict";var r=n(0);r.PureComponent},500:function(e,t,n){"use strict";n(58),n(29),n(22),n(21),n(79);var r=n(0),o=n.n(r),a=n(463),c=n.n(a),i=n(476),l=n(512);n(146);t.a=function(e){var t=Object(r.useState)(!1),a=t[0],s=t[1],u=Object(r.useRef)(null),d=Object(i.a)().siteConfig,h=(void 0===d?{}:d).themeConfig.algolia,f=Object(l.c)();var p=function(e){void 0===e&&(e=!0),a||Promise.all([n.e(309).then(n.t.bind(null,610,7)),n.e(209).then(n.t.bind(null,623,7))]).then((function(t){var n=t[0].default;s(!0),window.docsearch=n,function(e){window.docsearch({appId:h.appId,apiKey:h.apiKey,indexName:h.indexName,inputSelector:"#search_input_react",algoliaOptions:h.algoliaOptions,handleSelected:function(e,t,n){var r=document.createElement("a");r.href=n.url;var o="#__docusaurus"===r.hash?""+r.pathname:""+r.pathname+r.hash;f.push(o)}}),e&&u.current.focus()}(e)}))},g=Object(r.useCallback)((function(){p(),a&&u.current.focus(),e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]),v=Object(r.useCallback)((function(){e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]),b=Object(r.useCallback)((function(e){var t="mouseover"!==e.type;p(t)}));return o.a.createElement("div",{className:"navbar__search",key:"search-box"},o.a.createElement("span",{"aria-label":"expand searchbar",role:"button",className:c()("search-icon",{"search-icon-hidden":e.isSearchBarExpanded}),onClick:g,onKeyDown:g,tabIndex:0}),o.a.createElement("input",{id:"search_input_react",type:"search",placeholder:"Search","aria-label":"Search",className:c()("navbar__search-input",{"search-bar-expanded":e.isSearchBarExpanded},{"search-bar":!e.isSearchBarExpanded}),onMouseOver:b,onFocus:b,onBlur:v,ref:u}))}},501:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;tthis.startX&&(this.setState({checked:!0}),this.startX=t,this.activated=tn?this.previouslyChecked!==this.state.checked&&(this.setState({checked:!1}),this.previouslyChecked=this.state.checked,t.click()):this.startX-4=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(t,["className","icons"])),a=(0,i.default)("react-toggle",{"react-toggle--checked":this.state.checked,"react-toggle--focus":this.state.hasFocus,"react-toggle--disabled":this.props.disabled},n);return c.default.createElement("div",{className:a,onClick:this.handleClick,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEnd},c.default.createElement("div",{className:"react-toggle-track"},c.default.createElement("div",{className:"react-toggle-track-check"},this.getIcon("checked")),c.default.createElement("div",{className:"react-toggle-track-x"},this.getIcon("unchecked"))),c.default.createElement("div",{className:"react-toggle-thumb"}),c.default.createElement("input",r({},o,{ref:function(t){e.input=t},onFocus:this.handleFocus,onBlur:this.handleBlur,className:"react-toggle-screenreader-only",type:"checkbox"})))}}]),t}(a.PureComponent);t.default=f,f.displayName="Toggle",f.defaultProps={icons:{checked:c.default.createElement(s.default,null),unchecked:c.default.createElement(u.default,null)}},f.propTypes={checked:l.default.bool,disabled:l.default.bool,defaultChecked:l.default.bool,onChange:l.default.func,onFocus:l.default.func,onBlur:l.default.func,className:l.default.string,name:l.default.string,value:l.default.string,id:l.default.string,"aria-labelledby":l.default.string,"aria-label":l.default.string,icons:l.default.oneOfType([l.default.bool,l.default.shape({checked:l.default.node,unchecked:l.default.node})])}},502:function(e,t,n){"use strict";var r=n(0),o=n.n(r),a=(n(84),n(513),function(){var e=Object(r.useState)({}),t=e[0],n=e[1],o=Object(r.useCallback)((function(e,t){try{localStorage.setItem("docusaurus.tab."+e,t)}catch(n){console.error(n)}}),[]);return Object(r.useEffect)((function(){try{for(var e={},t=0;t=d?c(!1):e+n'},heart:{width:12,height:16,path:''},eye:{width:16,height:16,path:''},star:{width:14,height:16,path:''},"repo-forked":{width:10,height:16,path:''},"repo-template":{width:14,height:16,path:''},"issue-opened":{width:14,height:16,path:''},"cloud-download":{width:16,height:16,path:''}},m={},k=function(e,t){var n=m[e]||(m[e]=[]);if(!(n.push(t)>1)){var r=function(e){var t;return function(){t||(t=1,e.apply(this,arguments))}}((function(){for(delete m[e];t=n.shift();)t.apply(null,arguments)}));if(u){var o=new c;h(o,"abort",r),h(o,"error",r),h(o,"load",(function(){var e;try{e=JSON.parse(o.responseText)}catch(t){return void r(t)}r(200!==o.status,e)})),o.open("GET",e),o.send()}else{var a=this||window;a._=function(e){a._=null,r(200!==e.meta.status,e.data)};var l=i(a.document)("script",{async:!0,src:e+(/\?/.test(e)?"&":"?")+"callback=_"}),s=function(){a._&&a._({meta:{}})};h(l,"load",s),h(l,"error",s),l.readyState&&function(e,t,n){var r=function(o){if(t.test(e.readyState))return f(e,"readystatechange",r),n(o)};h(e,"readystatechange",r)}(l,/de|m/,s),a.document.getElementsByTagName("head")[0].appendChild(l)}}},w=function(e,t,n){var r=i(e.ownerDocument),o=e.appendChild(r("style",{type:"text/css"})),a="body{margin:0}a{text-decoration:none;outline:0}.widget{display:inline-block;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:0;white-space:nowrap}.btn,.social-count{position:relative;display:inline-block;height:14px;padding:2px 5px;font-size:11px;font-weight:600;line-height:14px;vertical-align:bottom;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-repeat:repeat-x;background-position:-1px -1px;background-size:110% 110%;border:1px solid}.btn{border-radius:.25em}.btn:not(:last-child){border-radius:.25em 0 0 .25em}.social-count{border-left:0;border-radius:0 .25em .25em 0}.widget-lg .btn,.widget-lg .social-count{height:20px;padding:3px 10px;font-size:12px;line-height:20px}.octicon{display:inline-block;vertical-align:text-top;fill:currentColor}"+v(t["data-color-scheme"]);o.styleSheet?o.styleSheet.cssText=a:o.appendChild(e.ownerDocument.createTextNode(a));var c,l,u=r("a",{className:"btn",href:t.href,target:"_blank",rel:"noopener",innerHTML:(c=t["data-icon"],l=/^large$/i.test(t["data-size"])?16:14,c=(""+c).toLowerCase().replace(/^octicon-/,""),s(b,c)||(c="mark-github"),'"),"aria-label":t["aria-label"]||void 0},[" ",r("span",{},[t["data-text"]||""])]),d=e.appendChild(r("div",{className:"widget"+(/^large$/i.test(t["data-size"])?" widget-lg":"")},[u])),h=u.hostname.split(".").reverse();if(""===h[0]&&h.shift(),"com"!==h[0]||"github"!==h[1])return u.href="#",u.target="_self",void n(d);var f=h.length,p=(" /"+u.pathname).split(/\/+/);if(((2===f||3===f&&"gist"===h[2])&&"archive"===p[3]||2===f&&"releases"===p[3]&&"download"===p[4]||3===f&&"codeload"===h[2])&&(u.target="_top"),/^true$/i.test(t["data-show-count"])&&2===f){var g,m;if(!p[2]&&p[1])g=m="followers";else if(!p[3]&&p[2])m="stargazers_count",g="stargazers";else if(p[4]||"subscription"!==p[3])if(p[4]||"fork"!==p[3]){if("issues"!==p[3])return void n(d);m="open_issues_count",g="issues"}else m="forks_count",g="network/members";else m="subscribers_count",g="watchers";var w=p[2]?"/repos/"+p[1]+"/"+p[2]:"/users/"+p[1];k.call(this,"https://api.github.com"+w,(function(e,t){if(!e){var o=t[m];d.appendChild(r("a",{className:"social-count",href:t.html_url+"/"+g,target:"_blank",rel:"noopener","aria-label":o+" "+m.replace(/_count$/,"").replace("_"," ").slice(0,o<2?-1:void 0)+" on GitHub"},[(""+o).replace(/\B(?=(\d{3})+(?!\d))/g,",")]))}n(d)}))}else n(d)},y=window.devicePixelRatio||1,C=function(e){return(y>1?o.ceil(o.round(e*y)/y*2)/2:o.ceil(e))||0},x=function(e,t){e.style.width=t[0]+"px",e.style.height=t[1]+"px"},E=function(e,t){if(null!=e&&null!=t)if(e.getAttribute&&(e=function(e){for(var t={href:e.href,title:e.title,"aria-label":e.getAttribute("aria-label")},n=["icon","color-scheme","text","size","show-count"],r=0,o=n.length;r0){var n=t[0];return{x:n.clientX,y:n.clientY}}var r=e.pageX;if(void 0!==r)return{x:r,y:e.pageY}}return{x:0,y:0}}}}]); \ No newline at end of file diff --git a/4.b2810696.js.LICENSE.txt b/4.73945e41.js.LICENSE.txt similarity index 100% rename from 4.b2810696.js.LICENSE.txt rename to 4.73945e41.js.LICENSE.txt diff --git a/404.html b/404.html index 363a22ea0e..eb7cf63c34 100644 --- a/404.html +++ b/404.html @@ -26,9 +26,9 @@ - + - + @@ -39,9 +39,9 @@ - + - + diff --git a/410a9ba0.7adc8daf.js b/410a9ba0.115baef2.js similarity index 99% rename from 410a9ba0.7adc8daf.js rename to 410a9ba0.115baef2.js index 275d3c7d34..4a99471d5c 100644 --- a/410a9ba0.7adc8daf.js +++ b/410a9ba0.115baef2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[83],{235:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return s})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return d}));var a=n(1),o=n(9),r=(n(0),n(465)),i=n(464),l=(n(477),n(469)),c={last_modified_on:"2022-07-25",$schema:"/.meta/.schemas/guides.json",title:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},s={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws",readingTime:"4 min read",source:"@site/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create your Staging environment from your Production environment on AWS",truncated:!1,prevItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"},nextItem:{title:"Creating API clients using OpenAPI Tools",permalink:"/guides/tutorial/generate-qovery-api-client"}},u=[{value:"Create a Staging cluster",id:"create-a-staging-cluster",children:[]},{value:"Create your Staging environment from your Production environment",id:"create-your-staging-environment-from-your-production-environment",children:[]},{value:"Update your Staging applications",id:"update-your-staging-applications",children:[]},{value:"Override your environment variables and secrets",id:"override-your-environment-variables-and-secrets",children:[]},{value:"Deploy your Staging environment",id:"deploy-your-staging-environment",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:u};function d(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Let's say you have your production environment deployed, and you want to create a staging environment. You have two options:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Create a staging environment from scratch."),Object(r.b)("li",{parentName:"ol"},"Clone your production environment and create a staging environment from it.")),Object(r.b)("p",null,"This is where the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature of Qovery is useful. No need to create a new environment, just clone your production environment and create a staging environment from it."),Object(r.b)("p",null,"In this guide, we will go through the steps to create a staging environment from your production environment. While applying the best practices by isolating the staging and production environments on two separated clusters and VPCs."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/staging-from-production/complete_schema.jpg",alt:"Complete Production and Staging infrastructure"})),Object(r.b)(l.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/5a76704a196341deb5384b2883113adf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-a-staging-cluster"},"Create a Staging cluster"),Object(r.b)("p",null,"Isolating the staging and production environments on two separate clusters and VPCs is a good practice to avoid any potential issues on your production caused by your staging. This is not a mandatory step, but it is well recommended."),Object(r.b)("p",null,"To create your staging cluster it's also recommended creating a new AWS IAM access key and secret access key in a dedicated subaccount. Then you are sure that both environment are also isolated at the AWS level:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your Organization cluster settings"),Object(r.b)("li",{parentName:"ol"},'Add a cluster with a name "staging"'),Object(r.b)("li",{parentName:"ol"},"Deploy your staging cluster")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/6f77172ae27f41a5a7c0e3114398b13c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-your-staging-environment-from-your-production-environment"},"Create your Staging environment from your Production environment"),Object(r.b)("p",null,"Now, to create your staging environment from your production environment, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Go inside your production environment and click on the "Clone" button.'),Object(r.b)("li",{parentName:"ol"},'Give a name to your staging environment (E.g "staging")'),Object(r.b)("li",{parentName:"ol"},'Set the mode to "Staging"'),Object(r.b)("li",{parentName:"ol"},'Set the cluster to "staging"'),Object(r.b)("li",{parentName:"ol"},'Click on "Create"'),Object(r.b)("li",{parentName:"ol"},"That's it!")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Cloning your database does not copy the data (yet). To copy your data in Staging consider using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.replibyte.com"}),"Replibyte")," in standalone. It will be integrated in Qovery soon.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/614844644cc34211853de19dafe79343",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Your environment has been created, but it's not deployed yet. Before we will make some adjustment to change the branch of our applications."),Object(r.b)("h2",{id:"update-your-staging-applications"},"Update your Staging applications"),Object(r.b)("p",null,"Your Staging applications have the same branch as your Production applications. To update your Staging applications branch, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go into the settings of each of your applications."),Object(r.b)("li",{parentName:"ol"},"Update the branch to your Staging branch."),Object(r.b)("li",{parentName:"ol"},'Click on "Save"')),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/2f4f2a22062a4840ae077285a891e573",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"We are almost done, now we need to smartly change our environment variables and secrets to not use the one used in production."),Object(r.b)("h2",{id:"override-your-environment-variables-and-secrets"},"Override your environment variables and secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Qovery makes the distinction between ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Environment Variables")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Secrets")," even if for your app both will be used as Environment Variables. Check out ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"this documentation")," to learn more about Environment Variables and Secrets.")),Object(r.b)("p",null,"Let's say you have a production environment with the following environment variables:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"NODE_ENV=production"),Object(r.b)("li",{parentName:"ul"},"STRIPE_API_KEY=a-secret-production-key")),Object(r.b)("p",null,"You might need to keep the same keys but change the values. That's exactly what Qovery makes you do with the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#override-environment-variable"}),"Environment Variable Override feature"),". You can keep the same keys but change the values."),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/3d5d37dd9a954500aa559afead5b3981",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"deploy-your-staging-environment"},"Deploy your Staging environment"),Object(r.b)("p",null,'Finally, your Staging environment has been created and set up correctly. To deploy your Staging environment, you just need to go to your Staging environment and click on the "Deploy" button.'),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/04709bb4039447c699477ce01a1aa19b",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),o=n.n(a),r=n(463),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||c))}),t)}},468:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),o=n.n(a),r=n(464);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),o=(n(481),n(478),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(483),l=n(463),c=n.n(l),s=n(471),u=n.n(s),b=n(482),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",o,{"tabs--block":t}),style:l},s.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return i(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,c=l;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,c=e.placeholder,s=e.select,v=e.size,h=(e.style,e.values),y=e.urlKey,f=Object(b.a)(),w=f.tabGroupChoices,O=f.setTabGroupChoices,j=Object(o.useState)(n),k=j[0],S=j[1];if(null!=i){var N=w[i];null!=N&&N!==k&&S(N)}var C=function(e){S(e),null!=i&&O(i,e)},E=[],T=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&y){var e=u.a.parse(window.location.search);e[y]&&S(e[y])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(v||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),h.length>1&&(s?r.a.createElement(g,Object(a.a)({changeSelectedValue:C,handleKeydown:T,placeholder:c,selectedValue:k,size:v,tabRefs:E},e)):r.a.createElement(p,Object(a.a)({changeSelectedValue:C,handleKeydown:T,selectedValue:k,tabRefs:E},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[83],{235:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return s})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return d}));var a=n(1),o=n(9),r=(n(0),n(465)),i=n(464),l=(n(477),n(469)),c={last_modified_on:"2022-07-25",$schema:"/.meta/.schemas/guides.json",title:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},s={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws",readingTime:"4 min read",source:"@site/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create your Staging environment from your Production environment on AWS",truncated:!1,prevItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"},nextItem:{title:"Creating API clients using OpenAPI Tools",permalink:"/guides/tutorial/generate-qovery-api-client"}},u=[{value:"Create a Staging cluster",id:"create-a-staging-cluster",children:[]},{value:"Create your Staging environment from your Production environment",id:"create-your-staging-environment-from-your-production-environment",children:[]},{value:"Update your Staging applications",id:"update-your-staging-applications",children:[]},{value:"Override your environment variables and secrets",id:"override-your-environment-variables-and-secrets",children:[]},{value:"Deploy your Staging environment",id:"deploy-your-staging-environment",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:u};function d(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Let's say you have your production environment deployed, and you want to create a staging environment. You have two options:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Create a staging environment from scratch."),Object(r.b)("li",{parentName:"ol"},"Clone your production environment and create a staging environment from it.")),Object(r.b)("p",null,"This is where the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature of Qovery is useful. No need to create a new environment, just clone your production environment and create a staging environment from it."),Object(r.b)("p",null,"In this guide, we will go through the steps to create a staging environment from your production environment. While applying the best practices by isolating the staging and production environments on two separated clusters and VPCs."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/staging-from-production/complete_schema.jpg",alt:"Complete Production and Staging infrastructure"})),Object(r.b)(l.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/5a76704a196341deb5384b2883113adf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-a-staging-cluster"},"Create a Staging cluster"),Object(r.b)("p",null,"Isolating the staging and production environments on two separate clusters and VPCs is a good practice to avoid any potential issues on your production caused by your staging. This is not a mandatory step, but it is well recommended."),Object(r.b)("p",null,"To create your staging cluster it's also recommended creating a new AWS IAM access key and secret access key in a dedicated subaccount. Then you are sure that both environment are also isolated at the AWS level:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your Organization cluster settings"),Object(r.b)("li",{parentName:"ol"},'Add a cluster with a name "staging"'),Object(r.b)("li",{parentName:"ol"},"Deploy your staging cluster")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/6f77172ae27f41a5a7c0e3114398b13c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-your-staging-environment-from-your-production-environment"},"Create your Staging environment from your Production environment"),Object(r.b)("p",null,"Now, to create your staging environment from your production environment, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Go inside your production environment and click on the "Clone" button.'),Object(r.b)("li",{parentName:"ol"},'Give a name to your staging environment (E.g "staging")'),Object(r.b)("li",{parentName:"ol"},'Set the mode to "Staging"'),Object(r.b)("li",{parentName:"ol"},'Set the cluster to "staging"'),Object(r.b)("li",{parentName:"ol"},'Click on "Create"'),Object(r.b)("li",{parentName:"ol"},"That's it!")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Cloning your database does not copy the data (yet). To copy your data in Staging consider using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.replibyte.com"}),"Replibyte")," in standalone. It will be integrated in Qovery soon.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/614844644cc34211853de19dafe79343",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Your environment has been created, but it's not deployed yet. Before we will make some adjustment to change the branch of our applications."),Object(r.b)("h2",{id:"update-your-staging-applications"},"Update your Staging applications"),Object(r.b)("p",null,"Your Staging applications have the same branch as your Production applications. To update your Staging applications branch, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go into the settings of each of your applications."),Object(r.b)("li",{parentName:"ol"},"Update the branch to your Staging branch."),Object(r.b)("li",{parentName:"ol"},'Click on "Save"')),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/2f4f2a22062a4840ae077285a891e573",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"We are almost done, now we need to smartly change our environment variables and secrets to not use the one used in production."),Object(r.b)("h2",{id:"override-your-environment-variables-and-secrets"},"Override your environment variables and secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Qovery makes the distinction between ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Environment Variables")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Secrets")," even if for your app both will be used as Environment Variables. Check out ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"this documentation")," to learn more about Environment Variables and Secrets.")),Object(r.b)("p",null,"Let's say you have a production environment with the following environment variables:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"NODE_ENV=production"),Object(r.b)("li",{parentName:"ul"},"STRIPE_API_KEY=a-secret-production-key")),Object(r.b)("p",null,"You might need to keep the same keys but change the values. That's exactly what Qovery makes you do with the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#override-environment-variable"}),"Environment Variable Override feature"),". You can keep the same keys but change the values."),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/3d5d37dd9a954500aa559afead5b3981",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"deploy-your-staging-environment"},"Deploy your Staging environment"),Object(r.b)("p",null,'Finally, your Staging environment has been created and set up correctly. To deploy your Staging environment, you just need to go to your Staging environment and click on the "Deploy" button.'),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/04709bb4039447c699477ce01a1aa19b",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),o=n.n(a),r=n(463),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||c))}),t)}},468:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),o=n.n(a),r=n(464);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),o=(n(480),n(479),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(483),l=n(463),c=n.n(l),s=n(471),u=n.n(s),b=n(482),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",o,{"tabs--block":t}),style:l},s.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return i(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,c=l;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,c=e.placeholder,s=e.select,v=e.size,h=(e.style,e.values),y=e.urlKey,f=Object(b.a)(),w=f.tabGroupChoices,O=f.setTabGroupChoices,j=Object(o.useState)(n),k=j[0],S=j[1];if(null!=i){var N=w[i];null!=N&&N!==k&&S(N)}var C=function(e){S(e),null!=i&&O(i,e)},E=[],T=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&y){var e=u.a.parse(window.location.search);e[y]&&S(e[y])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(v||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),h.length>1&&(s?r.a.createElement(g,Object(a.a)({changeSelectedValue:C,handleKeydown:T,placeholder:c,selectedValue:k,size:v,tabRefs:E},e)):r.a.createElement(p,Object(a.a)({changeSelectedValue:C,handleKeydown:T,selectedValue:k,tabRefs:E},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}}}]); \ No newline at end of file diff --git a/54ca7d36.d089aefa.js b/54ca7d36.3f058138.js similarity index 99% rename from 54ca7d36.d089aefa.js rename to 54ca7d36.3f058138.js index c804c38b4d..32b8cd8d48 100644 --- a/54ca7d36.d089aefa.js +++ b/54ca7d36.3f058138.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[108],{260:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return u})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return d})),n.d(t,"default",(function(){return m}));var a=n(1),r=n(9),c=(n(0),n(465)),o=n(477),l=n(479),i=n(472),s=(n(473),n(464)),u=(n(469),{last_modified_on:"2024-11-27",title:"GCP GKE",description:"Learn how to configure your GCP Kubernetes clusters on Qovery"}),b={id:"using-qovery/configuration/clusters/gcp",title:"GCP GKE",description:"Learn how to configure your GCP Kubernetes clusters on Qovery",source:"@site/docs/using-qovery/configuration/clusters/gcp.md",permalink:"/docs/using-qovery/configuration/clusters/gcp",sidebar:"docs",previous:{title:"AWS EKS with Karpenter",permalink:"/docs/using-qovery/configuration/clusters/aws-with-karpenter"},next:{title:"Scaleway kapsule",permalink:"/docs/using-qovery/configuration/clusters/scaleway"}},d=[{value:"Creating a GCP GKE Cluster",id:"creating-a-gcp-gke-cluster",children:[]},{value:"Managing your Cluster Settings",id:"managing-your-cluster-settings",children:[]}],p={rightToc:d};function m(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(c.b)("wrapper",Object(a.a)({},p,n,{components:t,mdxType:"MDXLayout"}),Object(c.b)("h3",{id:"creating-a-gcp-gke-cluster"},"Creating a GCP GKE Cluster"),Object(c.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(c.b)("ol",null,Object(c.b)("li",null,Object(c.b)("p",null,"Click on ",Object(c.b)("inlineCode",{parentName:"p"},"GCP")," as hosting mode and then ",Object(c.b)("inlineCode",{parentName:"p"},"Qovery Managed")," option:"),Object(c.b)("p",{align:"center"},Object(c.b)("img",{src:"/img/configuration/clusters/cluster_hosting_selection_gcp.png",alt:"Cluster GCP"})),Object(c.b)("p",null,"In the ",Object(c.b)("inlineCode",{parentName:"p"},"Create Cluster")," window enter:"),Object(c.b)("ul",null,Object(c.b)("li",{parentName:"ul"},Object(c.b)("inlineCode",{parentName:"li"},"Cluster name"),": enter the name of your choice for your cluster."),Object(c.b)("li",{parentName:"ul"},Object(c.b)("inlineCode",{parentName:"li"},"Description"),": enter a description to identify better your cluster."),Object(c.b)("li",{parentName:"ul"},Object(c.b)("inlineCode",{parentName:"li"},"Production cluster"),": select this option if your cluster will be used for production."),Object(c.b)("li",{parentName:"ul"},Object(c.b)("inlineCode",{parentName:"li"},"Region"),": select the geographical area in which you want your cluster to be hosted."),Object(c.b)("li",{parentName:"ul"},Object(c.b)("inlineCode",{parentName:"li"},"Credentials"),": select one of the existing cloud provider credentials or add a new one by clicking on ",Object(c.b)("inlineCode",{parentName:"li"},"New Credentials"),". In the New credentials window, add the credentials that you have generated on your cloud provider console (",Object(c.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/#attach-gcp-credentials"}),"Procedure for GCP account"),"). Added credentials can be used later to create and manage additional cluster.")),Object(c.b)("p",null,"To confirm, click ",Object(c.b)("inlineCode",{parentName:"p"},"Next"),".")),Object(c.b)("li",null,Object(c.b)("p",null,"In the ",Object(c.b)("inlineCode",{parentName:"p"},"Features")," step, select the features you want to enable on your cluster."),Object(c.b)("p",null,"If you want to manage the network layer of your cluster by yourself, you can switch VPC mode to ",Object(c.b)("inlineCode",{parentName:"p"},"Deploy on my existing VPC")," to use your own VPC instead of the one provided by Qovery."),Object(c.b)(s.a,{type:"warning",mdxType:"Alert"},Object(c.b)("p",null,"These options can only be configured during cluster creation and cannot be modified later.")),Object(c.b)(o.a,{centered:!0,className:"rounded",defaultValue:"vpc managed by qovery",placeholder:"Select a VPC mode",select:!1,size:null,values:[{group:"Features",label:"VPC managed by Qovery",value:"vpc managed by qovery"},{group:"Features",label:"Use your existing VPC",value:"use existing vpc"}],mdxType:"Tabs"},Object(c.b)(l.a,{value:"vpc managed by qovery",mdxType:"TabItem"},Object(c.b)("h4",{id:"static-ip"},"Static IP"),Object(c.b)("p",null,"The ",Object(c.b)("strong",{parentName:"p"},"Static IP")," feature is currently only available to clusters deployed with a VPC managed by Qovery and can only be enabled at cluster creation."),Object(c.b)("p",null,"By default, when your cluster is created, its worker nodes are allocated public IP addresses, which are used for external communication. For improved security and control, the ",Object(c.b)("strong",{parentName:"p"},"Static IP")," feature allows you to ensure that outbound traffic from your cluster uses specific IP addresses."),Object(c.b)("p",null,"Here is what will be deployed on your cluster:"),Object(c.b)("ul",null,Object(c.b)("li",{parentName:"ul"},"Cloud Nats"),Object(c.b)("li",{parentName:"ul"},"Static IPs"),Object(c.b)("li",{parentName:"ul"},"Routers")),Object(c.b)("p",null,"Once set up, here is the procedure to find your static IP addresses on ",Object(c.b)("inlineCode",{parentName:"p"},"GCP"),":"),Object(c.b)("ul",null,Object(c.b)("li",{parentName:"ul"},"On your GCP account, select the IP addresses service."),Object(c.b)("li",{parentName:"ul"},"In the list you will find your static IP used by your cluster router.")),Object(c.b)(s.a,{type:"info",mdxType:"Alert"},Object(c.b)("p",null,"If you work in a sensitive business area such as financial technology, enabling the ",Object(c.b)("strong",{parentName:"p"},"Static IP")," feature can help fulfil the security requirements of some of the external services you use, therefore making it easier for you to get whitelisted by them."))),Object(c.b)(l.a,{value:"use existing vpc",mdxType:"TabItem"},Object(c.b)("h5",{id:"use-existing-vpc"},"Use existing VPC"),Object(c.b)("p",null,"You can opt to use your own VPC instead of the one provided by Qovery by switching VPC mode to ",Object(c.b)("inlineCode",{parentName:"p"},"Deploy on my existing VPC"),"."),Object(c.b)("p",null,"In GCP you have two VPC modes: ",Object(c.b)("inlineCode",{parentName:"p"},"Automatic")," or ",Object(c.b)("inlineCode",{parentName:"p"},"Custom"),"."),Object(c.b)("p",null,"If you are using an automatic or a custom VPC, you have to set:"),Object(c.b)("ul",null,Object(c.b)("li",{parentName:"ul"},"Your VPC Name"),Object(c.b)("li",{parentName:"ul"},"External project id (optional): by default, the project id used is the one specified in the credentials file. But if your VPC is defined in another GCP project, you have to specify the Project id.")),Object(c.b)("p",null,"In addition if you are using a custom VPC, you have to set:"),Object(c.b)("ul",null,Object(c.b)("li",{parentName:"ul"},"Your Subnet range name (",Object(c.b)("inlineCode",{parentName:"li"},"https://console.cloud.google.com/networking/networks/details/?project=&pageTab=SUBNETS"),")")),Object(c.b)(s.a,{type:"info",mdxType:"Alert"},Object(c.b)("p",null,"You can also specify (optional):"),Object(c.b)("ul",null,Object(c.b)("li",{parentName:"ul"},"Pod ipv4 address range name"),Object(c.b)("li",{parentName:"ul"},"Additional cluster pod ipv4 ranges names (separated with a comma)"),Object(c.b)("li",{parentName:"ul"},"Ipv4 service range name")),Object(c.b)("p",null,"For these ranges, you have to create Secondary IPv4 ranges inside your subnet."))))),Object(c.b)("li",null,Object(c.b)("p",null,"In the ",Object(c.b)("inlineCode",{parentName:"p"},"Ready to install your cluster")," window, check that the services needed to install your cluster are correct."),Object(c.b)("p",null,"You can now press the ",Object(c.b)("inlineCode",{parentName:"p"},"Create and Install")," button."),Object(c.b)("p",null,"Your cluster is now displayed in your organization settings, featuring the ",Object(c.b)("inlineCode",{parentName:"p"},"Installing...")," status (orange status). Once your cluster is properly installed, its status turns to green and you will be able to deploy your applications on it."),Object(c.b)("p",null,"You can follow the execution of the action via the cluster status and/or by accessing the ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#logs"}),"Cluster Logs"))))),Object(c.b)("h3",{id:"managing-your-cluster-settings"},"Managing your Cluster Settings"),Object(c.b)("p",null,"To manage the settings of an existing cluster:"),Object(c.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(c.b)("ol",null,Object(c.b)("li",null,Object(c.b)("p",null,"Open your ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery Console"),".")),Object(c.b)("li",null,Object(c.b)("p",null,"On the left menu bar, click on the Cluster page.")),Object(c.b)("li",null,Object(c.b)("p",null,"To access your cluster settings, click on the wheel button:"),Object(c.b)("p",{align:"center"},Object(c.b)("img",{src:"/img/configuration/clusters/cluster_settings.png",alt:"Display Cluster Settings"}))))),Object(c.b)("p",null,"Below you can find a description of each section"),Object(c.b)("h4",{id:"general"},"General"),Object(c.b)("p",null,"The ",Object(c.b)("inlineCode",{parentName:"p"},"General")," tab allows you to define high-level information on your cluster:"),Object(c.b)("table",null,Object(c.b)("thead",{parentName:"table"},Object(c.b)("tr",{parentName:"thead"},Object(c.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Item"),Object(c.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Description"))),Object(c.b)("tbody",{parentName:"table"},Object(c.b)("tr",{parentName:"tbody"},Object(c.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Cluster Name"),Object(c.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To edit the name of your cluster.")),Object(c.b)("tr",{parentName:"tbody"},Object(c.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Description"),Object(c.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To enter or edit the description of your cluster.")),Object(c.b)("tr",{parentName:"tbody"},Object(c.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Production Cluster"),Object(c.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To enter or edit the production flag of your cluster.")))),Object(c.b)("h4",{id:"credentials"},"Credentials"),Object(c.b)("p",null,"Here you can manage here the cloud provider credentials associated with your cluster."),Object(c.b)("p",null,"If you need to change the credentials:"),Object(c.b)("ul",null,Object(c.b)("li",{parentName:"ul"},"generate a new set of credentials on your cloud provider(",Object(c.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/#attach-gcp-credentials"}),"Procedure for GCP account"),")"),Object(c.b)("li",{parentName:"ul"},'create the new credential on the Qovery by opening the drop-down and selecting "New Credentials"')),Object(c.b)("p",null,"Once created and associated, you need to ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#updating-a-cluster"}),"updating your cluster")," to apply the change."),Object(c.b)("h4",{id:"image-registry"},"Image registry"),Object(c.b)("p",null,"In this tab, you will see that a container registry already exist (called ",Object(c.b)("inlineCode",{parentName:"p"},"registry-{$UIID}"),").\nThis is your cloud provider container registry used by Qovery to manage the deployment of your applications by mirroring the docker images."),Object(c.b)("p",null,"The credentials configured on this registry are the one used to create the cluster. But you can still update them if you prefer to manage them separately (dedicated pair of creds just to access the registry)."),Object(c.b)("p",null,"Check ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/image-mirroring/"}),"this link")," for more information."),Object(c.b)("h4",{id:"features"},"Features"),Object(c.b)("p",null,"The ",Object(c.b)("inlineCode",{parentName:"p"},"Features")," tab in your cluster settings allows you to check if the ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"#static-ip"}),Object(c.b)("strong",{parentName:"a"},"Static IP")),", ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"#use-existing-vpc"}),Object(c.b)("strong",{parentName:"a"},"Deploy on existing VPC"))," features are enabled on your cluster. The enabled features cannot be changed after the creation of the cluster."))}m.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),c=n(463),o=n.n(c);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,c=e.icon,l=e.type,i=null;switch(l){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return r.a.createElement("div",{className:o()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==c}),role:"alert"},!1!==c&&r.a.createElement("i",{className:o()("feather","icon-"+(c||i))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,c=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(c)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),c=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(c.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},470:function(e,t,n){"use strict";var a=n(1),r=n(0),c=n.n(r),o=n(39),l=n(474),i=n(20),s=n.n(i);t.a=function(e){var t,n=e.to,i=e.href,u=n||i,b=Object(l.a)(u),d=Object(r.useRef)(!1),p=s.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!p&&b&&window.docusaurus.prefetch(u),function(){p&&t&&t.disconnect()}}),[u,p,b]),u&&b?c.a.createElement(o.b,Object(a.a)({},e,{onMouseEnter:function(){d.current||(window.docusaurus.preload(u),d.current=!0)},innerRef:function(e){var n,a;p&&e&&b&&(n=e,a=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:u})):c.a.createElement("a",Object(a.a)({},e,{href:u}))}},472:function(e,t,n){"use strict";var a=n(0),r=n.n(a),c=(n(463),n(471)),o=n.n(c);n(133);t.a=function(e){var t=e.children,n=e.headingDepth,c=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,i={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},s="https://github.com/qovery/documentation/issues/new?"+o.a.stringify(i),u=Object(a.useState)(null),b=u[0],d=u[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!c&&!b&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return d("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:s,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==b&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,n){"use strict";var a=n(0),r=n.n(a),c=n(470),o=n(463),l=n.n(o);n(134);t.a=function(e){var t=e.children,n=e.className,a=e.badge,o=e.leftIcon,i=e.rightIcon,s=e.size,u=e.target,b=e.to,d=l()("jump-to","jump-to--"+s,n),p=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},o&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+o})),r.a.createElement("div",{className:"jump-to--main"},a?r.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(i||"chevron-right")+" arrow"}))));return u?r.a.createElement("a",{href:b,target:u,className:d},p):r.a.createElement(c.a,{to:b,className:d},p)}},474:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},477:function(e,t,n){"use strict";var a=n(1),r=(n(481),n(478),n(52),n(29),n(22),n(21),n(0)),c=n.n(r),o=n(483),l=n(463),i=n.n(l),s=n(471),u=n.n(s),b=n(482),d=37,p=39;function m(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,o=e.handleKeydown,l=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return c.a.createElement("div",{className:n?"tabs--centered":null},c.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",r,{"tabs--block":t}),style:l},s.map((function(e){var t=e.value,n=e.label;return c.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:i()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return o(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,i=l;if(i[0].group){var s=_.groupBy(i,"group");i=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return c.a.createElement(o.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:i,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,o=e.groupId,l=e.label,i=e.placeholder,s=e.select,h=e.size,y=(e.style,e.values),f=e.urlKey,j=Object(b.a)(),O=j.tabGroupChoices,v=j.setTabGroupChoices,N=Object(r.useState)(n),w=N[0],C=N[1];if(null!=o){var P=O[o];null!=P&&P!==w&&C(P)}var k=function(e){C(e),null!=o&&v(o,e)},E=[],I=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=u.a.parse(window.location.search);e[f]&&C(e[f])}}),[]),c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"margin-bottom--"+(h||"md")},l&&c.a.createElement("div",{className:"margin-vert--sm"},l),y.length>1&&(s?c.a.createElement(g,Object(a.a)({changeSelectedValue:k,handleKeydown:I,placeholder:i,selectedValue:w,size:h,tabRefs:E},e)):c.a.createElement(m,Object(a.a)({changeSelectedValue:k,handleKeydown:I,selectedValue:w,tabRefs:E},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===w}))[0])}},479:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[108],{260:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return u})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return d})),n.d(t,"default",(function(){return m}));var a=n(1),r=n(9),c=(n(0),n(465)),o=n(477),l=n(478),i=n(472),s=(n(473),n(464)),u=(n(469),{last_modified_on:"2024-11-27",title:"GCP GKE",description:"Learn how to configure your GCP Kubernetes clusters on Qovery"}),b={id:"using-qovery/configuration/clusters/gcp",title:"GCP GKE",description:"Learn how to configure your GCP Kubernetes clusters on Qovery",source:"@site/docs/using-qovery/configuration/clusters/gcp.md",permalink:"/docs/using-qovery/configuration/clusters/gcp",sidebar:"docs",previous:{title:"AWS EKS with Karpenter",permalink:"/docs/using-qovery/configuration/clusters/aws-with-karpenter"},next:{title:"Scaleway kapsule",permalink:"/docs/using-qovery/configuration/clusters/scaleway"}},d=[{value:"Creating a GCP GKE Cluster",id:"creating-a-gcp-gke-cluster",children:[]},{value:"Managing your Cluster Settings",id:"managing-your-cluster-settings",children:[]}],p={rightToc:d};function m(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(c.b)("wrapper",Object(a.a)({},p,n,{components:t,mdxType:"MDXLayout"}),Object(c.b)("h3",{id:"creating-a-gcp-gke-cluster"},"Creating a GCP GKE Cluster"),Object(c.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(c.b)("ol",null,Object(c.b)("li",null,Object(c.b)("p",null,"Click on ",Object(c.b)("inlineCode",{parentName:"p"},"GCP")," as hosting mode and then ",Object(c.b)("inlineCode",{parentName:"p"},"Qovery Managed")," option:"),Object(c.b)("p",{align:"center"},Object(c.b)("img",{src:"/img/configuration/clusters/cluster_hosting_selection_gcp.png",alt:"Cluster GCP"})),Object(c.b)("p",null,"In the ",Object(c.b)("inlineCode",{parentName:"p"},"Create Cluster")," window enter:"),Object(c.b)("ul",null,Object(c.b)("li",{parentName:"ul"},Object(c.b)("inlineCode",{parentName:"li"},"Cluster name"),": enter the name of your choice for your cluster."),Object(c.b)("li",{parentName:"ul"},Object(c.b)("inlineCode",{parentName:"li"},"Description"),": enter a description to identify better your cluster."),Object(c.b)("li",{parentName:"ul"},Object(c.b)("inlineCode",{parentName:"li"},"Production cluster"),": select this option if your cluster will be used for production."),Object(c.b)("li",{parentName:"ul"},Object(c.b)("inlineCode",{parentName:"li"},"Region"),": select the geographical area in which you want your cluster to be hosted."),Object(c.b)("li",{parentName:"ul"},Object(c.b)("inlineCode",{parentName:"li"},"Credentials"),": select one of the existing cloud provider credentials or add a new one by clicking on ",Object(c.b)("inlineCode",{parentName:"li"},"New Credentials"),". In the New credentials window, add the credentials that you have generated on your cloud provider console (",Object(c.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/#attach-gcp-credentials"}),"Procedure for GCP account"),"). Added credentials can be used later to create and manage additional cluster.")),Object(c.b)("p",null,"To confirm, click ",Object(c.b)("inlineCode",{parentName:"p"},"Next"),".")),Object(c.b)("li",null,Object(c.b)("p",null,"In the ",Object(c.b)("inlineCode",{parentName:"p"},"Features")," step, select the features you want to enable on your cluster."),Object(c.b)("p",null,"If you want to manage the network layer of your cluster by yourself, you can switch VPC mode to ",Object(c.b)("inlineCode",{parentName:"p"},"Deploy on my existing VPC")," to use your own VPC instead of the one provided by Qovery."),Object(c.b)(s.a,{type:"warning",mdxType:"Alert"},Object(c.b)("p",null,"These options can only be configured during cluster creation and cannot be modified later.")),Object(c.b)(o.a,{centered:!0,className:"rounded",defaultValue:"vpc managed by qovery",placeholder:"Select a VPC mode",select:!1,size:null,values:[{group:"Features",label:"VPC managed by Qovery",value:"vpc managed by qovery"},{group:"Features",label:"Use your existing VPC",value:"use existing vpc"}],mdxType:"Tabs"},Object(c.b)(l.a,{value:"vpc managed by qovery",mdxType:"TabItem"},Object(c.b)("h4",{id:"static-ip"},"Static IP"),Object(c.b)("p",null,"The ",Object(c.b)("strong",{parentName:"p"},"Static IP")," feature is currently only available to clusters deployed with a VPC managed by Qovery and can only be enabled at cluster creation."),Object(c.b)("p",null,"By default, when your cluster is created, its worker nodes are allocated public IP addresses, which are used for external communication. For improved security and control, the ",Object(c.b)("strong",{parentName:"p"},"Static IP")," feature allows you to ensure that outbound traffic from your cluster uses specific IP addresses."),Object(c.b)("p",null,"Here is what will be deployed on your cluster:"),Object(c.b)("ul",null,Object(c.b)("li",{parentName:"ul"},"Cloud Nats"),Object(c.b)("li",{parentName:"ul"},"Static IPs"),Object(c.b)("li",{parentName:"ul"},"Routers")),Object(c.b)("p",null,"Once set up, here is the procedure to find your static IP addresses on ",Object(c.b)("inlineCode",{parentName:"p"},"GCP"),":"),Object(c.b)("ul",null,Object(c.b)("li",{parentName:"ul"},"On your GCP account, select the IP addresses service."),Object(c.b)("li",{parentName:"ul"},"In the list you will find your static IP used by your cluster router.")),Object(c.b)(s.a,{type:"info",mdxType:"Alert"},Object(c.b)("p",null,"If you work in a sensitive business area such as financial technology, enabling the ",Object(c.b)("strong",{parentName:"p"},"Static IP")," feature can help fulfil the security requirements of some of the external services you use, therefore making it easier for you to get whitelisted by them."))),Object(c.b)(l.a,{value:"use existing vpc",mdxType:"TabItem"},Object(c.b)("h5",{id:"use-existing-vpc"},"Use existing VPC"),Object(c.b)("p",null,"You can opt to use your own VPC instead of the one provided by Qovery by switching VPC mode to ",Object(c.b)("inlineCode",{parentName:"p"},"Deploy on my existing VPC"),"."),Object(c.b)("p",null,"In GCP you have two VPC modes: ",Object(c.b)("inlineCode",{parentName:"p"},"Automatic")," or ",Object(c.b)("inlineCode",{parentName:"p"},"Custom"),"."),Object(c.b)("p",null,"If you are using an automatic or a custom VPC, you have to set:"),Object(c.b)("ul",null,Object(c.b)("li",{parentName:"ul"},"Your VPC Name"),Object(c.b)("li",{parentName:"ul"},"External project id (optional): by default, the project id used is the one specified in the credentials file. But if your VPC is defined in another GCP project, you have to specify the Project id.")),Object(c.b)("p",null,"In addition if you are using a custom VPC, you have to set:"),Object(c.b)("ul",null,Object(c.b)("li",{parentName:"ul"},"Your Subnet range name (",Object(c.b)("inlineCode",{parentName:"li"},"https://console.cloud.google.com/networking/networks/details/?project=&pageTab=SUBNETS"),")")),Object(c.b)(s.a,{type:"info",mdxType:"Alert"},Object(c.b)("p",null,"You can also specify (optional):"),Object(c.b)("ul",null,Object(c.b)("li",{parentName:"ul"},"Pod ipv4 address range name"),Object(c.b)("li",{parentName:"ul"},"Additional cluster pod ipv4 ranges names (separated with a comma)"),Object(c.b)("li",{parentName:"ul"},"Ipv4 service range name")),Object(c.b)("p",null,"For these ranges, you have to create Secondary IPv4 ranges inside your subnet."))))),Object(c.b)("li",null,Object(c.b)("p",null,"In the ",Object(c.b)("inlineCode",{parentName:"p"},"Ready to install your cluster")," window, check that the services needed to install your cluster are correct."),Object(c.b)("p",null,"You can now press the ",Object(c.b)("inlineCode",{parentName:"p"},"Create and Install")," button."),Object(c.b)("p",null,"Your cluster is now displayed in your organization settings, featuring the ",Object(c.b)("inlineCode",{parentName:"p"},"Installing...")," status (orange status). Once your cluster is properly installed, its status turns to green and you will be able to deploy your applications on it."),Object(c.b)("p",null,"You can follow the execution of the action via the cluster status and/or by accessing the ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#logs"}),"Cluster Logs"))))),Object(c.b)("h3",{id:"managing-your-cluster-settings"},"Managing your Cluster Settings"),Object(c.b)("p",null,"To manage the settings of an existing cluster:"),Object(c.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(c.b)("ol",null,Object(c.b)("li",null,Object(c.b)("p",null,"Open your ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery Console"),".")),Object(c.b)("li",null,Object(c.b)("p",null,"On the left menu bar, click on the Cluster page.")),Object(c.b)("li",null,Object(c.b)("p",null,"To access your cluster settings, click on the wheel button:"),Object(c.b)("p",{align:"center"},Object(c.b)("img",{src:"/img/configuration/clusters/cluster_settings.png",alt:"Display Cluster Settings"}))))),Object(c.b)("p",null,"Below you can find a description of each section"),Object(c.b)("h4",{id:"general"},"General"),Object(c.b)("p",null,"The ",Object(c.b)("inlineCode",{parentName:"p"},"General")," tab allows you to define high-level information on your cluster:"),Object(c.b)("table",null,Object(c.b)("thead",{parentName:"table"},Object(c.b)("tr",{parentName:"thead"},Object(c.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Item"),Object(c.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Description"))),Object(c.b)("tbody",{parentName:"table"},Object(c.b)("tr",{parentName:"tbody"},Object(c.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Cluster Name"),Object(c.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To edit the name of your cluster.")),Object(c.b)("tr",{parentName:"tbody"},Object(c.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Description"),Object(c.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To enter or edit the description of your cluster.")),Object(c.b)("tr",{parentName:"tbody"},Object(c.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Production Cluster"),Object(c.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To enter or edit the production flag of your cluster.")))),Object(c.b)("h4",{id:"credentials"},"Credentials"),Object(c.b)("p",null,"Here you can manage here the cloud provider credentials associated with your cluster."),Object(c.b)("p",null,"If you need to change the credentials:"),Object(c.b)("ul",null,Object(c.b)("li",{parentName:"ul"},"generate a new set of credentials on your cloud provider(",Object(c.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/#attach-gcp-credentials"}),"Procedure for GCP account"),")"),Object(c.b)("li",{parentName:"ul"},'create the new credential on the Qovery by opening the drop-down and selecting "New Credentials"')),Object(c.b)("p",null,"Once created and associated, you need to ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#updating-a-cluster"}),"updating your cluster")," to apply the change."),Object(c.b)("h4",{id:"image-registry"},"Image registry"),Object(c.b)("p",null,"In this tab, you will see that a container registry already exist (called ",Object(c.b)("inlineCode",{parentName:"p"},"registry-{$UIID}"),").\nThis is your cloud provider container registry used by Qovery to manage the deployment of your applications by mirroring the docker images."),Object(c.b)("p",null,"The credentials configured on this registry are the one used to create the cluster. But you can still update them if you prefer to manage them separately (dedicated pair of creds just to access the registry)."),Object(c.b)("p",null,"Check ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/image-mirroring/"}),"this link")," for more information."),Object(c.b)("h4",{id:"features"},"Features"),Object(c.b)("p",null,"The ",Object(c.b)("inlineCode",{parentName:"p"},"Features")," tab in your cluster settings allows you to check if the ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"#static-ip"}),Object(c.b)("strong",{parentName:"a"},"Static IP")),", ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"#use-existing-vpc"}),Object(c.b)("strong",{parentName:"a"},"Deploy on existing VPC"))," features are enabled on your cluster. The enabled features cannot be changed after the creation of the cluster."))}m.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),c=n(463),o=n.n(c);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,c=e.icon,l=e.type,i=null;switch(l){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return r.a.createElement("div",{className:o()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==c}),role:"alert"},!1!==c&&r.a.createElement("i",{className:o()("feather","icon-"+(c||i))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,c=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(c)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),c=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(c.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},470:function(e,t,n){"use strict";var a=n(1),r=n(0),c=n.n(r),o=n(39),l=n(474),i=n(20),s=n.n(i);t.a=function(e){var t,n=e.to,i=e.href,u=n||i,b=Object(l.a)(u),d=Object(r.useRef)(!1),p=s.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!p&&b&&window.docusaurus.prefetch(u),function(){p&&t&&t.disconnect()}}),[u,p,b]),u&&b?c.a.createElement(o.b,Object(a.a)({},e,{onMouseEnter:function(){d.current||(window.docusaurus.preload(u),d.current=!0)},innerRef:function(e){var n,a;p&&e&&b&&(n=e,a=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:u})):c.a.createElement("a",Object(a.a)({},e,{href:u}))}},472:function(e,t,n){"use strict";var a=n(0),r=n.n(a),c=(n(463),n(471)),o=n.n(c);n(133);t.a=function(e){var t=e.children,n=e.headingDepth,c=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,i={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},s="https://github.com/qovery/documentation/issues/new?"+o.a.stringify(i),u=Object(a.useState)(null),b=u[0],d=u[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!c&&!b&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return d("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:s,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==b&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,n){"use strict";var a=n(0),r=n.n(a),c=n(470),o=n(463),l=n.n(o);n(134);t.a=function(e){var t=e.children,n=e.className,a=e.badge,o=e.leftIcon,i=e.rightIcon,s=e.size,u=e.target,b=e.to,d=l()("jump-to","jump-to--"+s,n),p=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},o&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+o})),r.a.createElement("div",{className:"jump-to--main"},a?r.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(i||"chevron-right")+" arrow"}))));return u?r.a.createElement("a",{href:b,target:u,className:d},p):r.a.createElement(c.a,{to:b,className:d},p)}},474:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},477:function(e,t,n){"use strict";var a=n(1),r=(n(480),n(479),n(52),n(29),n(22),n(21),n(0)),c=n.n(r),o=n(483),l=n(463),i=n.n(l),s=n(471),u=n.n(s),b=n(482),d=37,p=39;function m(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,o=e.handleKeydown,l=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return c.a.createElement("div",{className:n?"tabs--centered":null},c.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",r,{"tabs--block":t}),style:l},s.map((function(e){var t=e.value,n=e.label;return c.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:i()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return o(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,i=l;if(i[0].group){var s=_.groupBy(i,"group");i=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return c.a.createElement(o.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:i,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,o=e.groupId,l=e.label,i=e.placeholder,s=e.select,h=e.size,y=(e.style,e.values),f=e.urlKey,j=Object(b.a)(),O=j.tabGroupChoices,v=j.setTabGroupChoices,N=Object(r.useState)(n),w=N[0],C=N[1];if(null!=o){var P=O[o];null!=P&&P!==w&&C(P)}var k=function(e){C(e),null!=o&&v(o,e)},E=[],I=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=u.a.parse(window.location.search);e[f]&&C(e[f])}}),[]),c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"margin-bottom--"+(h||"md")},l&&c.a.createElement("div",{className:"margin-vert--sm"},l),y.length>1&&(s?c.a.createElement(g,Object(a.a)({changeSelectedValue:k,handleKeydown:I,placeholder:i,selectedValue:w,size:h,tabRefs:E},e)):c.a.createElement(m,Object(a.a)({changeSelectedValue:k,handleKeydown:I,selectedValue:w,tabRefs:E},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===w}))[0])}},478:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/54e7632e.f0125c35.js b/54e7632e.5617fd6c.js similarity index 99% rename from 54e7632e.f0125c35.js rename to 54e7632e.5617fd6c.js index 05b356a224..b4a9cb8c4c 100644 --- a/54e7632e.f0125c35.js +++ b/54e7632e.5617fd6c.js @@ -1,2 +1,2 @@ -/*! For license information please see 54e7632e.f0125c35.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[109],{459:function(e,u,t){"use strict";t.r(u);var n={};t.r(n),t.d(n,"now",(function(){return g})),t.d(n,"timer",(function(){return w})),t.d(n,"timerFlush",(function(){return E})),t.d(n,"timeout",(function(){return k})),t.d(n,"interval",(function(){return O}));var d,r,a=t(0),c=t.n(a),o=t(601),i=t(487),f=t(470),l=(t(466),t(84),0),s=0,p=0,m=0,h=0,v=0,b="object"==typeof performance&&performance.now?performance:Date,y="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(e){setTimeout(e,17)};function g(){return h||(y(_),h=b.now()+v)}function _(){h=0}function x(){this._call=this._time=this._next=null}function w(e,u,t){var n=new x;return n.restart(e,u,t),n}function E(){g(),++l;for(var e,u=d;u;)(e=h-u._time)>=0&&u._call.call(null,e),u=u._next;--l}function I(){h=(m=b.now())+v,l=s=0;try{E()}finally{l=0,function(){var e,u,t=d,n=1/0;for(;t;)t._call?(n>t._time&&(n=t._time),e=t,t=t._next):(u=t._next,t._next=null,t=e?e._next=u:d=u);r=e,A(n)}(),h=0}}function S(){var e=b.now(),u=e-m;u>1e3&&(v-=u,m=e)}function A(e){l||(s&&(s=clearTimeout(s)),e-h>24?(e<1/0&&(s=setTimeout(I,e-b.now()-v)),p&&(p=clearInterval(p))):(p||(m=b.now(),p=setInterval(S,1e3)),l=1,y(I)))}x.prototype=w.prototype={constructor:x,restart:function(e,u,t){if("function"!=typeof e)throw new TypeError("callback is not a function");t=(null==t?g():+t)+(null==u?0:+u),this._next||r===this||(r?r._next=this:d=this,r=this),this._call=e,this._time=t,A()},stop:function(){this._call&&(this._call=null,this._time=1/0,A())}};var k=function(e,u,t){var n=new x;return u=null==u?0:+u,n.restart((function(t){n.stop(),e(t+u)}),u,t),n},O=function(e,u,t){var n=new x,d=u;return null==u?(n.restart(e,u,t),n):(u=+u,t=null==t?g():+t,n.restart((function r(a){a+=d,n.restart(r,d+=u,t),e(a)}),u,t),n)},j=Object.assign({},n);t(476);u.default=function(e){return Object(a.useEffect)((function(){if("undefined"!=typeof document){var e=function(e){for(var u=e.getContext("2d"),t=e.width,n=e.height,d=2*Math.PI,r=200,a=new Array(r),c=0;ct+45&&(o.x-=t+90),o.y+=o.vy,o.y<-45?o.y+=n+90:o.y>n+45&&(o.y-=n+90),o.vx+=.2*(Math.random()-.5)-.01*o.vx,o.vy+=.2*(Math.random()-.5)-.01*o.vy,u.beginPath(),u.arc(o.x,o.y,3,0,d),u.fillStyle="rgba(40,217,242,0.4)",u.fill()}for(c=0;c3600?(2025-m)/-1575:1,u.beginPath(),u.moveTo(f.x,f.y),u.lineTo(l.x,l.y),u.strokeStyle="rgba(40,217,242,0.3)",u.stroke())}u.restore()}))}(document.querySelector("canvas"));return function(){e.stop()}}}),[]),c.a.createElement(i.a,{title:"Components - Sources, Transforms, & Sinks",description:"Browse and search all of Qovery's components: sources, transforms, and sinks. Filter by event type, guarantee, function, operating system, and provider."},c.a.createElement("header",{className:"hero hero--animated-graph"},c.a.createElement("div",{className:"container container--fluid container--flush"},c.a.createElement("canvas",{width:"2000",height:"200"}),c.a.createElement("div",{className:"overlay"},c.a.createElement("h1",null,"Qovery Components"),c.a.createElement("div",{className:"hero--subtitle"},"Components allow you to collect, transform, and route data with ease. ",c.a.createElement(f.a,{to:"/docs/getting-started/concepts/"},"Learn more"),".")))),c.a.createElement("main",{className:"container"},c.a.createElement(o.a,{filterColumn:!0,headingLevel:2,location:e.location})))}},463:function(e,u,t){var n;!function(){"use strict";var t={}.hasOwnProperty;function d(){for(var e=[],u=0;u1?arguments[1]:void 0,t),o=a>2?arguments[2]:void 0,i=void 0===o?t:d(o,t);i>c;)u[c++]=e;return u}},468:function(e,u,t){var n=t(28).f,d=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in d||t(10)&&n(d,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},473:function(e,u,t){"use strict";var n=t(0),d=t.n(n),r=t(470),a=t(463),c=t.n(a);t(134);u.a=function(e){var u=e.children,t=e.className,n=e.badge,a=e.leftIcon,o=e.rightIcon,i=e.size,f=e.target,l=e.to,s=c()("jump-to","jump-to--"+i,t),p=d.a.createElement("div",{className:"jump-to--inner"},d.a.createElement("div",{className:"jump-to--inner-2"},a&&d.a.createElement("div",{className:"jump-to--left"},d.a.createElement("i",{className:"feather icon-"+a})),d.a.createElement("div",{className:"jump-to--main"},n?d.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",u),d.a.createElement("div",{className:"jump-to--right"},d.a.createElement("i",{className:"feather icon-"+(o||"chevron-right")+" arrow"}))));return f?d.a.createElement("a",{href:l,target:f,className:s},p):d.a.createElement(r.a,{to:l,className:s},p)}},481:function(e,u,t){"use strict";var n=t(8),d=t(526),r=t(55);t(56)("search",1,(function(e,u,t,a){return[function(t){var n=e(this),d=null==t?void 0:t[u];return void 0!==d?d.call(t,n):new RegExp(t)[u](String(n))},function(e){var u=a(t,e,this);if(u.done)return u.value;var c=n(e),o=String(this),i=c.lastIndex;d(i,0)||(c.lastIndex=0);var f=r(c,o);return d(c.lastIndex,i)||(c.lastIndex=i),null===f?-1:f.index}]}))},487:function(e,u,t){"use strict";t(497);var n=t(0),d=t.n(n),r=t(498),a=t(486),c=t(1),o=(t(488),t(489),t(499),t(470)),i=t(500),f=t(484),l=t.n(f),s=t(501),p=t.n(s),m=t(476),h=t(463),v=t.n(h),b=t(135),y=t.n(b),g=function(){return d.a.createElement("span",{className:v()(y.a.toggle,y.a.moon)})},_=function(){return d.a.createElement("span",{className:v()(y.a.toggle,y.a.sun)})},x=function(e){var u=Object(m.a)().isClient;return d.a.createElement(p.a,Object(c.a)({disabled:!u,icons:{checked:d.a.createElement(g,null),unchecked:d.a.createElement(_,null)}},e))};function w(){var e=Object(m.a)().siteConfig,u=(void 0===e?{}:e).customFields.metadata.latest_post,t=Date.parse(u.date),n=new Date,d=Math.abs(n-t),r=Math.ceil(d/864e5),a=null;return"undefined"!=typeof window&&(a=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),r<30&&(!a||a0&&d.a.createElement("div",{className:"row footer__links"},d.a.createElement("div",{className:"col col--5 footer__col"},d.a.createElement("div",{className:"margin-bottom--md"},d.a.createElement(l.a,{className:"navbar__logo",src:p,alt:"Qovery",width:"150",height:"auto"})),d.a.createElement("div",{className:"margin-bottom--md"},d.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),d.a.createElement("div",null,d.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},d.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",d.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},d.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",d.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},d.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),o.map((function(e,u){return d.a.createElement("div",{key:u,className:"col footer__col"},null!=e.title?d.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?d.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,u){return e.html?d.a.createElement("li",{key:u,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):d.a.createElement("li",{key:e.href||e.to,className:"footer__item"},d.a.createElement(L,e))}))):null)}))),(f||a)&&d.a.createElement("div",{className:"text--center"},f&&f.src&&d.a.createElement("div",{className:"margin-bottom--sm"},f.href?d.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:R.a.footerLogoLink},d.a.createElement(F,{alt:f.alt,url:s})):d.a.createElement(F,{alt:f.alt,url:s})),d.a.createElement("small",null,a),d.a.createElement("br",null))))},D=t(502),U=t(503),z=t(3);t(138);u.a=function(e){var u=Object(m.a)().siteConfig,t=void 0===u?{}:u,n=t.title,c=t.themeConfig.image,o=t.url,i=e.children,f=e.title,l=e.noFooter,s=e.description,p=e.image,h=e.keywords,v=e.version,b=f?f+" | "+n:n,y=p||c,g=o+Object(I.a)(y),_=Object(z.h)(),x=_?"https://docs.qovery.com"+(_.pathname.endsWith("/")?_.pathname:_.pathname+"/"):null;return d.a.createElement(U.a,null,d.a.createElement(D.a,null,d.a.createElement(a.a,null,d.a.createElement("html",{lang:"en"}),d.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),b&&d.a.createElement("title",null,b),b&&d.a.createElement("meta",{property:"og:title",content:b}),d.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),d.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),d.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),d.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),d.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),d.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),d.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),d.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),s&&d.a.createElement("meta",{name:"description",content:s}),s&&d.a.createElement("meta",{property:"og:description",content:s}),v&&d.a.createElement("meta",{name:"docsearch:version",content:v}),h&&h.length&&d.a.createElement("meta",{name:"keywords",content:h.join(",")}),y&&d.a.createElement("meta",{property:"og:image",content:g}),y&&d.a.createElement("meta",{property:"twitter:image",content:g}),y&&d.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+b}),x&&d.a.createElement("meta",{property:"og:url",content:x}),d.a.createElement("meta",{name:"twitter:card",content:"summary"}),x&&d.a.createElement("link",{rel:"canonical",href:x})),d.a.createElement(r.a,null),d.a.createElement(P,null),d.a.createElement("div",{className:"main-wrapper"},i),!l&&d.a.createElement(B,null)))}},491:function(e,u,t){(function(e,n){var d;(function(){var r="Expected a function",a="__lodash_placeholder__",c=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],o="[object Arguments]",i="[object Array]",f="[object Boolean]",l="[object Date]",s="[object Error]",p="[object Function]",m="[object GeneratorFunction]",h="[object Map]",v="[object Number]",b="[object Object]",y="[object RegExp]",g="[object Set]",_="[object String]",x="[object Symbol]",w="[object WeakMap]",E="[object ArrayBuffer]",I="[object DataView]",S="[object Float32Array]",A="[object Float64Array]",k="[object Int8Array]",O="[object Int16Array]",j="[object Int32Array]",N="[object Uint8Array]",C="[object Uint16Array]",P="[object Uint32Array]",T=/\b__p \+= '';/g,M=/\b(__p \+=) '' \+/g,R=/(__e\(.*?\)|\b__t\)) \+\n'';/g,L=/&(?:amp|lt|gt|quot|#39);/g,F=/[&<>"']/g,B=RegExp(L.source),D=RegExp(F.source),U=/<%-([\s\S]+?)%>/g,z=/<%([\s\S]+?)%>/g,W=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,G=/^\w*$/,q=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,H=/[\\^$.*+?()[\]{}|]/g,K=RegExp(H.source),V=/^\s+|\s+$/g,J=/^\s+/,Z=/\s+$/,Q=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,ee=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ue=/\\(\\)?/g,te=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ne=/\w*$/,de=/^[-+]0x[0-9a-f]+$/i,re=/^0b[01]+$/i,ae=/^\[object .+?Constructor\]$/,ce=/^0o[0-7]+$/i,oe=/^(?:0|[1-9]\d*)$/,ie=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,fe=/($^)/,le=/['\n\r\u2028\u2029\\]/g,se="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",pe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",me="[\\ud800-\\udfff]",he="["+pe+"]",ve="["+se+"]",be="\\d+",ye="[\\u2700-\\u27bf]",ge="[a-z\\xdf-\\xf6\\xf8-\\xff]",_e="[^\\ud800-\\udfff"+pe+be+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",xe="\\ud83c[\\udffb-\\udfff]",we="[^\\ud800-\\udfff]",Ee="(?:\\ud83c[\\udde6-\\uddff]){2}",Ie="[\\ud800-\\udbff][\\udc00-\\udfff]",Se="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Ae="(?:"+ge+"|"+_e+")",ke="(?:"+Se+"|"+_e+")",Oe="(?:"+ve+"|"+xe+")"+"?",je="[\\ufe0e\\ufe0f]?"+Oe+("(?:\\u200d(?:"+[we,Ee,Ie].join("|")+")[\\ufe0e\\ufe0f]?"+Oe+")*"),Ne="(?:"+[ye,Ee,Ie].join("|")+")"+je,Ce="(?:"+[we+ve+"?",ve,Ee,Ie,me].join("|")+")",Pe=RegExp("['\u2019]","g"),Te=RegExp(ve,"g"),Me=RegExp(xe+"(?="+xe+")|"+Ce+je,"g"),Re=RegExp([Se+"?"+ge+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[he,Se,"$"].join("|")+")",ke+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[he,Se+Ae,"$"].join("|")+")",Se+"?"+Ae+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",Se+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",be,Ne].join("|"),"g"),Le=RegExp("[\\u200d\\ud800-\\udfff"+se+"\\ufe0e\\ufe0f]"),Fe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Be=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],De=-1,Ue={};Ue[S]=Ue[A]=Ue[k]=Ue[O]=Ue[j]=Ue[N]=Ue["[object Uint8ClampedArray]"]=Ue[C]=Ue[P]=!0,Ue[o]=Ue[i]=Ue[E]=Ue[f]=Ue[I]=Ue[l]=Ue[s]=Ue[p]=Ue[h]=Ue[v]=Ue[b]=Ue[y]=Ue[g]=Ue[_]=Ue[w]=!1;var ze={};ze[o]=ze[i]=ze[E]=ze[I]=ze[f]=ze[l]=ze[S]=ze[A]=ze[k]=ze[O]=ze[j]=ze[h]=ze[v]=ze[b]=ze[y]=ze[g]=ze[_]=ze[x]=ze[N]=ze["[object Uint8ClampedArray]"]=ze[C]=ze[P]=!0,ze[s]=ze[p]=ze[w]=!1;var We={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},$e=parseFloat,Ge=parseInt,qe="object"==typeof e&&e&&e.Object===Object&&e,He="object"==typeof self&&self&&self.Object===Object&&self,Ke=qe||He||Function("return this")(),Ve=u&&!u.nodeType&&u,Je=Ve&&"object"==typeof n&&n&&!n.nodeType&&n,Ze=Je&&Je.exports===Ve,Qe=Ze&&qe.process,Ye=function(){try{var e=Je&&Je.require&&Je.require("util").types;return e||Qe&&Qe.binding&&Qe.binding("util")}catch(u){}}(),Xe=Ye&&Ye.isArrayBuffer,eu=Ye&&Ye.isDate,uu=Ye&&Ye.isMap,tu=Ye&&Ye.isRegExp,nu=Ye&&Ye.isSet,du=Ye&&Ye.isTypedArray;function ru(e,u,t){switch(t.length){case 0:return e.call(u);case 1:return e.call(u,t[0]);case 2:return e.call(u,t[0],t[1]);case 3:return e.call(u,t[0],t[1],t[2])}return e.apply(u,t)}function au(e,u,t,n){for(var d=-1,r=null==e?0:e.length;++d-1}function su(e,u,t){for(var n=-1,d=null==e?0:e.length;++n-1;);return t}function Mu(e,u){for(var t=e.length;t--&&xu(u,e[t],0)>-1;);return t}function Ru(e,u){for(var t=e.length,n=0;t--;)e[t]===u&&++n;return n}var Lu=Au({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Fu=Au({"&":"&","<":"<",">":">",'"':""","'":"'"});function Bu(e){return"\\"+We[e]}function Du(e){return Le.test(e)}function Uu(e){var u=-1,t=Array(e.size);return e.forEach((function(e,n){t[++u]=[n,e]})),t}function zu(e,u){return function(t){return e(u(t))}}function Wu(e,u){for(var t=-1,n=e.length,d=0,r=[];++t",""":'"',"'":"'"});var Vu=function e(u){var t,n=(u=null==u?Ke:Vu.defaults(Ke.Object(),u,Vu.pick(Ke,Be))).Array,d=u.Date,se=u.Error,pe=u.Function,me=u.Math,he=u.Object,ve=u.RegExp,be=u.String,ye=u.TypeError,ge=n.prototype,_e=pe.prototype,xe=he.prototype,we=u["__core-js_shared__"],Ee=_e.toString,Ie=xe.hasOwnProperty,Se=0,Ae=(t=/[^.]+$/.exec(we&&we.keys&&we.keys.IE_PROTO||""))?"Symbol(src)_1."+t:"",ke=xe.toString,Oe=Ee.call(he),je=Ke._,Ne=ve("^"+Ee.call(Ie).replace(H,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ce=Ze?u.Buffer:void 0,Me=u.Symbol,Le=u.Uint8Array,We=Ce?Ce.allocUnsafe:void 0,qe=zu(he.getPrototypeOf,he),He=he.create,Ve=xe.propertyIsEnumerable,Je=ge.splice,Qe=Me?Me.isConcatSpreadable:void 0,Ye=Me?Me.iterator:void 0,yu=Me?Me.toStringTag:void 0,Au=function(){try{var e=Xd(he,"defineProperty");return e({},"",{}),e}catch(u){}}(),Ju=u.clearTimeout!==Ke.clearTimeout&&u.clearTimeout,Zu=d&&d.now!==Ke.Date.now&&d.now,Qu=u.setTimeout!==Ke.setTimeout&&u.setTimeout,Yu=me.ceil,Xu=me.floor,et=he.getOwnPropertySymbols,ut=Ce?Ce.isBuffer:void 0,tt=u.isFinite,nt=ge.join,dt=zu(he.keys,he),rt=me.max,at=me.min,ct=d.now,ot=u.parseInt,it=me.random,ft=ge.reverse,lt=Xd(u,"DataView"),st=Xd(u,"Map"),pt=Xd(u,"Promise"),mt=Xd(u,"Set"),ht=Xd(u,"WeakMap"),vt=Xd(he,"create"),bt=ht&&new ht,yt={},gt=Ar(lt),_t=Ar(st),xt=Ar(pt),wt=Ar(mt),Et=Ar(ht),It=Me?Me.prototype:void 0,St=It?It.valueOf:void 0,At=It?It.toString:void 0;function kt(e){if($a(e)&&!Pa(e)&&!(e instanceof Ct)){if(e instanceof Nt)return e;if(Ie.call(e,"__wrapped__"))return kr(e)}return new Nt(e)}var Ot=function(){function e(){}return function(u){if(!Wa(u))return{};if(He)return He(u);e.prototype=u;var t=new e;return e.prototype=void 0,t}}();function jt(){}function Nt(e,u){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!u,this.__index__=0,this.__values__=void 0}function Ct(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Pt(e){var u=-1,t=null==e?0:e.length;for(this.clear();++u=u?e:u)),e}function Jt(e,u,t,n,d,r){var a,c=1&u,i=2&u,s=4&u;if(t&&(a=d?t(e,n,d,r):t(e)),void 0!==a)return a;if(!Wa(e))return e;var w=Pa(e);if(w){if(a=function(e){var u=e.length,t=new e.constructor(u);u&&"string"==typeof e[0]&&Ie.call(e,"index")&&(t.index=e.index,t.input=e.input);return t}(e),!c)return bd(e,a)}else{var T=tr(e),M=T==p||T==m;if(La(e))return ld(e,c);if(T==b||T==o||M&&!d){if(a=i||M?{}:dr(e),!c)return i?function(e,u){return yd(e,ur(e),u)}(e,function(e,u){return e&&yd(u,_c(u),e)}(a,e)):function(e,u){return yd(e,er(e),u)}(e,qt(a,e))}else{if(!ze[T])return d?e:{};a=function(e,u,t){var n=e.constructor;switch(u){case E:return sd(e);case f:case l:return new n(+e);case I:return function(e,u){var t=u?sd(e.buffer):e.buffer;return new e.constructor(t,e.byteOffset,e.byteLength)}(e,t);case S:case A:case k:case O:case j:case N:case"[object Uint8ClampedArray]":case C:case P:return pd(e,t);case h:return new n;case v:case _:return new n(e);case y:return function(e){var u=new e.constructor(e.source,ne.exec(e));return u.lastIndex=e.lastIndex,u}(e);case g:return new n;case x:return d=e,St?he(St.call(d)):{}}var d}(e,T,c)}}r||(r=new Lt);var R=r.get(e);if(R)return R;r.set(e,a),Va(e)?e.forEach((function(n){a.add(Jt(n,u,t,n,e,r))})):Ga(e)&&e.forEach((function(n,d){a.set(d,Jt(n,u,t,d,e,r))}));var L=w?void 0:(s?i?Hd:qd:i?_c:gc)(e);return cu(L||e,(function(n,d){L&&(n=e[d=n]),Wt(a,d,Jt(n,u,t,d,e,r))})),a}function Zt(e,u,t){var n=t.length;if(null==e)return!n;for(e=he(e);n--;){var d=t[n],r=u[d],a=e[d];if(void 0===a&&!(d in e)||!r(a))return!1}return!0}function Qt(e,u,t){if("function"!=typeof e)throw new ye(r);return gr((function(){e.apply(void 0,t)}),u)}function Yt(e,u,t,n){var d=-1,r=lu,a=!0,c=e.length,o=[],i=u.length;if(!c)return o;t&&(u=pu(u,Nu(t))),n?(r=su,a=!1):u.length>=200&&(r=Pu,a=!1,u=new Rt(u));e:for(;++d-1},Tt.prototype.set=function(e,u){var t=this.__data__,n=$t(t,e);return n<0?(++this.size,t.push([e,u])):t[n][1]=u,this},Mt.prototype.clear=function(){this.size=0,this.__data__={hash:new Pt,map:new(st||Tt),string:new Pt}},Mt.prototype.delete=function(e){var u=Qd(this,e).delete(e);return this.size-=u?1:0,u},Mt.prototype.get=function(e){return Qd(this,e).get(e)},Mt.prototype.has=function(e){return Qd(this,e).has(e)},Mt.prototype.set=function(e,u){var t=Qd(this,e),n=t.size;return t.set(e,u),this.size+=t.size==n?0:1,this},Rt.prototype.add=Rt.prototype.push=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},Rt.prototype.has=function(e){return this.__data__.has(e)},Lt.prototype.clear=function(){this.__data__=new Tt,this.size=0},Lt.prototype.delete=function(e){var u=this.__data__,t=u.delete(e);return this.size=u.size,t},Lt.prototype.get=function(e){return this.__data__.get(e)},Lt.prototype.has=function(e){return this.__data__.has(e)},Lt.prototype.set=function(e,u){var t=this.__data__;if(t instanceof Tt){var n=t.__data__;if(!st||n.length<199)return n.push([e,u]),this.size=++t.size,this;t=this.__data__=new Mt(n)}return t.set(e,u),this.size=t.size,this};var Xt=xd(cn),en=xd(on,!0);function un(e,u){var t=!0;return Xt(e,(function(e,n,d){return t=!!u(e,n,d)})),t}function tn(e,u,t){for(var n=-1,d=e.length;++n0&&t(c)?u>1?dn(c,u-1,t,n,d):mu(d,c):n||(d[d.length]=c)}return d}var rn=wd(),an=wd(!0);function cn(e,u){return e&&rn(e,u,gc)}function on(e,u){return e&&an(e,u,gc)}function fn(e,u){return fu(u,(function(u){return Da(e[u])}))}function ln(e,u){for(var t=0,n=(u=cd(u,e)).length;null!=e&&tu}function hn(e,u){return null!=e&&Ie.call(e,u)}function vn(e,u){return null!=e&&u in he(e)}function bn(e,u,t){for(var d=t?su:lu,r=e[0].length,a=e.length,c=a,o=n(a),i=1/0,f=[];c--;){var l=e[c];c&&u&&(l=pu(l,Nu(u))),i=at(l.length,i),o[c]=!t&&(u||r>=120&&l.length>=120)?new Rt(c&&l):void 0}l=e[0];var s=-1,p=o[0];e:for(;++s=c)return o;var i=t[n];return o*("desc"==i?-1:1)}}return e.index-u.index}(e,u,t)}))}function Tn(e,u,t){for(var n=-1,d=u.length,r={};++n-1;)c!==e&&Je.call(c,o,1),Je.call(e,o,1);return e}function Rn(e,u){for(var t=e?u.length:0,n=t-1;t--;){var d=u[t];if(t==n||d!==r){var r=d;ar(d)?Je.call(e,d,1):Xn(e,d)}}return e}function Ln(e,u){return e+Xu(it()*(u-e+1))}function Fn(e,u){var t="";if(!e||u<1||u>9007199254740991)return t;do{u%2&&(t+=e),(u=Xu(u/2))&&(e+=e)}while(u);return t}function Bn(e,u){return _r(mr(e,u,qc),e+"")}function Dn(e){return Bt(Oc(e))}function Un(e,u){var t=Oc(e);return Er(t,Vt(u,0,t.length))}function zn(e,u,t,n){if(!Wa(e))return e;for(var d=-1,r=(u=cd(u,e)).length,a=r-1,c=e;null!=c&&++dr?0:r+u),(t=t>r?r:t)<0&&(t+=r),r=u>t?0:t-u>>>0,u>>>=0;for(var a=n(r);++d>>1,a=e[r];null!==a&&!Za(a)&&(t?a<=u:a=200){var i=u?null:Fd(e);if(i)return $u(i);a=!1,d=Pu,o=new Rt}else o=u?[]:c;e:for(;++n=n?e:qn(e,u,t)}var fd=Ju||function(e){return Ke.clearTimeout(e)};function ld(e,u){if(u)return e.slice();var t=e.length,n=We?We(t):new e.constructor(t);return e.copy(n),n}function sd(e){var u=new e.constructor(e.byteLength);return new Le(u).set(new Le(e)),u}function pd(e,u){var t=u?sd(e.buffer):e.buffer;return new e.constructor(t,e.byteOffset,e.length)}function md(e,u){if(e!==u){var t=void 0!==e,n=null===e,d=e==e,r=Za(e),a=void 0!==u,c=null===u,o=u==u,i=Za(u);if(!c&&!i&&!r&&e>u||r&&a&&o&&!c&&!i||n&&a&&o||!t&&o||!d)return 1;if(!n&&!r&&!i&&e1?t[d-1]:void 0,a=d>2?t[2]:void 0;for(r=e.length>3&&"function"==typeof r?(d--,r):void 0,a&&cr(t[0],t[1],a)&&(r=d<3?void 0:r,d=1),u=he(u);++n-1?d[r?u[a]:a]:void 0}}function kd(e){return Gd((function(u){var t=u.length,n=t,d=Nt.prototype.thru;for(e&&u.reverse();n--;){var a=u[n];if("function"!=typeof a)throw new ye(r);if(d&&!c&&"wrapper"==Vd(a))var c=new Nt([],!0)}for(n=c?n:t;++n1&&g.reverse(),l&&ic))return!1;var i=r.get(e);if(i&&r.get(u))return i==u;var f=-1,l=!0,s=2&t?new Rt:void 0;for(r.set(e,u),r.set(u,e);++f-1&&e%1==0&&e1?"& ":"")+u[n],u=u.join(t>2?", ":" "),e.replace(Q,"{\n/* [wrapped with "+u+"] */\n")}(n,function(e,u){return cu(c,(function(t){var n="_."+t[0];u&t[1]&&!lu(e,n)&&e.push(n)})),e.sort()}(function(e){var u=e.match(Y);return u?u[1].split(X):[]}(n),t)))}function wr(e){var u=0,t=0;return function(){var n=ct(),d=16-(n-t);if(t=n,d>0){if(++u>=800)return arguments[0]}else u=0;return e.apply(void 0,arguments)}}function Er(e,u){var t=-1,n=e.length,d=n-1;for(u=void 0===u?n:u;++t1?e[u-1]:void 0;return t="function"==typeof t?(e.pop(),t):void 0,Kr(e,t)}));function ea(e){var u=kt(e);return u.__chain__=!0,u}function ua(e,u){return u(e)}var ta=Gd((function(e){var u=e.length,t=u?e[0]:0,n=this.__wrapped__,d=function(u){return Kt(u,e)};return!(u>1||this.__actions__.length)&&n instanceof Ct&&ar(t)?((n=n.slice(t,+t+(u?1:0))).__actions__.push({func:ua,args:[d],thisArg:void 0}),new Nt(n,this.__chain__).thru((function(e){return u&&!e.length&&e.push(void 0),e}))):this.thru(d)}));var na=gd((function(e,u,t){Ie.call(e,t)?++e[t]:Ht(e,t,1)}));var da=Ad(Cr),ra=Ad(Pr);function aa(e,u){return(Pa(e)?cu:Xt)(e,Zd(u,3))}function ca(e,u){return(Pa(e)?ou:en)(e,Zd(u,3))}var oa=gd((function(e,u,t){Ie.call(e,t)?e[t].push(u):Ht(e,t,[u])}));var ia=Bn((function(e,u,t){var d=-1,r="function"==typeof u,a=Ma(e)?n(e.length):[];return Xt(e,(function(e){a[++d]=r?ru(u,e,t):yn(e,u,t)})),a})),fa=gd((function(e,u,t){Ht(e,t,u)}));function la(e,u){return(Pa(e)?pu:kn)(e,Zd(u,3))}var sa=gd((function(e,u,t){e[t?0:1].push(u)}),(function(){return[[],[]]}));var pa=Bn((function(e,u){if(null==e)return[];var t=u.length;return t>1&&cr(e,u[0],u[1])?u=[]:t>2&&cr(u[0],u[1],u[2])&&(u=[u[0]]),Pn(e,dn(u,1),[])})),ma=Zu||function(){return Ke.Date.now()};function ha(e,u,t){return u=t?void 0:u,Dd(e,128,void 0,void 0,void 0,void 0,u=e&&null==u?e.length:u)}function va(e,u){var t;if("function"!=typeof u)throw new ye(r);return e=tc(e),function(){return--e>0&&(t=u.apply(this,arguments)),e<=1&&(u=void 0),t}}var ba=Bn((function(e,u,t){var n=1;if(t.length){var d=Wu(t,Jd(ba));n|=32}return Dd(e,n,u,t,d)})),ya=Bn((function(e,u,t){var n=3;if(t.length){var d=Wu(t,Jd(ya));n|=32}return Dd(u,n,e,t,d)}));function ga(e,u,t){var n,d,a,c,o,i,f=0,l=!1,s=!1,p=!0;if("function"!=typeof e)throw new ye(r);function m(u){var t=n,r=d;return n=d=void 0,f=u,c=e.apply(r,t)}function h(e){return f=e,o=gr(b,u),l?m(e):c}function v(e){var t=e-i;return void 0===i||t>=u||t<0||s&&e-f>=a}function b(){var e=ma();if(v(e))return y(e);o=gr(b,function(e){var t=u-(e-i);return s?at(t,a-(e-f)):t}(e))}function y(e){return o=void 0,p&&n?m(e):(n=d=void 0,c)}function g(){var e=ma(),t=v(e);if(n=arguments,d=this,i=e,t){if(void 0===o)return h(i);if(s)return fd(o),o=gr(b,u),m(i)}return void 0===o&&(o=gr(b,u)),c}return u=dc(u)||0,Wa(t)&&(l=!!t.leading,a=(s="maxWait"in t)?rt(dc(t.maxWait)||0,u):a,p="trailing"in t?!!t.trailing:p),g.cancel=function(){void 0!==o&&fd(o),f=0,n=i=d=o=void 0},g.flush=function(){return void 0===o?c:y(ma())},g}var _a=Bn((function(e,u){return Qt(e,1,u)})),xa=Bn((function(e,u,t){return Qt(e,dc(u)||0,t)}));function wa(e,u){if("function"!=typeof e||null!=u&&"function"!=typeof u)throw new ye(r);var t=function(){var n=arguments,d=u?u.apply(this,n):n[0],r=t.cache;if(r.has(d))return r.get(d);var a=e.apply(this,n);return t.cache=r.set(d,a)||r,a};return t.cache=new(wa.Cache||Mt),t}function Ea(e){if("function"!=typeof e)throw new ye(r);return function(){var u=arguments;switch(u.length){case 0:return!e.call(this);case 1:return!e.call(this,u[0]);case 2:return!e.call(this,u[0],u[1]);case 3:return!e.call(this,u[0],u[1],u[2])}return!e.apply(this,u)}}wa.Cache=Mt;var Ia=od((function(e,u){var t=(u=1==u.length&&Pa(u[0])?pu(u[0],Nu(Zd())):pu(dn(u,1),Nu(Zd()))).length;return Bn((function(n){for(var d=-1,r=at(n.length,t);++d=u})),Ca=gn(function(){return arguments}())?gn:function(e){return $a(e)&&Ie.call(e,"callee")&&!Ve.call(e,"callee")},Pa=n.isArray,Ta=Xe?Nu(Xe):function(e){return $a(e)&&pn(e)==E};function Ma(e){return null!=e&&za(e.length)&&!Da(e)}function Ra(e){return $a(e)&&Ma(e)}var La=ut||ro,Fa=eu?Nu(eu):function(e){return $a(e)&&pn(e)==l};function Ba(e){if(!$a(e))return!1;var u=pn(e);return u==s||"[object DOMException]"==u||"string"==typeof e.message&&"string"==typeof e.name&&!Ha(e)}function Da(e){if(!Wa(e))return!1;var u=pn(e);return u==p||u==m||"[object AsyncFunction]"==u||"[object Proxy]"==u}function Ua(e){return"number"==typeof e&&e==tc(e)}function za(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}function Wa(e){var u=typeof e;return null!=e&&("object"==u||"function"==u)}function $a(e){return null!=e&&"object"==typeof e}var Ga=uu?Nu(uu):function(e){return $a(e)&&tr(e)==h};function qa(e){return"number"==typeof e||$a(e)&&pn(e)==v}function Ha(e){if(!$a(e)||pn(e)!=b)return!1;var u=qe(e);if(null===u)return!0;var t=Ie.call(u,"constructor")&&u.constructor;return"function"==typeof t&&t instanceof t&&Ee.call(t)==Oe}var Ka=tu?Nu(tu):function(e){return $a(e)&&pn(e)==y};var Va=nu?Nu(nu):function(e){return $a(e)&&tr(e)==g};function Ja(e){return"string"==typeof e||!Pa(e)&&$a(e)&&pn(e)==_}function Za(e){return"symbol"==typeof e||$a(e)&&pn(e)==x}var Qa=du?Nu(du):function(e){return $a(e)&&za(e.length)&&!!Ue[pn(e)]};var Ya=Md(An),Xa=Md((function(e,u){return e<=u}));function ec(e){if(!e)return[];if(Ma(e))return Ja(e)?Hu(e):bd(e);if(Ye&&e[Ye])return function(e){for(var u,t=[];!(u=e.next()).done;)t.push(u.value);return t}(e[Ye]());var u=tr(e);return(u==h?Uu:u==g?$u:Oc)(e)}function uc(e){return e?(e=dc(e))===1/0||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function tc(e){var u=uc(e),t=u%1;return u==u?t?u-t:u:0}function nc(e){return e?Vt(tc(e),0,4294967295):0}function dc(e){if("number"==typeof e)return e;if(Za(e))return NaN;if(Wa(e)){var u="function"==typeof e.valueOf?e.valueOf():e;e=Wa(u)?u+"":u}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(V,"");var t=re.test(e);return t||ce.test(e)?Ge(e.slice(2),t?2:8):de.test(e)?NaN:+e}function rc(e){return yd(e,_c(e))}function ac(e){return null==e?"":Qn(e)}var cc=_d((function(e,u){if(lr(u)||Ma(u))yd(u,gc(u),e);else for(var t in u)Ie.call(u,t)&&Wt(e,t,u[t])})),oc=_d((function(e,u){yd(u,_c(u),e)})),ic=_d((function(e,u,t,n){yd(u,_c(u),e,n)})),fc=_d((function(e,u,t,n){yd(u,gc(u),e,n)})),lc=Gd(Kt);var sc=Bn((function(e,u){e=he(e);var t=-1,n=u.length,d=n>2?u[2]:void 0;for(d&&cr(u[0],u[1],d)&&(n=1);++t1),u})),yd(e,Hd(e),t),n&&(t=Jt(t,7,Wd));for(var d=u.length;d--;)Xn(t,u[d]);return t}));var Ic=Gd((function(e,u){return null==e?{}:function(e,u){return Tn(e,u,(function(u,t){return hc(e,t)}))}(e,u)}));function Sc(e,u){if(null==e)return{};var t=pu(Hd(e),(function(e){return[e]}));return u=Zd(u),Tn(e,t,(function(e,t){return u(e,t[0])}))}var Ac=Bd(gc),kc=Bd(_c);function Oc(e){return null==e?[]:Cu(e,gc(e))}var jc=Id((function(e,u,t){return u=u.toLowerCase(),e+(t?Nc(u):u)}));function Nc(e){return Bc(ac(e).toLowerCase())}function Cc(e){return(e=ac(e))&&e.replace(ie,Lu).replace(Te,"")}var Pc=Id((function(e,u,t){return e+(t?"-":"")+u.toLowerCase()})),Tc=Id((function(e,u,t){return e+(t?" ":"")+u.toLowerCase()})),Mc=Ed("toLowerCase");var Rc=Id((function(e,u,t){return e+(t?"_":"")+u.toLowerCase()}));var Lc=Id((function(e,u,t){return e+(t?" ":"")+Bc(u)}));var Fc=Id((function(e,u,t){return e+(t?" ":"")+u.toUpperCase()})),Bc=Ed("toUpperCase");function Dc(e,u,t){return e=ac(e),void 0===(u=t?void 0:u)?function(e){return Fe.test(e)}(e)?function(e){return e.match(Re)||[]}(e):function(e){return e.match(ee)||[]}(e):e.match(u)||[]}var Uc=Bn((function(e,u){try{return ru(e,void 0,u)}catch(t){return Ba(t)?t:new se(t)}})),zc=Gd((function(e,u){return cu(u,(function(u){u=Sr(u),Ht(e,u,ba(e[u],e))})),e}));function Wc(e){return function(){return e}}var $c=kd(),Gc=kd(!0);function qc(e){return e}function Hc(e){return En("function"==typeof e?e:Jt(e,1))}var Kc=Bn((function(e,u){return function(t){return yn(t,e,u)}})),Vc=Bn((function(e,u){return function(t){return yn(e,t,u)}}));function Jc(e,u,t){var n=gc(u),d=fn(u,n);null!=t||Wa(u)&&(d.length||!n.length)||(t=u,u=e,e=this,d=fn(u,gc(u)));var r=!(Wa(t)&&"chain"in t&&!t.chain),a=Da(e);return cu(d,(function(t){var n=u[t];e[t]=n,a&&(e.prototype[t]=function(){var u=this.__chain__;if(r||u){var t=e(this.__wrapped__),d=t.__actions__=bd(this.__actions__);return d.push({func:n,args:arguments,thisArg:e}),t.__chain__=u,t}return n.apply(e,mu([this.value()],arguments))})})),e}function Zc(){}var Qc=Cd(pu),Yc=Cd(iu),Xc=Cd(bu);function eo(e){return or(e)?Su(Sr(e)):function(e){return function(u){return ln(u,e)}}(e)}var uo=Td(),to=Td(!0);function no(){return[]}function ro(){return!1}var ao=Nd((function(e,u){return e+u}),0),co=Ld("ceil"),oo=Nd((function(e,u){return e/u}),1),io=Ld("floor");var fo,lo=Nd((function(e,u){return e*u}),1),so=Ld("round"),po=Nd((function(e,u){return e-u}),0);return kt.after=function(e,u){if("function"!=typeof u)throw new ye(r);return e=tc(e),function(){if(--e<1)return u.apply(this,arguments)}},kt.ary=ha,kt.assign=cc,kt.assignIn=oc,kt.assignInWith=ic,kt.assignWith=fc,kt.at=lc,kt.before=va,kt.bind=ba,kt.bindAll=zc,kt.bindKey=ya,kt.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return Pa(e)?e:[e]},kt.chain=ea,kt.chunk=function(e,u,t){u=(t?cr(e,u,t):void 0===u)?1:rt(tc(u),0);var d=null==e?0:e.length;if(!d||u<1)return[];for(var r=0,a=0,c=n(Yu(d/u));rd?0:d+t),(n=void 0===n||n>d?d:tc(n))<0&&(n+=d),n=t>n?0:nc(n);t>>0)?(e=ac(e))&&("string"==typeof u||null!=u&&!Ka(u))&&!(u=Qn(u))&&Du(e)?id(Hu(e),0,t):e.split(u,t):[]},kt.spread=function(e,u){if("function"!=typeof e)throw new ye(r);return u=null==u?0:rt(tc(u),0),Bn((function(t){var n=t[u],d=id(t,0,u);return n&&mu(d,n),ru(e,this,d)}))},kt.tail=function(e){var u=null==e?0:e.length;return u?qn(e,1,u):[]},kt.take=function(e,u,t){return e&&e.length?qn(e,0,(u=t||void 0===u?1:tc(u))<0?0:u):[]},kt.takeRight=function(e,u,t){var n=null==e?0:e.length;return n?qn(e,(u=n-(u=t||void 0===u?1:tc(u)))<0?0:u,n):[]},kt.takeRightWhile=function(e,u){return e&&e.length?ud(e,Zd(u,3),!1,!0):[]},kt.takeWhile=function(e,u){return e&&e.length?ud(e,Zd(u,3)):[]},kt.tap=function(e,u){return u(e),e},kt.throttle=function(e,u,t){var n=!0,d=!0;if("function"!=typeof e)throw new ye(r);return Wa(t)&&(n="leading"in t?!!t.leading:n,d="trailing"in t?!!t.trailing:d),ga(e,u,{leading:n,maxWait:u,trailing:d})},kt.thru=ua,kt.toArray=ec,kt.toPairs=Ac,kt.toPairsIn=kc,kt.toPath=function(e){return Pa(e)?pu(e,Sr):Za(e)?[e]:bd(Ir(ac(e)))},kt.toPlainObject=rc,kt.transform=function(e,u,t){var n=Pa(e),d=n||La(e)||Qa(e);if(u=Zd(u,4),null==t){var r=e&&e.constructor;t=d?n?new r:[]:Wa(e)&&Da(r)?Ot(qe(e)):{}}return(d?cu:cn)(e,(function(e,n,d){return u(t,e,n,d)})),t},kt.unary=function(e){return ha(e,1)},kt.union=$r,kt.unionBy=Gr,kt.unionWith=qr,kt.uniq=function(e){return e&&e.length?Yn(e):[]},kt.uniqBy=function(e,u){return e&&e.length?Yn(e,Zd(u,2)):[]},kt.uniqWith=function(e,u){return u="function"==typeof u?u:void 0,e&&e.length?Yn(e,void 0,u):[]},kt.unset=function(e,u){return null==e||Xn(e,u)},kt.unzip=Hr,kt.unzipWith=Kr,kt.update=function(e,u,t){return null==e?e:ed(e,u,ad(t))},kt.updateWith=function(e,u,t,n){return n="function"==typeof n?n:void 0,null==e?e:ed(e,u,ad(t),n)},kt.values=Oc,kt.valuesIn=function(e){return null==e?[]:Cu(e,_c(e))},kt.without=Vr,kt.words=Dc,kt.wrap=function(e,u){return Sa(ad(u),e)},kt.xor=Jr,kt.xorBy=Zr,kt.xorWith=Qr,kt.zip=Yr,kt.zipObject=function(e,u){return dd(e||[],u||[],Wt)},kt.zipObjectDeep=function(e,u){return dd(e||[],u||[],zn)},kt.zipWith=Xr,kt.entries=Ac,kt.entriesIn=kc,kt.extend=oc,kt.extendWith=ic,Jc(kt,kt),kt.add=ao,kt.attempt=Uc,kt.camelCase=jc,kt.capitalize=Nc,kt.ceil=co,kt.clamp=function(e,u,t){return void 0===t&&(t=u,u=void 0),void 0!==t&&(t=(t=dc(t))==t?t:0),void 0!==u&&(u=(u=dc(u))==u?u:0),Vt(dc(e),u,t)},kt.clone=function(e){return Jt(e,4)},kt.cloneDeep=function(e){return Jt(e,5)},kt.cloneDeepWith=function(e,u){return Jt(e,5,u="function"==typeof u?u:void 0)},kt.cloneWith=function(e,u){return Jt(e,4,u="function"==typeof u?u:void 0)},kt.conformsTo=function(e,u){return null==u||Zt(e,u,gc(u))},kt.deburr=Cc,kt.defaultTo=function(e,u){return null==e||e!=e?u:e},kt.divide=oo,kt.endsWith=function(e,u,t){e=ac(e),u=Qn(u);var n=e.length,d=t=void 0===t?n:Vt(tc(t),0,n);return(t-=u.length)>=0&&e.slice(t,d)==u},kt.eq=Oa,kt.escape=function(e){return(e=ac(e))&&D.test(e)?e.replace(F,Fu):e},kt.escapeRegExp=function(e){return(e=ac(e))&&K.test(e)?e.replace(H,"\\$&"):e},kt.every=function(e,u,t){var n=Pa(e)?iu:un;return t&&cr(e,u,t)&&(u=void 0),n(e,Zd(u,3))},kt.find=da,kt.findIndex=Cr,kt.findKey=function(e,u){return gu(e,Zd(u,3),cn)},kt.findLast=ra,kt.findLastIndex=Pr,kt.findLastKey=function(e,u){return gu(e,Zd(u,3),on)},kt.floor=io,kt.forEach=aa,kt.forEachRight=ca,kt.forIn=function(e,u){return null==e?e:rn(e,Zd(u,3),_c)},kt.forInRight=function(e,u){return null==e?e:an(e,Zd(u,3),_c)},kt.forOwn=function(e,u){return e&&cn(e,Zd(u,3))},kt.forOwnRight=function(e,u){return e&&on(e,Zd(u,3))},kt.get=mc,kt.gt=ja,kt.gte=Na,kt.has=function(e,u){return null!=e&&nr(e,u,hn)},kt.hasIn=hc,kt.head=Mr,kt.identity=qc,kt.includes=function(e,u,t,n){e=Ma(e)?e:Oc(e),t=t&&!n?tc(t):0;var d=e.length;return t<0&&(t=rt(d+t,0)),Ja(e)?t<=d&&e.indexOf(u,t)>-1:!!d&&xu(e,u,t)>-1},kt.indexOf=function(e,u,t){var n=null==e?0:e.length;if(!n)return-1;var d=null==t?0:tc(t);return d<0&&(d=rt(n+d,0)),xu(e,u,d)},kt.inRange=function(e,u,t){return u=uc(u),void 0===t?(t=u,u=0):t=uc(t),function(e,u,t){return e>=at(u,t)&&e=-9007199254740991&&e<=9007199254740991},kt.isSet=Va,kt.isString=Ja,kt.isSymbol=Za,kt.isTypedArray=Qa,kt.isUndefined=function(e){return void 0===e},kt.isWeakMap=function(e){return $a(e)&&tr(e)==w},kt.isWeakSet=function(e){return $a(e)&&"[object WeakSet]"==pn(e)},kt.join=function(e,u){return null==e?"":nt.call(e,u)},kt.kebabCase=Pc,kt.last=Br,kt.lastIndexOf=function(e,u,t){var n=null==e?0:e.length;if(!n)return-1;var d=n;return void 0!==t&&(d=(d=tc(t))<0?rt(n+d,0):at(d,n-1)),u==u?function(e,u,t){for(var n=t+1;n--;)if(e[n]===u)return n;return n}(e,u,d):_u(e,Eu,d,!0)},kt.lowerCase=Tc,kt.lowerFirst=Mc,kt.lt=Ya,kt.lte=Xa,kt.max=function(e){return e&&e.length?tn(e,qc,mn):void 0},kt.maxBy=function(e,u){return e&&e.length?tn(e,Zd(u,2),mn):void 0},kt.mean=function(e){return Iu(e,qc)},kt.meanBy=function(e,u){return Iu(e,Zd(u,2))},kt.min=function(e){return e&&e.length?tn(e,qc,An):void 0},kt.minBy=function(e,u){return e&&e.length?tn(e,Zd(u,2),An):void 0},kt.stubArray=no,kt.stubFalse=ro,kt.stubObject=function(){return{}},kt.stubString=function(){return""},kt.stubTrue=function(){return!0},kt.multiply=lo,kt.nth=function(e,u){return e&&e.length?Cn(e,tc(u)):void 0},kt.noConflict=function(){return Ke._===this&&(Ke._=je),this},kt.noop=Zc,kt.now=ma,kt.pad=function(e,u,t){e=ac(e);var n=(u=tc(u))?qu(e):0;if(!u||n>=u)return e;var d=(u-n)/2;return Pd(Xu(d),t)+e+Pd(Yu(d),t)},kt.padEnd=function(e,u,t){e=ac(e);var n=(u=tc(u))?qu(e):0;return u&&nu){var n=e;e=u,u=n}if(t||e%1||u%1){var d=it();return at(e+d*(u-e+$e("1e-"+((d+"").length-1))),u)}return Ln(e,u)},kt.reduce=function(e,u,t){var n=Pa(e)?hu:ku,d=arguments.length<3;return n(e,Zd(u,4),t,d,Xt)},kt.reduceRight=function(e,u,t){var n=Pa(e)?vu:ku,d=arguments.length<3;return n(e,Zd(u,4),t,d,en)},kt.repeat=function(e,u,t){return u=(t?cr(e,u,t):void 0===u)?1:tc(u),Fn(ac(e),u)},kt.replace=function(){var e=arguments,u=ac(e[0]);return e.length<3?u:u.replace(e[1],e[2])},kt.result=function(e,u,t){var n=-1,d=(u=cd(u,e)).length;for(d||(d=1,e=void 0);++n9007199254740991)return[];var t=4294967295,n=at(e,4294967295);e-=4294967295;for(var d=ju(n,u=Zd(u));++t=r)return e;var c=t-qu(n);if(c<1)return n;var o=a?id(a,0,c).join(""):e.slice(0,c);if(void 0===d)return o+n;if(a&&(c+=o.length-c),Ka(d)){if(e.slice(c).search(d)){var i,f=o;for(d.global||(d=ve(d.source,ac(ne.exec(d))+"g")),d.lastIndex=0;i=d.exec(f);)var l=i.index;o=o.slice(0,void 0===l?c:l)}}else if(e.indexOf(Qn(d),c)!=c){var s=o.lastIndexOf(d);s>-1&&(o=o.slice(0,s))}return o+n},kt.unescape=function(e){return(e=ac(e))&&B.test(e)?e.replace(L,Ku):e},kt.uniqueId=function(e){var u=++Se;return ac(e)+u},kt.upperCase=Fc,kt.upperFirst=Bc,kt.each=aa,kt.eachRight=ca,kt.first=Mr,Jc(kt,(fo={},cn(kt,(function(e,u){Ie.call(kt.prototype,u)||(fo[u]=e)})),fo),{chain:!1}),kt.VERSION="4.17.15",cu(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){kt[e].placeholder=kt})),cu(["drop","take"],(function(e,u){Ct.prototype[e]=function(t){t=void 0===t?1:rt(tc(t),0);var n=this.__filtered__&&!u?new Ct(this):this.clone();return n.__filtered__?n.__takeCount__=at(t,n.__takeCount__):n.__views__.push({size:at(t,4294967295),type:e+(n.__dir__<0?"Right":"")}),n},Ct.prototype[e+"Right"]=function(u){return this.reverse()[e](u).reverse()}})),cu(["filter","map","takeWhile"],(function(e,u){var t=u+1,n=1==t||3==t;Ct.prototype[e]=function(e){var u=this.clone();return u.__iteratees__.push({iteratee:Zd(e,3),type:t}),u.__filtered__=u.__filtered__||n,u}})),cu(["head","last"],(function(e,u){var t="take"+(u?"Right":"");Ct.prototype[e]=function(){return this[t](1).value()[0]}})),cu(["initial","tail"],(function(e,u){var t="drop"+(u?"":"Right");Ct.prototype[e]=function(){return this.__filtered__?new Ct(this):this[t](1)}})),Ct.prototype.compact=function(){return this.filter(qc)},Ct.prototype.find=function(e){return this.filter(e).head()},Ct.prototype.findLast=function(e){return this.reverse().find(e)},Ct.prototype.invokeMap=Bn((function(e,u){return"function"==typeof e?new Ct(this):this.map((function(t){return yn(t,e,u)}))})),Ct.prototype.reject=function(e){return this.filter(Ea(Zd(e)))},Ct.prototype.slice=function(e,u){e=tc(e);var t=this;return t.__filtered__&&(e>0||u<0)?new Ct(t):(e<0?t=t.takeRight(-e):e&&(t=t.drop(e)),void 0!==u&&(t=(u=tc(u))<0?t.dropRight(-u):t.take(u-e)),t)},Ct.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},Ct.prototype.toArray=function(){return this.take(4294967295)},cn(Ct.prototype,(function(e,u){var t=/^(?:filter|find|map|reject)|While$/.test(u),n=/^(?:head|last)$/.test(u),d=kt[n?"take"+("last"==u?"Right":""):u],r=n||/^find/.test(u);d&&(kt.prototype[u]=function(){var u=this.__wrapped__,a=n?[1]:arguments,c=u instanceof Ct,o=a[0],i=c||Pa(u),f=function(e){var u=d.apply(kt,mu([e],a));return n&&l?u[0]:u};i&&t&&"function"==typeof o&&1!=o.length&&(c=i=!1);var l=this.__chain__,s=!!this.__actions__.length,p=r&&!l,m=c&&!s;if(!r&&i){u=m?u:new Ct(this);var h=e.apply(u,a);return h.__actions__.push({func:ua,args:[f],thisArg:void 0}),new Nt(h,l)}return p&&m?e.apply(this,a):(h=this.thru(f),p?n?h.value()[0]:h.value():h)})})),cu(["pop","push","shift","sort","splice","unshift"],(function(e){var u=ge[e],t=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",n=/^(?:pop|shift)$/.test(e);kt.prototype[e]=function(){var e=arguments;if(n&&!this.__chain__){var d=this.value();return u.apply(Pa(d)?d:[],e)}return this[t]((function(t){return u.apply(Pa(t)?t:[],e)}))}})),cn(Ct.prototype,(function(e,u){var t=kt[u];if(t){var n=t.name+"";Ie.call(yt,n)||(yt[n]=[]),yt[n].push({name:u,func:t})}})),yt[Od(void 0,2).name]=[{name:"wrapper",func:void 0}],Ct.prototype.clone=function(){var e=new Ct(this.__wrapped__);return e.__actions__=bd(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=bd(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=bd(this.__views__),e},Ct.prototype.reverse=function(){if(this.__filtered__){var e=new Ct(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},Ct.prototype.value=function(){var e=this.__wrapped__.value(),u=this.__dir__,t=Pa(e),n=u<0,d=t?e.length:0,r=function(e,u,t){var n=-1,d=t.length;for(;++n=this.__values__.length;return{done:e,value:e?void 0:this.__values__[this.__index__++]}},kt.prototype.plant=function(e){for(var u,t=this;t instanceof jt;){var n=kr(t);n.__index__=0,n.__values__=void 0,u?d.__wrapped__=n:u=n;var d=n;t=t.__wrapped__}return d.__wrapped__=e,u},kt.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof Ct){var u=e;return this.__actions__.length&&(u=new Ct(this)),(u=u.reverse()).__actions__.push({func:ua,args:[Wr],thisArg:void 0}),new Nt(u,this.__chain__)}return this.thru(Wr)},kt.prototype.toJSON=kt.prototype.valueOf=kt.prototype.value=function(){return td(this.__wrapped__,this.__actions__)},kt.prototype.first=kt.prototype.head,Ye&&(kt.prototype[Ye]=function(){return this}),kt}();Ke._=Vu,void 0===(d=function(){return Vu}.call(u,t,u,n))||(n.exports=d)}).call(this)}).call(this,t(76),t(496)(e))},494:function(e,u,t){"use strict";var n=t(0),d=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});u.a=d},496:function(e,u){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},509:function(e,u,t){"use strict";var n=SyntaxError,d=Function,r=TypeError,a=function(e){try{return d('"use strict"; return ('+e+").constructor;")()}catch(u){}},c=Object.getOwnPropertyDescriptor;if(c)try{c({},"")}catch(k){c=null}var o=function(){throw new r},i=c?function(){try{return o}catch(e){try{return c(arguments,"callee").get}catch(u){return o}}}():o,f=t(547)(),l=Object.getPrototypeOf||function(e){return e.__proto__},s={},p="undefined"==typeof Uint8Array?void 0:l(Uint8Array),m={"%AggregateError%":"undefined"==typeof AggregateError?void 0:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?void 0:ArrayBuffer,"%ArrayIteratorPrototype%":f?l([][Symbol.iterator]()):void 0,"%AsyncFromSyncIteratorPrototype%":void 0,"%AsyncFunction%":s,"%AsyncGenerator%":s,"%AsyncGeneratorFunction%":s,"%AsyncIteratorPrototype%":s,"%Atomics%":"undefined"==typeof Atomics?void 0:Atomics,"%BigInt%":"undefined"==typeof BigInt?void 0:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?void 0:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?void 0:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?void 0:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?void 0:FinalizationRegistry,"%Function%":d,"%GeneratorFunction%":s,"%Int8Array%":"undefined"==typeof Int8Array?void 0:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?void 0:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?void 0:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":f?l(l([][Symbol.iterator]())):void 0,"%JSON%":"object"==typeof JSON?JSON:void 0,"%Map%":"undefined"==typeof Map?void 0:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&f?l((new Map)[Symbol.iterator]()):void 0,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?void 0:Promise,"%Proxy%":"undefined"==typeof Proxy?void 0:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?void 0:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?void 0:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&f?l((new Set)[Symbol.iterator]()):void 0,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?void 0:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":f?l(""[Symbol.iterator]()):void 0,"%Symbol%":f?Symbol:void 0,"%SyntaxError%":n,"%ThrowTypeError%":i,"%TypedArray%":p,"%TypeError%":r,"%Uint8Array%":"undefined"==typeof Uint8Array?void 0:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?void 0:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?void 0:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?void 0:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?void 0:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?void 0:WeakSet},h={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},v=t(510),b=t(550),y=v.call(Function.call,Array.prototype.concat),g=v.call(Function.apply,Array.prototype.splice),_=v.call(Function.call,String.prototype.replace),x=v.call(Function.call,String.prototype.slice),w=v.call(Function.call,RegExp.prototype.exec),E=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,I=/\\(\\)?/g,S=function(e){var u=x(e,0,1),t=x(e,-1);if("%"===u&&"%"!==t)throw new n("invalid intrinsic syntax, expected closing `%`");if("%"===t&&"%"!==u)throw new n("invalid intrinsic syntax, expected opening `%`");var d=[];return _(e,E,(function(e,u,t,n){d[d.length]=t?_(n,I,"$1"):u||e})),d},A=function(e,u){var t,d=e;if(b(h,d)&&(d="%"+(t=h[d])[0]+"%"),b(m,d)){var c=m[d];if(c===s&&(c=function e(u){var t;if("%AsyncFunction%"===u)t=a("async function () {}");else if("%GeneratorFunction%"===u)t=a("function* () {}");else if("%AsyncGeneratorFunction%"===u)t=a("async function* () {}");else if("%AsyncGenerator%"===u){var n=e("%AsyncGeneratorFunction%");n&&(t=n.prototype)}else if("%AsyncIteratorPrototype%"===u){var d=e("%AsyncGenerator%");d&&(t=l(d.prototype))}return m[u]=t,t}(d)),void 0===c&&!u)throw new r("intrinsic "+e+" exists, but is not available. Please file an issue!");return{alias:t,name:d,value:c}}throw new n("intrinsic "+e+" does not exist!")};e.exports=function(e,u){if("string"!=typeof e||0===e.length)throw new r("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof u)throw new r('"allowMissing" argument must be a boolean');if(null===w(/^%?[^%]*%?$/,e))throw new n("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var t=S(e),d=t.length>0?t[0]:"",a=A("%"+d+"%",u),o=a.name,i=a.value,f=!1,l=a.alias;l&&(d=l[0],g(t,y([0,1],l)));for(var s=1,p=!0;s=t.length){var E=c(i,h);i=(p=!!E)&&"get"in E&&!("originalValue"in E.get)?E.get:i[h]}else p=b(i,h),i=i[h];p&&!f&&(m[o]=i)}}return i}},510:function(e,u,t){"use strict";var n=t(549);e.exports=Function.prototype.bind||n},511:function(e,u,t){"use strict";var n=String.prototype.replace,d=/%20/g,r="RFC1738",a="RFC3986";e.exports={default:a,formatters:{RFC1738:function(e){return n.call(e,d,"+")},RFC3986:function(e){return String(e)}},RFC1738:r,RFC3986:a}},518:function(e,u,t){"use strict";var n=t(511),d=Object.prototype.hasOwnProperty,r=Array.isArray,a=function(){for(var e=[],u=0;u<256;++u)e.push("%"+((u<16?"0":"")+u.toString(16)).toUpperCase());return e}(),c=function(e,u){for(var t=u&&u.plainObjects?Object.create(null):{},n=0;n1;){var u=e.pop(),t=u.obj[u.prop];if(r(t)){for(var n=[],d=0;d=48&&f<=57||f>=65&&f<=90||f>=97&&f<=122||r===n.RFC1738&&(40===f||41===f)?o+=c.charAt(i):f<128?o+=a[f]:f<2048?o+=a[192|f>>6]+a[128|63&f]:f<55296||f>=57344?o+=a[224|f>>12]+a[128|f>>6&63]+a[128|63&f]:(i+=1,f=65536+((1023&f)<<10|1023&c.charCodeAt(i)),o+=a[240|f>>18]+a[128|f>>12&63]+a[128|f>>6&63]+a[128|63&f])}return o},isBuffer:function(e){return!(!e||"object"!=typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},maybeMap:function(e,u){if(r(e)){for(var t=[],n=0;n{if("string"!=typeof e)throw new TypeError("Expected a string");return e=(e=(e=n(e)).toLowerCase().replace(/[_-]+/g," ").replace(/\s{2,}/g," ").trim()).charAt(0).toUpperCase()+e.slice(1)};e.exports=d,e.exports.default=d},526:function(e,u){e.exports=Object.is||function(e,u){return e===u?0!==e||1/e==1/u:e!=e&&u!=u}},529:function(e,u,t){"use strict";var n=t(30),d=t(12),r=t(27),a=t(91),c=t(92),o=t(26),i=t(585),f=t(93);d(d.S+d.F*!t(83)((function(e){Array.from(e)})),"Array",{from:function(e){var u,t,d,l,s=r(e),p="function"==typeof this?this:Array,m=arguments.length,h=m>1?arguments[1]:void 0,v=void 0!==h,b=0,y=f(s);if(v&&(h=n(h,m>2?arguments[2]:void 0,2)),null==y||p==Array&&c(y))for(t=new p(u=o(s.length));u>b;b++)i(t,b,v?h(s[b],b):s[b]);else for(l=y.call(s),t=new p;!(d=l.next()).done;b++)i(t,b,v?a(l,h,[d.value,b],!0):d.value);return t.length=b,t}})},530:function(e,u,t){"use strict";var n=t(586),d=t(532);e.exports=t(587)("Set",(function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(e){return n.def(d(this,"Set"),e=0===e?0:e,e)}},n)},531:function(e,u,t){var n=t(40)("meta"),d=t(13),r=t(31),a=t(28).f,c=0,o=Object.isExtensible||function(){return!0},i=!t(14)((function(){return o(Object.preventExtensions({}))})),f=function(e){a(e,n,{value:{i:"O"+ ++c,w:{}}})},l=e.exports={KEY:n,NEED:!1,fastKey:function(e,u){if(!d(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!r(e,n)){if(!o(e))return"F";if(!u)return"E";f(e)}return e[n].i},getWeak:function(e,u){if(!r(e,n)){if(!o(e))return!0;if(!u)return!1;f(e)}return e[n].w},onFreeze:function(e){return i&&l.NEED&&o(e)&&!r(e,n)&&f(e),e}}},532:function(e,u,t){var n=t(13);e.exports=function(e,u){if(!n(e)||e._t!==u)throw TypeError("Incompatible receiver, "+u+" required!");return e}},533:function(e,u,t){"use strict";const n=t(534);e.exports=(e,u)=>{if("string"!=typeof e)throw new TypeError("Expected a string");u=void 0===u?"_":u;const t=n("([\\p{Ll}\\d])(\\p{Lu})","g"),d=n("(\\p{Lu}+)(\\p{Lu}[\\p{Ll}\\d]+)","g");return e.replace(t,`$1${u}$2`).replace(d,`$1${u}$2`).toLowerCase()}},534:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0});var n=l(t(535)),d=l(t(536)),r=l(t(537)),a=l(t(538)),c=l(t(539)),o=l(t(540)),i=l(t(541)),f=l(t(542));function l(e){return e&&e.__esModule?e:{default:e}}(0,d.default)(n.default),(0,r.default)(n.default),(0,a.default)(n.default),(0,c.default)(n.default),(0,o.default)(n.default),(0,i.default)(n.default),(0,f.default)(n.default),u.default=n.default,e.exports=u.default},535:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0});var n={astral:!1},d={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},r={},a={},c={},o=[],i={default:/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,class:/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},f=/\$(?:{([\w$]+)}|<([\w$]+)>|(\d\d?|[\s\S]))/g,l=void 0===d.exec.call(/()??/,"")[1],s=void 0!==/x/.flags,p={}.toString;function m(e){var u=!0;try{new RegExp("",e)}catch(t){u=!1}return u}var h=m("u"),v=m("y"),b={g:!0,i:!0,m:!0,u:h,y:v};function y(e,u,t,n,d){var r=void 0;if(e.xregexp={captureNames:u},d)return e;if(e.__proto__)e.__proto__=C.prototype;else for(r in C.prototype)e[r]=C.prototype[r];return e.xregexp.source=t,e.xregexp.flags=n?n.split("").sort().join(""):n,e}function g(e){return d.replace.call(e,/([\s\S])(?=[\s\S]*\1)/g,"")}function _(e,u){if(!C.isRegExp(e))throw new TypeError("Type RegExp expected");var t=e.xregexp||{},n=function(e){return s?e.flags:d.exec.call(/\/([a-z]*)$/i,RegExp.prototype.toString.call(e))[1]}(e),r="",a="",c=null,o=null;return(u=u||{}).removeG&&(a+="g"),u.removeY&&(a+="y"),a&&(n=d.replace.call(n,new RegExp("["+a+"]+","g"),"")),u.addG&&(r+="g"),u.addY&&(r+="y"),r&&(n=g(n+r)),u.isInternalOnly||(void 0!==t.source&&(c=t.source),null!=t.flags&&(o=r?g(t.flags+r):t.flags)),e=y(new RegExp(u.source||e.source,n),function(e){return!(!e.xregexp||!e.xregexp.captureNames)}(e)?t.captureNames.slice(0):null,c,o,u.isInternalOnly)}function x(e){return parseInt(e,16)}function w(e,u,t){return"("===e.input[e.index-1]||")"===e.input[e.index+e[0].length]||function(e,u,t){return d.test.call(-1!==t.indexOf("x")?/^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/,e.slice(u))}(e.input,e.index+e[0].length,t)?"":"(?:)"}function E(e){return parseInt(e,10).toString(16)}function I(e,u){return p.call(e)==="[object "+u+"]"}function S(e){for(;e.length<4;)e="0"+e;return e}function A(e){var u={};return I(e,"String")?(C.forEach(e,/[^\s,]+/,(function(e){u[e]=!0})),u):e}function k(e){if(!/^[\w$]$/.test(e))throw new Error("Flag must be a single character A-Za-z0-9_$");b[e]=!0}function O(e,u,t,n,d){for(var r=o.length,a=e[t],c=null,i=void 0,f=void 0;r--;)if(!((f=o[r]).leadChar&&f.leadChar!==a||f.scope!==n&&"all"!==f.scope||f.flag&&-1===u.indexOf(f.flag))&&(i=C.exec(e,f.regex,t,"sticky"))){c={matchLength:i[0].length,output:f.handler.call(d,i,n,u),reparse:f.reparse};break}return c}function j(e){n.astral=e}function N(e){if(null==e)throw new TypeError("Cannot convert null or undefined to object");return e}function C(e,u){if(C.isRegExp(e)){if(void 0!==u)throw new TypeError("Cannot supply flags when copying a RegExp");return _(e)}if(e=void 0===e?"":String(e),u=void 0===u?"":String(u),C.isInstalled("astral")&&-1===u.indexOf("A")&&(u+="A"),c[e]||(c[e]={}),!c[e][u]){for(var t={hasNamedCapture:!1,captureNames:[]},n="default",r="",a=0,o=void 0,f=function(e,u){var t=void 0;if(g(u)!==u)throw new SyntaxError("Invalid duplicate regex flag "+u);for(e=d.replace.call(e,/^\(\?([\w$]+)\)/,(function(e,t){if(d.test.call(/[gy]/,t))throw new SyntaxError("Cannot use flag g or y in mode modifier "+e);return u=g(u+t),""})),t=0;t"}else if(t)return"\\"+(+t+a);return e}if(!I(e,"Array")||!e.length)throw new TypeError("Must provide a nonempty array of patterns to merge");for(var i=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,f=[],l=void 0,s=0;s1&&-1!==t.indexOf("")){var n=_(this,{removeG:!0,isInternalOnly:!0});d.replace.call(String(e).slice(t.index),n,(function(){for(var e=arguments.length,u=Array(e),n=0;nt.index&&(this.lastIndex=t.index)}return this.global||(this.lastIndex=u),t},r.test=function(e){return!!r.exec.call(this,e)},r.match=function(e){if(C.isRegExp(e)){if(e.global){var u=d.match.apply(this,arguments);return e.lastIndex=0,u}}else e=new RegExp(e);return r.exec.call(e,N(this))},r.replace=function(e,u){var t=C.isRegExp(e),n=void 0,r=void 0,a=void 0;return t?(e.xregexp&&(r=e.xregexp.captureNames),n=e.lastIndex):e+="",a=I(u,"Function")?d.replace.call(String(this),e,(function(){for(var n=arguments.length,d=Array(n),a=0;at.length-3)throw new SyntaxError("Backreference to undefined group "+e);return t[d]||""}throw new SyntaxError("Invalid token "+e)}})),t&&(e.global?e.lastIndex=0:e.lastIndex=n),a},r.split=function(e,u){if(!C.isRegExp(e))return d.split.apply(this,arguments);var t=String(this),n=[],r=e.lastIndex,a=0,c=void 0;return u=(void 0===u?-1:u)>>>0,C.forEach(t,e,(function(e){e.index+e[0].length>a&&(n.push(t.slice(a,e.index)),e.length>1&&e.indexu?n.slice(0,u):n},C.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,(function(e,u){if("B"===e[1]&&"default"===u)return e[0];throw new SyntaxError("Invalid escape "+e[0])}),{scope:"all",leadChar:"\\"}),C.addToken(/\\u{([\dA-Fa-f]+)}/,(function(e,u,t){var n=x(e[1]);if(n>1114111)throw new SyntaxError("Invalid Unicode code point "+e[0]);if(n<=65535)return"\\u"+S(E(n));if(h&&-1!==t.indexOf("u"))return e[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u")}),{scope:"all",leadChar:"\\"}),C.addToken(/\[(\^?)\]/,(function(e){return e[1]?"[\\s\\S]":"\\b\\B"}),{leadChar:"["}),C.addToken(/\(\?#[^)]*\)/,w,{leadChar:"("}),C.addToken(/\s+|#[^\n]*\n?/,w,{flag:"x"}),C.addToken(/\./,(function(){return"[\\s\\S]"}),{flag:"s",leadChar:"."}),C.addToken(/\\k<([\w$]+)>/,(function(e){var u=isNaN(e[1])?this.captureNames.indexOf(e[1])+1:+e[1],t=e.index+e[0].length;if(!u||u>this.captureNames.length)throw new SyntaxError("Backreference to undefined group "+e[0]);return"\\"+u+(t===e.input.length||isNaN(e.input[t])?"":"(?:)")}),{leadChar:"\\"}),C.addToken(/\\(\d+)/,(function(e,u){if(!("default"===u&&/^[1-9]/.test(e[1])&&+e[1]<=this.captureNames.length)&&"0"!==e[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group "+e[0]);return e[0]}),{scope:"all",leadChar:"\\"}),C.addToken(/\(\?P?<([\w$]+)>/,(function(e){if(!isNaN(e[1]))throw new SyntaxError("Cannot use integer as capture name "+e[0]);if("length"===e[1]||"__proto__"===e[1])throw new SyntaxError("Cannot use reserved word as capture name "+e[0]);if(-1!==this.captureNames.indexOf(e[1]))throw new SyntaxError("Cannot use same name for multiple groups "+e[0]);return this.captureNames.push(e[1]),this.hasNamedCapture=!0,"("}),{leadChar:"("}),C.addToken(/\((?!\?)/,(function(e,u,t){return-1!==t.indexOf("n")?"(?:":(this.captureNames.push(null),"(")}),{optionalFlags:"n",leadChar:"("}),u.default=C,e.exports=u.default},536:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){var u=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,t=e.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,u],"g",{conjunction:"or"});function n(e){var u=/^(?:\(\?:\))*\^/,t=/\$(?:\(\?:\))*$/;return u.test(e)&&t.test(e)&&t.test(e.replace(/\\[\s\S]/g,""))?e.replace(u,"").replace(t,""):e}function d(u,t){var n=t?"x":"";return e.isRegExp(u)?u.xregexp&&u.xregexp.captureNames?u:e(u.source,n):e(u,n)}function r(u){return u instanceof RegExp?u:e.escape(u)}function a(e,u,t){return e["subpattern"+t]=u,e}function c(e,u,t){return e+(u1?n-1:0),o=1;o"):o="(?:",h=m,""+o+f[a].pattern.replace(u,(function(e,u,t){if(u){if(c=f[a].names[m-h],++m,c)return"(?<"+c+">"}else if(t)return i=+t-1,f[a].names[i]?"\\k<"+f[a].names[i]+">":"\\"+(+t+h);return e}))+")"}if(d){if(c=y[v],b[++v]=++m,c)return"(?<"+c+">"}else if(r)return y[i=+r-1]?"\\k<"+y[i]+">":"\\"+b[+r];return e}));return e(g,c)}},e.exports=u.default},537:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){function u(e,u,t,n){return{name:e,value:u,start:t,end:n}}e.matchRecursive=function(t,n,d,r,a){a=a||{};var c=-1!==(r=r||"").indexOf("g"),o=-1!==r.indexOf("y"),i=r.replace(/y/g,""),f=a.escapeChar,l=a.valueNames,s=[],p=0,m=0,h=0,v=0,b=void 0,y=void 0,g=void 0,_=void 0,x=void 0;if(n=e(n,i),d=e(d,i),f){if(f.length>1)throw new Error("Cannot use more than one escape character");f=e.escape(f),x=new RegExp("(?:"+f+"[\\S\\s]|(?:(?!"+e.union([n,d],"",{conjunction:"or"}).source+")[^"+f+"])+)+",r.replace(/[^imu]+/g,""))}for(;;){if(f&&(h+=(e.exec(t,x,h,"sticky")||[""])[0].length),g=e.exec(t,n,h),_=e.exec(t,d,h),g&&_&&(g.index<=_.index?_=null:g=null),g||_)h=(m=(g||_).index)+(g||_)[0].length;else if(!p)break;if(o&&!p&&m>v)break;if(g)p||(b=m,y=h),++p;else{if(!_||!p)throw new Error("Unbalanced delimiter found in string");if(!--p&&(l?(l[0]&&b>v&&s.push(u(l[0],t.slice(v,b),v,b)),l[1]&&s.push(u(l[1],t.slice(b,y),b,y)),l[2]&&s.push(u(l[2],t.slice(y,m),y,m)),l[3]&&s.push(u(l[3],t.slice(m,h),m,h))):s.push(t.slice(y,m)),v=h,!c))break}m===h&&++h}return c&&!o&&l&&l[0]&&t.length>v&&s.push(u(l[0],t.slice(v),v,t.length)),s}},e.exports=u.default},538:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){var u={},t=e._dec,n=e._hex,d=e._pad4;function r(e){return e.replace(/[- _]+/g,"").toLowerCase()}function a(e){var u=/^\\[xu](.+)/.exec(e);return u?t(u[1]):e.charCodeAt("\\"===e[0]?1:0)}function c(t){var r,c,o;return u[t]["b!"]||(u[t]["b!"]=(r=u[t].bmp,c="",o=-1,e.forEach(r,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,(function(e){var u=a(e[1]);u>o+1&&(c+="\\u"+d(n(o+1)),u>o+2&&(c+="-\\u"+d(n(u-1)))),o=a(e[2]||e[1])})),o<65535&&(c+="\\u"+d(n(o+1)),o<65534&&(c+="-\\uFFFF")),c))}function o(e,t){var n=t?"a!":"a=";return u[e][n]||(u[e][n]=function(e,t){var n=u[e],d="";return n.bmp&&!n.isBmpLast&&(d="["+n.bmp+"]"+(n.astral?"|":"")),n.astral&&(d+=n.astral),n.isBmpLast&&n.bmp&&(d+=(n.astral?"|":"")+"["+n.bmp+"]"),t?"(?:(?!"+d+")(?:[\ud800-\udbff][\udc00-\udfff]|[\0-\uffff]))":"(?:"+d+")"}(e,t))}e.addToken(/\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/,(function(e,t,n){var d="P"===e[1]||!!e[2],a=-1!==n.indexOf("A"),i=r(e[4]||e[3]),f=u[i];if("P"===e[1]&&e[2])throw new SyntaxError("Invalid double negation "+e[0]);if(!u.hasOwnProperty(i))throw new SyntaxError("Unknown Unicode token "+e[0]);if(f.inverseOf){if(i=r(f.inverseOf),!u.hasOwnProperty(i))throw new ReferenceError("Unicode token missing data "+e[0]+" -> "+f.inverseOf);f=u[i],d=!d}if(!f.bmp&&!a)throw new SyntaxError("Astral mode required for Unicode token "+e[0]);if(a){if("class"===t)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");return o(i,d)}return"class"===t?d?c(i):f.bmp:(d?"[^":"[")+f.bmp+"]"}),{scope:"all",optionalFlags:"A",leadChar:"\\"}),e.addUnicodeData=function(t){for(var n=void 0,d=0;d\\x5E`\\x7C~\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20be\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83b[\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\x24\xa2-\xa5\u058f\u060b\u09f2\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20be\ua838\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\x5E`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u309b\u309c\ua700-\ua716\ua720\ua721\ua789\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3",astral:"\ud83c[\udffb-\udfff]"},{name:"Sm",alias:"Math_Symbol",bmp:"\\x2B<->\\x7C~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec",astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"\xa6\xa9\xae\xb0\u0482\u058d\u058e\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u214a\u214c\u214d\u214f\u218a\u218b\u2195-\u2199\u219c-\u219f\u21a1\u21a2\u21a4\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udffa]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Z",alias:"Separator",bmp:" \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:" \xa0\u1680\u2000-\u200a\u202f\u205f\u3000"}])},e.exports=u.default},541:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");var u=[{name:"ASCII",bmp:"\0-\x7f"},{name:"Alphabetic",bmp:"A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0345\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05b0-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0657\u0659-\u065f\u066e-\u06d3\u06d5-\u06dc\u06e1-\u06e8\u06ed-\u06ef\u06fa-\u06fc\u06ff\u0710-\u073f\u074d-\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0817\u081a-\u082c\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08df\u08e3-\u08e9\u08f0-\u093b\u093d-\u094c\u094e-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c4\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac5\u0ac7-\u0ac9\u0acb\u0acc\u0ad0\u0ae0-\u0ae3\u0af9\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d-\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4c\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccc\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e46\u0e4d\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ecd\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f71-\u0f81\u0f88-\u0f97\u0f99-\u0fbc\u1000-\u1036\u1038\u103b-\u103f\u1050-\u1062\u1065-\u1068\u106e-\u1086\u108e\u109c\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135f\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17b3\u17b6-\u17c8\u17d7\u17dc\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u1938\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a61-\u1a74\u1aa7\u1b00-\u1b33\u1b35-\u1b43\u1b45-\u1b4b\u1b80-\u1ba9\u1bac-\u1baf\u1bba-\u1be5\u1be7-\u1bf1\u1c00-\u1c35\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1de7-\u1df4\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua674-\ua67b\ua67f-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua827\ua840-\ua873\ua880-\ua8c3\ua8c5\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua92a\ua930-\ua952\ua960-\ua97c\ua980-\ua9b2\ua9b4-\ua9bf\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a\uaa7e-\uaabe\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc00-\udc45\udc82-\udcb8\udcd0-\udce8\udd00-\udd32\udd50-\udd72\udd76\udd80-\uddbf\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude34\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udee8\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d-\udf44\udf47\udf48\udf4b\udf4c\udf50\udf57\udf5d-\udf63]|\ud805[\udc00-\udc41\udc43-\udc45\udc47-\udc4a\udc80-\udcc1\udcc4\udcc5\udcc7\udd80-\uddb5\uddb8-\uddbe\uddd8-\udddd\ude00-\ude3e\ude40\ude44\ude80-\udeb5\udf00-\udf19\udf1d-\udf2a]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc3e\udc40\udc72-\udc8f\udc92-\udca7\udca9-\udcb6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf36\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9e]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd47]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Any",isBmpLast:!0,bmp:"\0-\uffff",astral:"[\ud800-\udbff][\udc00-\udfff]"},{name:"Default_Ignorable_Code_Point",bmp:"\xad\u034f\u061c\u115f\u1160\u17b4\u17b5\u180b-\u180e\u200b-\u200f\u202a-\u202e\u2060-\u206f\u3164\ufe00-\ufe0f\ufeff\uffa0\ufff0-\ufff8",astral:"\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|[\udb40-\udb43][\udc00-\udfff]"},{name:"Lowercase",bmp:"a-z\xaa\xb5\xba\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02b8\u02c0\u02c1\u02e0-\u02e4\u0345\u0371\u0373\u0377\u037a-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0561-\u0587\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1dbf\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u2071\u207f\u2090-\u209c\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2170-\u217f\u2184\u24d0-\u24e9\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7d\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b-\ua69d\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7b5\ua7b7\ua7f8-\ua7fa\uab30-\uab5a\uab5c-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a",astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud83a[\udd22-\udd43]"},{name:"Noncharacter_Code_Point",bmp:"\ufdd0-\ufdef\ufffe\uffff",astral:"[\ud83f\ud87f\ud8bf\ud8ff\ud93f\ud97f\ud9bf\ud9ff\uda3f\uda7f\udabf\udaff\udb3f\udb7f\udbbf\udbff][\udffe\udfff]"},{name:"Uppercase",bmp:"A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2160-\u216f\u2183\u24b6-\u24cf\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\uff21-\uff3a",astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]"},{name:"White_Space",bmp:"\t-\r \x85\xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"}];u.push({name:"Assigned",inverseOf:"Cn"}),e.addUnicodeData(u)},e.exports=u.default},542:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");e.addUnicodeData([{name:"Adlam",astral:"\ud83a[\udd00-\udd4a\udd50-\udd59\udd5e\udd5f]"},{name:"Ahom",astral:"\ud805[\udf00-\udf19\udf1d-\udf2b\udf30-\udf3f]"},{name:"Anatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude46]"},{name:"Arabic",bmp:"\u0600-\u0604\u0606-\u060b\u060d-\u061a\u061e\u0620-\u063f\u0641-\u064a\u0656-\u066f\u0671-\u06dc\u06de-\u06ff\u0750-\u077f\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08e1\u08e3-\u08ff\ufb50-\ufbc1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfd\ufe70-\ufe74\ufe76-\ufefc",astral:"\ud803[\ude60-\ude7e]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb\udef0\udef1]"},{name:"Armenian",bmp:"\u0531-\u0556\u0559-\u055f\u0561-\u0587\u058a\u058d-\u058f\ufb13-\ufb17"},{name:"Avestan",astral:"\ud802[\udf00-\udf35\udf39-\udf3f]"},{name:"Balinese",bmp:"\u1b00-\u1b4b\u1b50-\u1b7c"},{name:"Bamum",bmp:"\ua6a0-\ua6f7",astral:"\ud81a[\udc00-\ude38]"},{name:"Bassa_Vah",astral:"\ud81a[\uded0-\udeed\udef0-\udef5]"},{name:"Batak",bmp:"\u1bc0-\u1bf3\u1bfc-\u1bff"},{name:"Bengali",bmp:"\u0980-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09fb"},{name:"Bhaiksuki",astral:"\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc45\udc50-\udc6c]"},{name:"Bopomofo",bmp:"\u02ea\u02eb\u3105-\u312d\u31a0-\u31ba"},{name:"Brahmi",astral:"\ud804[\udc00-\udc4d\udc52-\udc6f\udc7f]"},{name:"Braille",bmp:"\u2800-\u28ff"},{name:"Buginese",bmp:"\u1a00-\u1a1b\u1a1e\u1a1f"},{name:"Buhid",bmp:"\u1740-\u1753"},{name:"Canadian_Aboriginal",bmp:"\u1400-\u167f\u18b0-\u18f5"},{name:"Carian",astral:"\ud800[\udea0-\uded0]"},{name:"Caucasian_Albanian",astral:"\ud801[\udd30-\udd63\udd6f]"},{name:"Chakma",astral:"\ud804[\udd00-\udd34\udd36-\udd43]"},{name:"Cham",bmp:"\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f"},{name:"Cherokee",bmp:"\u13a0-\u13f5\u13f8-\u13fd\uab70-\uabbf"},{name:"Common",bmp:"\0-@\\x5B-`\\x7B-\xa9\xab-\xb9\xbb-\xbf\xd7\xf7\u02b9-\u02df\u02e5-\u02e9\u02ec-\u02ff\u0374\u037e\u0385\u0387\u0589\u0605\u060c\u061b\u061c\u061f\u0640\u06dd\u08e2\u0964\u0965\u0e3f\u0fd5-\u0fd8\u10fb\u16eb-\u16ed\u1735\u1736\u1802\u1803\u1805\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u2000-\u200b\u200e-\u2064\u2066-\u2070\u2074-\u207e\u2080-\u208e\u20a0-\u20be\u2100-\u2125\u2127-\u2129\u212c-\u2131\u2133-\u214d\u214f-\u215f\u2189-\u218b\u2190-\u23fe\u2400-\u2426\u2440-\u244a\u2460-\u27ff\u2900-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2e00-\u2e44\u2ff0-\u2ffb\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303c-\u303f\u309b\u309c\u30a0\u30fb\u30fc\u3190-\u319f\u31c0-\u31e3\u3220-\u325f\u327f-\u32cf\u3358-\u33ff\u4dc0-\u4dff\ua700-\ua721\ua788-\ua78a\ua830-\ua839\ua92e\ua9cf\uab5b\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe66\ufe68-\ufe6b\ufeff\uff01-\uff20\uff3b-\uff40\uff5b-\uff65\uff70\uff9e\uff9f\uffe0-\uffe6\uffe8-\uffee\ufff9-\ufffd",astral:"\ud800[\udd00-\udd02\udd07-\udd33\udd37-\udd3f\udd90-\udd9b\uddd0-\uddfc\udee1-\udefb]|\ud82f[\udca0-\udca3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd66\udd6a-\udd7a\udd83\udd84\udd8c-\udda9\uddae-\udde8\udf00-\udf56\udf60-\udf71]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udfcb\udfce-\udfff]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd00-\udd0c\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\uddff\ude01\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|\udb40[\udc01\udc20-\udc7f]"},{name:"Coptic",bmp:"\u03e2-\u03ef\u2c80-\u2cf3\u2cf9-\u2cff"},{name:"Cuneiform",astral:"\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc70-\udc74\udc80-\udd43]"},{name:"Cypriot",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f]"},{name:"Cyrillic",bmp:"\u0400-\u0484\u0487-\u052f\u1c80-\u1c88\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f"},{name:"Deseret",astral:"\ud801[\udc00-\udc4f]"},{name:"Devanagari",bmp:"\u0900-\u0950\u0953-\u0963\u0966-\u097f\ua8e0-\ua8fd"},{name:"Duployan",astral:"\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9c-\udc9f]"},{name:"Egyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]"},{name:"Elbasan",astral:"\ud801[\udd00-\udd27]"},{name:"Ethiopic",bmp:"\u1200-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u137c\u1380-\u1399\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e"},{name:"Georgian",bmp:"\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u10ff\u2d00-\u2d25\u2d27\u2d2d"},{name:"Glagolitic",bmp:"\u2c00-\u2c2e\u2c30-\u2c5e",astral:"\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]"},{name:"Gothic",astral:"\ud800[\udf30-\udf4a]"},{name:"Grantha",astral:"\ud804[\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3c-\udf44\udf47\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]"},{name:"Greek",bmp:"\u0370-\u0373\u0375-\u0377\u037a-\u037d\u037f\u0384\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03e1\u03f0-\u03ff\u1d26-\u1d2a\u1d5d-\u1d61\u1d66-\u1d6a\u1dbf\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2126\uab65",astral:"\ud800[\udd40-\udd8e\udda0]|\ud834[\ude00-\ude45]"},{name:"Gujarati",bmp:"\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0af1\u0af9"},{name:"Gurmukhi",bmp:"\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75"},{name:"Han",bmp:"\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u3005\u3007\u3021-\u3029\u3038-\u303b\u3400-\u4db5\u4e00-\u9fd5\uf900-\ufa6d\ufa70-\ufad9",astral:"[\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Hangul",bmp:"\u1100-\u11ff\u302e\u302f\u3131-\u318e\u3200-\u321e\u3260-\u327e\ua960-\ua97c\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"},{name:"Hanunoo",bmp:"\u1720-\u1734"},{name:"Hatran",astral:"\ud802[\udce0-\udcf2\udcf4\udcf5\udcfb-\udcff]"},{name:"Hebrew",bmp:"\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufb4f"},{name:"Hiragana",bmp:"\u3041-\u3096\u309d-\u309f",astral:"\ud82c\udc01|\ud83c\ude00"},{name:"Imperial_Aramaic",astral:"\ud802[\udc40-\udc55\udc57-\udc5f]"},{name:"Inherited",bmp:"\u0300-\u036f\u0485\u0486\u064b-\u0655\u0670\u0951\u0952\u1ab0-\u1abe\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u200c\u200d\u20d0-\u20f0\u302a-\u302d\u3099\u309a\ufe00-\ufe0f\ufe20-\ufe2d",astral:"\ud800[\uddfd\udee0]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad]|\udb40[\udd00-\uddef]"},{name:"Inscriptional_Pahlavi",astral:"\ud802[\udf60-\udf72\udf78-\udf7f]"},{name:"Inscriptional_Parthian",astral:"\ud802[\udf40-\udf55\udf58-\udf5f]"},{name:"Javanese",bmp:"\ua980-\ua9cd\ua9d0-\ua9d9\ua9de\ua9df"},{name:"Kaithi",astral:"\ud804[\udc80-\udcc1]"},{name:"Kannada",bmp:"\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2"},{name:"Katakana",bmp:"\u30a1-\u30fa\u30fd-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff6f\uff71-\uff9d",astral:"\ud82c\udc00"},{name:"Kayah_Li",bmp:"\ua900-\ua92d\ua92f"},{name:"Kharoshthi",astral:"\ud802[\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f-\ude47\ude50-\ude58]"},{name:"Khmer",bmp:"\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9\u19e0-\u19ff"},{name:"Khojki",astral:"\ud804[\ude00-\ude11\ude13-\ude3e]"},{name:"Khudawadi",astral:"\ud804[\udeb0-\udeea\udef0-\udef9]"},{name:"Lao",bmp:"\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf"},{name:"Latin",bmp:"A-Za-z\xaa\xba\xc0-\xd6\xd8-\xf6\xf8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua7ff\uab30-\uab5a\uab5c-\uab64\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a"},{name:"Lepcha",bmp:"\u1c00-\u1c37\u1c3b-\u1c49\u1c4d-\u1c4f"},{name:"Limbu",bmp:"\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1940\u1944-\u194f"},{name:"Linear_A",astral:"\ud801[\ude00-\udf36\udf40-\udf55\udf60-\udf67]"},{name:"Linear_B",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa]"},{name:"Lisu",bmp:"\ua4d0-\ua4ff"},{name:"Lycian",astral:"\ud800[\ude80-\ude9c]"},{name:"Lydian",astral:"\ud802[\udd20-\udd39\udd3f]"},{name:"Mahajani",astral:"\ud804[\udd50-\udd76]"},{name:"Malayalam",bmp:"\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4f\u0d54-\u0d63\u0d66-\u0d7f"},{name:"Mandaic",bmp:"\u0840-\u085b\u085e"},{name:"Manichaean",astral:"\ud802[\udec0-\udee6\udeeb-\udef6]"},{name:"Marchen",astral:"\ud807[\udc70-\udc8f\udc92-\udca7\udca9-\udcb6]"},{name:"Meetei_Mayek",bmp:"\uaae0-\uaaf6\uabc0-\uabed\uabf0-\uabf9"},{name:"Mende_Kikakui",astral:"\ud83a[\udc00-\udcc4\udcc7-\udcd6]"},{name:"Meroitic_Cursive",astral:"\ud802[\udda0-\uddb7\uddbc-\uddcf\uddd2-\uddff]"},{name:"Meroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"Miao",astral:"\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]"},{name:"Modi",astral:"\ud805[\ude00-\ude44\ude50-\ude59]"},{name:"Mongolian",bmp:"\u1800\u1801\u1804\u1806-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18aa",astral:"\ud805[\ude60-\ude6c]"},{name:"Mro",astral:"\ud81a[\ude40-\ude5e\ude60-\ude69\ude6e\ude6f]"},{name:"Multani",astral:"\ud804[\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea9]"},{name:"Myanmar",bmp:"\u1000-\u109f\ua9e0-\ua9fe\uaa60-\uaa7f"},{name:"Nabataean",astral:"\ud802[\udc80-\udc9e\udca7-\udcaf]"},{name:"New_Tai_Lue",bmp:"\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de\u19df"},{name:"Newa",astral:"\ud805[\udc00-\udc59\udc5b\udc5d]"},{name:"Nko",bmp:"\u07c0-\u07fa"},{name:"Ogham",bmp:"\u1680-\u169c"},{name:"Ol_Chiki",bmp:"\u1c50-\u1c7f"},{name:"Old_Hungarian",astral:"\ud803[\udc80-\udcb2\udcc0-\udcf2\udcfa-\udcff]"},{name:"Old_Italic",astral:"\ud800[\udf00-\udf23]"},{name:"Old_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"Old_Permic",astral:"\ud800[\udf50-\udf7a]"},{name:"Old_Persian",astral:"\ud800[\udfa0-\udfc3\udfc8-\udfd5]"},{name:"Old_South_Arabian",astral:"\ud802[\ude60-\ude7f]"},{name:"Old_Turkic",astral:"\ud803[\udc00-\udc48]"},{name:"Oriya",bmp:"\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b77"},{name:"Osage",astral:"\ud801[\udcb0-\udcd3\udcd8-\udcfb]"},{name:"Osmanya",astral:"\ud801[\udc80-\udc9d\udca0-\udca9]"},{name:"Pahawh_Hmong",astral:"\ud81a[\udf00-\udf45\udf50-\udf59\udf5b-\udf61\udf63-\udf77\udf7d-\udf8f]"},{name:"Palmyrene",astral:"\ud802[\udc60-\udc7f]"},{name:"Pau_Cin_Hau",astral:"\ud806[\udec0-\udef8]"},{name:"Phags_Pa",bmp:"\ua840-\ua877"},{name:"Phoenician",astral:"\ud802[\udd00-\udd1b\udd1f]"},{name:"Psalter_Pahlavi",astral:"\ud802[\udf80-\udf91\udf99-\udf9c\udfa9-\udfaf]"},{name:"Rejang",bmp:"\ua930-\ua953\ua95f"},{name:"Runic",bmp:"\u16a0-\u16ea\u16ee-\u16f8"},{name:"Samaritan",bmp:"\u0800-\u082d\u0830-\u083e"},{name:"Saurashtra",bmp:"\ua880-\ua8c5\ua8ce-\ua8d9"},{name:"Sharada",astral:"\ud804[\udd80-\uddcd\uddd0-\udddf]"},{name:"Shavian",astral:"\ud801[\udc50-\udc7f]"},{name:"Siddham",astral:"\ud805[\udd80-\uddb5\uddb8-\udddd]"},{name:"SignWriting",astral:"\ud836[\udc00-\ude8b\ude9b-\ude9f\udea1-\udeaf]"},{name:"Sinhala",bmp:"\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4",astral:"\ud804[\udde1-\uddf4]"},{name:"Sora_Sompeng",astral:"\ud804[\udcd0-\udce8\udcf0-\udcf9]"},{name:"Sundanese",bmp:"\u1b80-\u1bbf\u1cc0-\u1cc7"},{name:"Syloti_Nagri",bmp:"\ua800-\ua82b"},{name:"Syriac",bmp:"\u0700-\u070d\u070f-\u074a\u074d-\u074f"},{name:"Tagalog",bmp:"\u1700-\u170c\u170e-\u1714"},{name:"Tagbanwa",bmp:"\u1760-\u176c\u176e-\u1770\u1772\u1773"},{name:"Tai_Le",bmp:"\u1950-\u196d\u1970-\u1974"},{name:"Tai_Tham",bmp:"\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad"},{name:"Tai_Viet",bmp:"\uaa80-\uaac2\uaadb-\uaadf"},{name:"Takri",astral:"\ud805[\ude80-\udeb7\udec0-\udec9]"},{name:"Tamil",bmp:"\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bfa"},{name:"Tangut",astral:"\ud81b\udfe0|[\ud81c-\ud820][\udc00-\udfff]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]"},{name:"Telugu",bmp:"\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f"},{name:"Thaana",bmp:"\u0780-\u07b1"},{name:"Thai",bmp:"\u0e01-\u0e3a\u0e40-\u0e5b"},{name:"Tibetan",bmp:"\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc\u0fce-\u0fd4\u0fd9\u0fda"},{name:"Tifinagh",bmp:"\u2d30-\u2d67\u2d6f\u2d70\u2d7f"},{name:"Tirhuta",astral:"\ud805[\udc80-\udcc7\udcd0-\udcd9]"},{name:"Ugaritic",astral:"\ud800[\udf80-\udf9d\udf9f]"},{name:"Vai",bmp:"\ua500-\ua62b"},{name:"Warang_Citi",astral:"\ud806[\udca0-\udcf2\udcff]"},{name:"Yi",bmp:"\ua000-\ua48c\ua490-\ua4c6"}])},e.exports=u.default},543:function(e,u,t){"use strict";var n=t(0),d=t.n(n);u.a=function(e){var u=e.text;return d.a.createElement("section",{className:"empty"},d.a.createElement("div",{className:"icon"},d.a.createElement("img",{src:"/img/logo-square.svg",alt:"The Qovery Logo"})),d.a.createElement("div",{className:"text"},u))}},544:function(e,u,t){"use strict";var n=t(545),d=t(555),r=t(511);e.exports={formats:r,parse:d,stringify:n}},545:function(e,u,t){"use strict";var n=t(546),d=t(518),r=t(511),a=Object.prototype.hasOwnProperty,c={brackets:function(e){return e+"[]"},comma:"comma",indices:function(e,u){return e+"["+u+"]"},repeat:function(e){return e}},o=Array.isArray,i=String.prototype.split,f=Array.prototype.push,l=function(e,u){f.apply(e,o(u)?u:[u])},s=Date.prototype.toISOString,p=r.default,m={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:d.encode,encodeValuesOnly:!1,format:p,formatter:r.formatters[p],indices:!1,serializeDate:function(e){return s.call(e)},skipNulls:!1,strictNullHandling:!1},h={},v=function e(u,t,r,a,c,f,s,p,v,b,y,g,_,x,w,E){for(var I,S=u,A=E,k=0,O=!1;void 0!==(A=A.get(h))&&!O;){var j=A.get(u);if(k+=1,void 0!==j){if(j===k)throw new RangeError("Cyclic object value");O=!0}void 0===A.get(h)&&(k=0)}if("function"==typeof p?S=p(t,S):S instanceof Date?S=y(S):"comma"===r&&o(S)&&(S=d.maybeMap(S,(function(e){return e instanceof Date?y(e):e}))),null===S){if(c)return s&&!x?s(t,m.encoder,w,"key",g):t;S=""}if("string"==typeof(I=S)||"number"==typeof I||"boolean"==typeof I||"symbol"==typeof I||"bigint"==typeof I||d.isBuffer(S)){if(s){var N=x?t:s(t,m.encoder,w,"key",g);if("comma"===r&&x){for(var C=i.call(String(S),","),P="",T=0;T0?S.join(",")||null:void 0}];else if(o(p))M=p;else{var L=Object.keys(S);M=v?L.sort(v):L}for(var F=a&&o(S)&&1===S.length?t+"[]":t,B=0;B0?x+_:""}},546:function(e,u,t){"use strict";var n=t(509),d=t(551),r=t(553),a=n("%TypeError%"),c=n("%WeakMap%",!0),o=n("%Map%",!0),i=d("WeakMap.prototype.get",!0),f=d("WeakMap.prototype.set",!0),l=d("WeakMap.prototype.has",!0),s=d("Map.prototype.get",!0),p=d("Map.prototype.set",!0),m=d("Map.prototype.has",!0),h=function(e,u){for(var t,n=e;null!==(t=n.next);n=t)if(t.key===u)return n.next=t.next,t.next=e.next,e.next=t,t};e.exports=function(){var e,u,t,n={assert:function(e){if(!n.has(e))throw new a("Side channel does not contain "+r(e))},get:function(n){if(c&&n&&("object"==typeof n||"function"==typeof n)){if(e)return i(e,n)}else if(o){if(u)return s(u,n)}else if(t)return function(e,u){var t=h(e,u);return t&&t.value}(t,n)},has:function(n){if(c&&n&&("object"==typeof n||"function"==typeof n)){if(e)return l(e,n)}else if(o){if(u)return m(u,n)}else if(t)return function(e,u){return!!h(e,u)}(t,n);return!1},set:function(n,d){c&&n&&("object"==typeof n||"function"==typeof n)?(e||(e=new c),f(e,n,d)):o?(u||(u=new o),p(u,n,d)):(t||(t={key:{},next:null}),function(e,u,t){var n=h(e,u);n?n.value=t:e.next={key:u,next:e.next,value:t}}(t,n,d))}};return n}},547:function(e,u,t){"use strict";var n="undefined"!=typeof Symbol&&Symbol,d=t(548);e.exports=function(){return"function"==typeof n&&("function"==typeof Symbol&&("symbol"==typeof n("foo")&&("symbol"==typeof Symbol("bar")&&d())))}},548:function(e,u,t){"use strict";e.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var e={},u=Symbol("test"),t=Object(u);if("string"==typeof u)return!1;if("[object Symbol]"!==Object.prototype.toString.call(u))return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;for(u in e[u]=42,e)return!1;if("function"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var n=Object.getOwnPropertySymbols(e);if(1!==n.length||n[0]!==u)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,u))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var d=Object.getOwnPropertyDescriptor(e,u);if(42!==d.value||!0!==d.enumerable)return!1}return!0}},549:function(e,u,t){"use strict";var n="Function.prototype.bind called on incompatible ",d=Array.prototype.slice,r=Object.prototype.toString;e.exports=function(e){var u=this;if("function"!=typeof u||"[object Function]"!==r.call(u))throw new TypeError(n+u);for(var t,a=d.call(arguments,1),c=function(){if(this instanceof t){var n=u.apply(this,a.concat(d.call(arguments)));return Object(n)===n?n:this}return u.apply(e,a.concat(d.call(arguments)))},o=Math.max(0,u.length-a.length),i=[],f=0;f-1?d(t):t}},552:function(e,u,t){"use strict";var n=t(510),d=t(509),r=d("%Function.prototype.apply%"),a=d("%Function.prototype.call%"),c=d("%Reflect.apply%",!0)||n.call(a,r),o=d("%Object.getOwnPropertyDescriptor%",!0),i=d("%Object.defineProperty%",!0),f=d("%Math.max%");if(i)try{i({},"a",{value:1})}catch(s){i=null}e.exports=function(e){var u=c(n,a,arguments);if(o&&i){var t=o(u,"length");t.configurable&&i(u,"length",{value:1+f(0,e.length-(arguments.length-1))})}return u};var l=function(){return c(n,r,arguments)};i?i(e.exports,"apply",{value:l}):e.exports.apply=l},553:function(e,u,t){var n="function"==typeof Map&&Map.prototype,d=Object.getOwnPropertyDescriptor&&n?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,r=n&&d&&"function"==typeof d.get?d.get:null,a=n&&Map.prototype.forEach,c="function"==typeof Set&&Set.prototype,o=Object.getOwnPropertyDescriptor&&c?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,i=c&&o&&"function"==typeof o.get?o.get:null,f=c&&Set.prototype.forEach,l="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,s="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,p="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,m=Boolean.prototype.valueOf,h=Object.prototype.toString,v=Function.prototype.toString,b=String.prototype.match,y=String.prototype.slice,g=String.prototype.replace,_=String.prototype.toUpperCase,x=String.prototype.toLowerCase,w=RegExp.prototype.test,E=Array.prototype.concat,I=Array.prototype.join,S=Array.prototype.slice,A=Math.floor,k="function"==typeof BigInt?BigInt.prototype.valueOf:null,O=Object.getOwnPropertySymbols,j="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,N="function"==typeof Symbol&&"object"==typeof Symbol.iterator,C="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===N||"symbol")?Symbol.toStringTag:null,P=Object.prototype.propertyIsEnumerable,T=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(e){return e.__proto__}:null);function M(e,u){if(e===1/0||e===-1/0||e!=e||e&&e>-1e3&&e<1e3||w.call(/e/,u))return u;var t=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof e){var n=e<0?-A(-e):A(e);if(n!==e){var d=String(n),r=y.call(u,d.length+1);return g.call(d,t,"$&_")+"."+g.call(g.call(r,/([0-9]{3})/g,"$&_"),/_$/,"")}}return g.call(u,t,"$&_")}var R=t(554),L=R.custom,F=W(L)?L:null;function B(e,u,t){var n="double"===(t.quoteStyle||u)?'"':"'";return n+e+n}function D(e){return g.call(String(e),/"/g,""")}function U(e){return!("[object Array]"!==q(e)||C&&"object"==typeof e&&C in e)}function z(e){return!("[object RegExp]"!==q(e)||C&&"object"==typeof e&&C in e)}function W(e){if(N)return e&&"object"==typeof e&&e instanceof Symbol;if("symbol"==typeof e)return!0;if(!e||"object"!=typeof e||!j)return!1;try{return j.call(e),!0}catch(u){}return!1}e.exports=function e(u,t,n,d){var c=t||{};if(G(c,"quoteStyle")&&"single"!==c.quoteStyle&&"double"!==c.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(G(c,"maxStringLength")&&("number"==typeof c.maxStringLength?c.maxStringLength<0&&c.maxStringLength!==1/0:null!==c.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var o=!G(c,"customInspect")||c.customInspect;if("boolean"!=typeof o&&"symbol"!==o)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(G(c,"indent")&&null!==c.indent&&"\t"!==c.indent&&!(parseInt(c.indent,10)===c.indent&&c.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(G(c,"numericSeparator")&&"boolean"!=typeof c.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var h=c.numericSeparator;if(void 0===u)return"undefined";if(null===u)return"null";if("boolean"==typeof u)return u?"true":"false";if("string"==typeof u)return function e(u,t){if(u.length>t.maxStringLength){var n=u.length-t.maxStringLength,d="... "+n+" more character"+(n>1?"s":"");return e(y.call(u,0,t.maxStringLength),t)+d}return B(g.call(g.call(u,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,K),"single",t)}(u,c);if("number"==typeof u){if(0===u)return 1/0/u>0?"0":"-0";var _=String(u);return h?M(u,_):_}if("bigint"==typeof u){var w=String(u)+"n";return h?M(u,w):w}var A=void 0===c.depth?5:c.depth;if(void 0===n&&(n=0),n>=A&&A>0&&"object"==typeof u)return U(u)?"[Array]":"[Object]";var O=function(e,u){var t;if("\t"===e.indent)t="\t";else{if(!("number"==typeof e.indent&&e.indent>0))return null;t=I.call(Array(e.indent+1)," ")}return{base:t,prev:I.call(Array(u+1),t)}}(c,n);if(void 0===d)d=[];else if(H(d,u)>=0)return"[Circular]";function L(u,t,r){if(t&&(d=S.call(d)).push(t),r){var a={depth:c.depth};return G(c,"quoteStyle")&&(a.quoteStyle=c.quoteStyle),e(u,a,n+1,d)}return e(u,c,n+1,d)}if("function"==typeof u&&!z(u)){var $=function(e){if(e.name)return e.name;var u=b.call(v.call(e),/^function\s*([\w$]+)/);if(u)return u[1];return null}(u),X=Y(u,L);return"[Function"+($?": "+$:" (anonymous)")+"]"+(X.length>0?" { "+I.call(X,", ")+" }":"")}if(W(u)){var ee=N?g.call(String(u),/^(Symbol\(.*\))_[^)]*$/,"$1"):j.call(u);return"object"!=typeof u||N?ee:V(ee)}if(function(e){if(!e||"object"!=typeof e)return!1;if("undefined"!=typeof HTMLElement&&e instanceof HTMLElement)return!0;return"string"==typeof e.nodeName&&"function"==typeof e.getAttribute}(u)){for(var ue="<"+x.call(String(u.nodeName)),te=u.attributes||[],ne=0;ne"}if(U(u)){if(0===u.length)return"[]";var de=Y(u,L);return O&&!function(e){for(var u=0;u=0)return!1;return!0}(de)?"["+Q(de,O)+"]":"[ "+I.call(de,", ")+" ]"}if(function(e){return!("[object Error]"!==q(e)||C&&"object"==typeof e&&C in e)}(u)){var re=Y(u,L);return"cause"in Error.prototype||!("cause"in u)||P.call(u,"cause")?0===re.length?"["+String(u)+"]":"{ ["+String(u)+"] "+I.call(re,", ")+" }":"{ ["+String(u)+"] "+I.call(E.call("[cause]: "+L(u.cause),re),", ")+" }"}if("object"==typeof u&&o){if(F&&"function"==typeof u[F]&&R)return R(u,{depth:A-n});if("symbol"!==o&&"function"==typeof u.inspect)return u.inspect()}if(function(e){if(!r||!e||"object"!=typeof e)return!1;try{r.call(e);try{i.call(e)}catch(ue){return!0}return e instanceof Map}catch(u){}return!1}(u)){var ae=[];return a.call(u,(function(e,t){ae.push(L(t,u,!0)+" => "+L(e,u))})),Z("Map",r.call(u),ae,O)}if(function(e){if(!i||!e||"object"!=typeof e)return!1;try{i.call(e);try{r.call(e)}catch(u){return!0}return e instanceof Set}catch(t){}return!1}(u)){var ce=[];return f.call(u,(function(e){ce.push(L(e,u))})),Z("Set",i.call(u),ce,O)}if(function(e){if(!l||!e||"object"!=typeof e)return!1;try{l.call(e,l);try{s.call(e,s)}catch(ue){return!0}return e instanceof WeakMap}catch(u){}return!1}(u))return J("WeakMap");if(function(e){if(!s||!e||"object"!=typeof e)return!1;try{s.call(e,s);try{l.call(e,l)}catch(ue){return!0}return e instanceof WeakSet}catch(u){}return!1}(u))return J("WeakSet");if(function(e){if(!p||!e||"object"!=typeof e)return!1;try{return p.call(e),!0}catch(u){}return!1}(u))return J("WeakRef");if(function(e){return!("[object Number]"!==q(e)||C&&"object"==typeof e&&C in e)}(u))return V(L(Number(u)));if(function(e){if(!e||"object"!=typeof e||!k)return!1;try{return k.call(e),!0}catch(u){}return!1}(u))return V(L(k.call(u)));if(function(e){return!("[object Boolean]"!==q(e)||C&&"object"==typeof e&&C in e)}(u))return V(m.call(u));if(function(e){return!("[object String]"!==q(e)||C&&"object"==typeof e&&C in e)}(u))return V(L(String(u)));if(!function(e){return!("[object Date]"!==q(e)||C&&"object"==typeof e&&C in e)}(u)&&!z(u)){var oe=Y(u,L),ie=T?T(u)===Object.prototype:u instanceof Object||u.constructor===Object,fe=u instanceof Object?"":"null prototype",le=!ie&&C&&Object(u)===u&&C in u?y.call(q(u),8,-1):fe?"Object":"",se=(ie||"function"!=typeof u.constructor?"":u.constructor.name?u.constructor.name+" ":"")+(le||fe?"["+I.call(E.call([],le||[],fe||[]),": ")+"] ":"");return 0===oe.length?se+"{}":O?se+"{"+Q(oe,O)+"}":se+"{ "+I.call(oe,", ")+" }"}return String(u)};var $=Object.prototype.hasOwnProperty||function(e){return e in this};function G(e,u){return $.call(e,u)}function q(e){return h.call(e)}function H(e,u){if(e.indexOf)return e.indexOf(u);for(var t=0,n=e.length;t-1?e.split(","):e},i=function(e,u,t,n){if(e){var r=t.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e,a=/(\[[^[\]]*])/g,c=t.depth>0&&/(\[[^[\]]*])/.exec(r),i=c?r.slice(0,c.index):r,f=[];if(i){if(!t.plainObjects&&d.call(Object.prototype,i)&&!t.allowPrototypes)return;f.push(i)}for(var l=0;t.depth>0&&null!==(c=a.exec(r))&&l=0;--r){var a,c=e[r];if("[]"===c&&t.parseArrays)a=[].concat(d);else{a=t.plainObjects?Object.create(null):{};var i="["===c.charAt(0)&&"]"===c.charAt(c.length-1)?c.slice(1,-1):c,f=parseInt(i,10);t.parseArrays||""!==i?!isNaN(f)&&c!==i&&String(f)===i&&f>=0&&t.parseArrays&&f<=t.arrayLimit?(a=[])[f]=d:"__proto__"!==i&&(a[i]=d):a={0:d}}d=a}return d}(f,u,t,n)}};e.exports=function(e,u){var t=function(e){if(!e)return a;if(null!==e.decoder&&void 0!==e.decoder&&"function"!=typeof e.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var u=void 0===e.charset?a.charset:e.charset;return{allowDots:void 0===e.allowDots?a.allowDots:!!e.allowDots,allowPrototypes:"boolean"==typeof e.allowPrototypes?e.allowPrototypes:a.allowPrototypes,allowSparse:"boolean"==typeof e.allowSparse?e.allowSparse:a.allowSparse,arrayLimit:"number"==typeof e.arrayLimit?e.arrayLimit:a.arrayLimit,charset:u,charsetSentinel:"boolean"==typeof e.charsetSentinel?e.charsetSentinel:a.charsetSentinel,comma:"boolean"==typeof e.comma?e.comma:a.comma,decoder:"function"==typeof e.decoder?e.decoder:a.decoder,delimiter:"string"==typeof e.delimiter||n.isRegExp(e.delimiter)?e.delimiter:a.delimiter,depth:"number"==typeof e.depth||!1===e.depth?+e.depth:a.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof e.interpretNumericEntities?e.interpretNumericEntities:a.interpretNumericEntities,parameterLimit:"number"==typeof e.parameterLimit?e.parameterLimit:a.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:"boolean"==typeof e.plainObjects?e.plainObjects:a.plainObjects,strictNullHandling:"boolean"==typeof e.strictNullHandling?e.strictNullHandling:a.strictNullHandling}}(u);if(""===e||null==e)return t.plainObjects?Object.create(null):{};for(var f="string"==typeof e?function(e,u){var t,i={},f=u.ignoreQueryPrefix?e.replace(/^\?/,""):e,l=u.parameterLimit===1/0?void 0:u.parameterLimit,s=f.split(u.delimiter,l),p=-1,m=u.charset;if(u.charsetSentinel)for(t=0;t-1&&(v=r(v)?[v]:v),d.call(i,h)?i[h]=n.combine(i[h],v):i[h]=v}return i}(e,t):e,l=t.plainObjects?Object.create(null):{},s=Object.keys(f),p=0;p1?arguments[1]:void 0,3);t=t?t.n:this._f;)for(n(t.v,t.k,this);t&&t.r;)t=t.p},has:function(e){return!!v(m(this,u),e)}}),s&&n(f.prototype,"size",{get:function(){return m(this,u)[h]}}),f},def:function(e,u,t){var n,d,r=v(e,u);return r?r.v=t:(e._l=r={i:d=p(u,!0),k:u,v:t,p:n=e._l,n:void 0,r:!1},e._f||(e._f=r),n&&(n.n=r),e[h]++,"F"!==d&&(e._i[d]=r)),e},getEntry:v,setStrong:function(e,u,t){i(e,u,(function(e,t){this._t=m(e,u),this._k=t,this._l=void 0}),(function(){for(var e=this._k,u=this._l;u&&u.r;)u=u.p;return this._t&&(this._l=u=u?u.n:this._t._f)?f(0,"keys"==e?u.k:"values"==e?u.v:[u.k,u.v]):(this._t=void 0,f(1))}),t?"entries":"values",!t,!0),l(u)}}},587:function(e,u,t){"use strict";var n=t(5),d=t(12),r=t(16),a=t(82),c=t(531),o=t(81),i=t(80),f=t(13),l=t(14),s=t(83),p=t(41),m=t(588);e.exports=function(e,u,t,h,v,b){var y=n[e],g=y,_=v?"set":"add",x=g&&g.prototype,w={},E=function(e){var u=x[e];r(x,e,"delete"==e||"has"==e?function(e){return!(b&&!f(e))&&u.call(this,0===e?0:e)}:"get"==e?function(e){return b&&!f(e)?void 0:u.call(this,0===e?0:e)}:"add"==e?function(e){return u.call(this,0===e?0:e),this}:function(e,t){return u.call(this,0===e?0:e,t),this})};if("function"==typeof g&&(b||x.forEach&&!l((function(){(new g).entries().next()})))){var I=new g,S=I[_](b?{}:-0,1)!=I,A=l((function(){I.has(1)})),k=s((function(e){new g(e)})),O=!b&&l((function(){for(var e=new g,u=5;u--;)e[_](u,u);return!e.has(-0)}));k||((g=u((function(u,t){i(u,g,e);var n=m(new y,u,g);return null!=t&&o(t,v,n[_],n),n}))).prototype=x,x.constructor=g),(A||O)&&(E("delete"),E("has"),v&&E("get")),(O||S)&&E(_),b&&x.clear&&delete x.clear}else g=h.getConstructor(u,e,v,_),a(g.prototype,t),c.NEED=!0;return p(g,e),w[e]=g,d(d.G+d.W+d.F*(g!=y),w),b||h.setStrong(g,e,v),g}},588:function(e,u,t){var n=t(13),d=t(589).set;e.exports=function(e,u,t){var r,a=u.constructor;return a!==t&&"function"==typeof a&&(r=a.prototype)!==t.prototype&&n(r)&&d&&d(e,r),e}},589:function(e,u,t){var n=t(13),d=t(8),r=function(e,u){if(d(e),!n(u)&&null!==u)throw TypeError(u+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,u,n){try{(n=t(30)(Function.call,t(590).f(Object.prototype,"__proto__").set,2))(e,[]),u=!(e instanceof Array)}catch(d){u=!0}return function(e,t){return r(e,t),u?e.__proto__=t:n(e,t),e}}({},!1):void 0),check:r}},590:function(e,u,t){var n=t(62),d=t(57),r=t(33),a=t(87),c=t(31),o=t(86),i=Object.getOwnPropertyDescriptor;u.f=t(10)?i:function(e,u){if(e=r(e),u=a(u,!0),o)try{return i(e,u)}catch(t){}if(c(e,u))return d(!n.f.call(e,u),e[u])}},591:function(e,u,t){"use strict";var n=t(12),d=t(32),r=t(27),a=t(14),c=[].sort,o=[1,2,3];n(n.P+n.F*(a((function(){o.sort(void 0)}))||!a((function(){o.sort(null)}))||!t(592)(c)),"Array",{sort:function(e){return void 0===e?c.call(r(this)):c.call(r(this),d(e))}})},592:function(e,u,t){"use strict";var n=t(14);e.exports=function(e,u){return!!e&&n((function(){u?e.call(null,(function(){}),1):e.call(null)}))}},601:function(e,u,t){"use strict";t(529),t(79),t(530),t(591),t(29),t(22),t(21),t(85),t(481);var n=t(1),d=(t(488),t(489),t(77),t(468),t(0)),r=t.n(d),a=t(521),c=t.n(a);t(150);var o=function(e){var u=e.humanize,t=e.icon,n=e.values,d=e.currentState,a=e.setState;if(0==n.size)return null;var o=Array.from(n);return r.a.createElement(r.a.Fragment,null,o.map((function(e,n){var o="string"==typeof e&&u?c()(e):e;return r.a.createElement("label",{key:n},r.a.createElement("input",{type:"checkbox",onChange:function(u){var t=new Set(d);u.currentTarget.checked?t.add(e):t.delete(e),a(t)},checked:d.has(e)}),o&&r.a.createElement(r.a.Fragment,null,t?r.a.createElement("i",{className:"feather icon-"+t}):""," ",o))})))},i=t(543),f=t(473),l=t(470),s=(t(484),t(491)),p=t.n(s),m=t(463),h=t.n(m),v=t(544),b=t.n(v),y=t(476);t(151);function g(e){var u=e.delivery_guarantee,t=e.description,n=e.event_types,d=e.function_category,a=(e.logo_path,e.name),c=e.pathTemplate,o=e.status,i=e.title,f=e.type,s=c;s||("source"==f&&(s="/docs/reference/sources//"),"transform"==f&&(s="/docs/reference/transforms//"),"sink"==f&&(s="/docs/reference/sinks//"));var p=s.replace("",a);return r.a.createElement(l.a,{to:p,className:"qovery-component",title:t},r.a.createElement("div",{className:"qovery-component--header"},r.a.createElement("div",{className:"qovery-component--name"},i)),r.a.createElement("div",{className:"qovery-component--badges"},"beta"==o?r.a.createElement("span",{className:"badge badge--warning",title:"This component is in beta and is not recommended for production environments"},r.a.createElement("i",{className:"feather icon-alert-triangle"})):r.a.createElement("span",{className:"badge badge--primary",title:"This component has passed reliability standards that make it production ready"},r.a.createElement("i",{className:"feather icon-award"})),"best_effort"==u?r.a.createElement("span",{className:"badge badge--warning",title:"This component makes a best-effort delivery guarantee, and in rare cases can lose data"},r.a.createElement("i",{className:"feather icon-shield-off"})):r.a.createElement("span",{className:"badge badge--primary",title:"This component offers an at-least-once delivery guarantee"},r.a.createElement("i",{className:"feather icon-shield"})),n.includes("log")?r.a.createElement("span",{className:"badge badge--primary",title:"This component works with log event types"},"log"):"",n.includes("metric")?r.a.createElement("span",{className:"badge badge--primary",title:"This component works with metric event types"},"metric"):"",r.a.createElement("span",{className:"badge badge--primary"},d)))}function _(e){var u=e.components,t=e.headingLevel,d=e.pathTemplate,a=e.titles,c=u.filter((function(e){return"source"==e.type})),o=u.filter((function(e){return"transform"==e.type})),l=u.filter((function(e){return"sink"==e.type})),s="h"+(t||3);return u.length>0?r.a.createElement(r.a.Fragment,null,c.length>0?r.a.createElement(r.a.Fragment,null,a&&r.a.createElement(s,null,c.length," Sources"),r.a.createElement("div",{className:"qovery-components--grid"},c.map((function(e,u){return r.a.createElement(g,Object(n.a)({key:u,pathTemplate:d},e))})))):"",o.length>0?r.a.createElement(r.a.Fragment,null,a&&r.a.createElement(s,null,o.length," Transforms"),r.a.createElement("div",{className:"qovery-components--grid"},o.map((function(e,u){return r.a.createElement(g,Object(n.a)({key:u,pathTemplate:d},e))})))):"",l.length>0?r.a.createElement(r.a.Fragment,null,a&&r.a.createElement(s,null,l.length," Sinks"),r.a.createElement("div",{className:"qovery-components--grid"},l.map((function(e,u){return r.a.createElement(g,Object(n.a)({key:u,pathTemplate:d},e))})))):"",r.a.createElement("hr",null),r.a.createElement(f.a,{to:"https://github.com/qovery/documentation/issues/new?labels=type%3A+new+feature",target:"_blank",rightIcon:"plus-circle"},"Request a new component")):r.a.createElement(i.a,{text:"no components found"})}u.a=function(e){var u=Object(y.a)().siteConfig.customFields.metadata,t=u.sources,n=u.transforms,a=u.sinks,c=e.titles||null==e.titles,i=1==e.filterColumn,f=e.pathTemplate,s=e.location?b.a.parse(e.location.search,{ignoreQueryPrefix:!0}):{},m=[];(e.sources||null==e.sources)&&(m=m.concat(Object.values(t))),(e.transforms||null==e.transforms)&&(m=m.concat(Object.values(n))),(e.sinks||null==e.sinks)&&(m=m.concat(Object.values(a))),m=m.sort((function(e,u){return e.name>u.name?1:-1}));var v=Object(d.useState)("true"==s["at-least-once"]),g=v[0],x=v[1],w=Object(d.useState)(new Set(s["event-types"]||e.eventTypes)),E=w[0],I=w[1],S=Object(d.useState)(new Set(s.functions)),A=S[0],k=S[1],O=Object(d.useState)(new Set(s["operating-systems"])),j=O[0],N=O[1],C=Object(d.useState)("true"==s["prod-ready"]),P=C[0],T=C[1],M=Object(d.useState)(new Set(s.providers)),R=M[0],L=M[1],F=Object(d.useState)(s.search),B=F[0],D=F[1];B&&(m=m.filter((function(e){return(e.name.toLowerCase()+" "+e.type.toLowerCase()).includes(B.toLowerCase())}))),g&&(m=m.filter((function(e){return"at_least_once"==e.delivery_guarantee}))),E.size>0&&(m=m.filter((function(e){return Array.from(E).some((function(u){return e.event_types.includes(u)}))}))),A.size>0&&(m=m.filter((function(e){return A.has(e.function_category)}))),j.size>0&&(m=m.filter((function(e){return Array.from(j).every((function(u){return e.operating_systems.includes(u)}))}))),P&&(m=m.filter((function(e){return"prod-ready"==e.status}))),R.size>0&&(m=m.filter((function(e){return Array.from(R).every((function(u){return e.service_providers&&e.service_providers.includes(u)}))}))),e.exceptNames&&e.exceptNames.length>0&&(m=m.filter((function(u){return!e.exceptNames.includes(u.name)}))),e.exceptFunctions&&e.exceptFunctions.length>0&&(m=m.filter((function(u){return!e.exceptFunctions.includes(u.function_category)})));var U=E.size>0?E:new Set(p()(m).map((function(e){return e.event_types})).flatten().uniq().compact().sort().value()),z=new Set(p()(m).map((function(e){return e.operating_systems})).flatten().uniq().compact().sort().value()),W=new Set(p()(m).map((function(e){return e.service_providers})).flatten().uniq().compact().sort().value()),$=new Set(p()(m).filter((function(e){return"source"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),G=new Set(p()(m).filter((function(e){return"transform"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),q=new Set(p()(m).filter((function(e){return"sink"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value());return r.a.createElement("div",{className:h()("qovery-components",{"qovery-components--cols":i})},r.a.createElement("div",{className:"filters"},r.a.createElement("div",{className:"search"},r.a.createElement("input",{className:"input--text input--lg",type:"text",onChange:function(e){return D(e.currentTarget.value)},placeholder:"\ud83d\udd0d Search..."})),r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},r.a.createElement(l.a,{to:"/docs/getting-started/data-model/",title:"Learn more about Qovery's event types"},"Event types ",r.a.createElement("i",{className:"feather icon-info"}))),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Event Types",icon:"database",values:U,humanize:!0,currentState:E,setState:I}))),r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},r.a.createElement(l.a,{to:"/docs/getting-started/whats-next/",title:"Learn more about Qovery's guarantees"},"Guarantees ",r.a.createElement("i",{className:"feather icon-info"}))),r.a.createElement("div",{className:"filter--choices"},r.a.createElement("label",{title:"Show only components that offer an at-least-once delivery guarantee."},r.a.createElement("input",{type:"checkbox",onChange:function(e){return x(e.currentTarget.checked)},checked:g}),r.a.createElement("i",{className:"feather icon-shield"})," At-least-once"),r.a.createElement("label",{title:"Show only production ready components."},r.a.createElement("input",{type:"checkbox",onChange:function(e){return T(e.currentTarget.checked)},checked:P}),r.a.createElement("i",{className:"feather icon-award"})," Prod-ready"))),$.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Source Functions"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Functions",icon:"settings",values:$,humanize:!0,currentState:A,setState:k}))),G.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Transform Functions"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Functions",icon:"settings",values:G,humanize:!0,currentState:A,setState:k}))),q.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Sink Functions"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Functions",icon:"settings",values:q,humanize:!0,currentState:A,setState:k}))),W.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Providers"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Providers",icon:"cloud",values:W,currentState:R,setState:L}))),z.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},r.a.createElement(l.a,{to:"/docs/setup/installation/operating-systems/",title:"Learn more about Qovery's operating systems"},"Operating Systems")),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Operating Systems",icon:"cpu",values:z,currentState:j,setState:N})))),r.a.createElement("div",{className:"qovery-components--results"},r.a.createElement(_,{components:m,headingLevel:e.headingLevel,pathTemplate:f,titles:c})))}}}]); \ No newline at end of file +/*! For license information please see 54e7632e.5617fd6c.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[109],{459:function(e,u,t){"use strict";t.r(u);var n={};t.r(n),t.d(n,"now",(function(){return g})),t.d(n,"timer",(function(){return w})),t.d(n,"timerFlush",(function(){return E})),t.d(n,"timeout",(function(){return k})),t.d(n,"interval",(function(){return O}));var d,r,a=t(0),c=t.n(a),o=t(601),i=t(487),f=t(470),l=(t(466),t(84),0),s=0,p=0,m=0,h=0,v=0,b="object"==typeof performance&&performance.now?performance:Date,y="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(e){setTimeout(e,17)};function g(){return h||(y(_),h=b.now()+v)}function _(){h=0}function x(){this._call=this._time=this._next=null}function w(e,u,t){var n=new x;return n.restart(e,u,t),n}function E(){g(),++l;for(var e,u=d;u;)(e=h-u._time)>=0&&u._call.call(null,e),u=u._next;--l}function I(){h=(m=b.now())+v,l=s=0;try{E()}finally{l=0,function(){var e,u,t=d,n=1/0;for(;t;)t._call?(n>t._time&&(n=t._time),e=t,t=t._next):(u=t._next,t._next=null,t=e?e._next=u:d=u);r=e,A(n)}(),h=0}}function S(){var e=b.now(),u=e-m;u>1e3&&(v-=u,m=e)}function A(e){l||(s&&(s=clearTimeout(s)),e-h>24?(e<1/0&&(s=setTimeout(I,e-b.now()-v)),p&&(p=clearInterval(p))):(p||(m=b.now(),p=setInterval(S,1e3)),l=1,y(I)))}x.prototype=w.prototype={constructor:x,restart:function(e,u,t){if("function"!=typeof e)throw new TypeError("callback is not a function");t=(null==t?g():+t)+(null==u?0:+u),this._next||r===this||(r?r._next=this:d=this,r=this),this._call=e,this._time=t,A()},stop:function(){this._call&&(this._call=null,this._time=1/0,A())}};var k=function(e,u,t){var n=new x;return u=null==u?0:+u,n.restart((function(t){n.stop(),e(t+u)}),u,t),n},O=function(e,u,t){var n=new x,d=u;return null==u?(n.restart(e,u,t),n):(u=+u,t=null==t?g():+t,n.restart((function r(a){a+=d,n.restart(r,d+=u,t),e(a)}),u,t),n)},j=Object.assign({},n);t(476);u.default=function(e){return Object(a.useEffect)((function(){if("undefined"!=typeof document){var e=function(e){for(var u=e.getContext("2d"),t=e.width,n=e.height,d=2*Math.PI,r=200,a=new Array(r),c=0;ct+45&&(o.x-=t+90),o.y+=o.vy,o.y<-45?o.y+=n+90:o.y>n+45&&(o.y-=n+90),o.vx+=.2*(Math.random()-.5)-.01*o.vx,o.vy+=.2*(Math.random()-.5)-.01*o.vy,u.beginPath(),u.arc(o.x,o.y,3,0,d),u.fillStyle="rgba(40,217,242,0.4)",u.fill()}for(c=0;c3600?(2025-m)/-1575:1,u.beginPath(),u.moveTo(f.x,f.y),u.lineTo(l.x,l.y),u.strokeStyle="rgba(40,217,242,0.3)",u.stroke())}u.restore()}))}(document.querySelector("canvas"));return function(){e.stop()}}}),[]),c.a.createElement(i.a,{title:"Components - Sources, Transforms, & Sinks",description:"Browse and search all of Qovery's components: sources, transforms, and sinks. Filter by event type, guarantee, function, operating system, and provider."},c.a.createElement("header",{className:"hero hero--animated-graph"},c.a.createElement("div",{className:"container container--fluid container--flush"},c.a.createElement("canvas",{width:"2000",height:"200"}),c.a.createElement("div",{className:"overlay"},c.a.createElement("h1",null,"Qovery Components"),c.a.createElement("div",{className:"hero--subtitle"},"Components allow you to collect, transform, and route data with ease. ",c.a.createElement(f.a,{to:"/docs/getting-started/concepts/"},"Learn more"),".")))),c.a.createElement("main",{className:"container"},c.a.createElement(o.a,{filterColumn:!0,headingLevel:2,location:e.location})))}},463:function(e,u,t){var n;!function(){"use strict";var t={}.hasOwnProperty;function d(){for(var e=[],u=0;u1?arguments[1]:void 0,t),o=a>2?arguments[2]:void 0,i=void 0===o?t:d(o,t);i>c;)u[c++]=e;return u}},468:function(e,u,t){var n=t(28).f,d=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in d||t(10)&&n(d,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},473:function(e,u,t){"use strict";var n=t(0),d=t.n(n),r=t(470),a=t(463),c=t.n(a);t(134);u.a=function(e){var u=e.children,t=e.className,n=e.badge,a=e.leftIcon,o=e.rightIcon,i=e.size,f=e.target,l=e.to,s=c()("jump-to","jump-to--"+i,t),p=d.a.createElement("div",{className:"jump-to--inner"},d.a.createElement("div",{className:"jump-to--inner-2"},a&&d.a.createElement("div",{className:"jump-to--left"},d.a.createElement("i",{className:"feather icon-"+a})),d.a.createElement("div",{className:"jump-to--main"},n?d.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",u),d.a.createElement("div",{className:"jump-to--right"},d.a.createElement("i",{className:"feather icon-"+(o||"chevron-right")+" arrow"}))));return f?d.a.createElement("a",{href:l,target:f,className:s},p):d.a.createElement(r.a,{to:l,className:s},p)}},480:function(e,u,t){"use strict";var n=t(8),d=t(526),r=t(55);t(56)("search",1,(function(e,u,t,a){return[function(t){var n=e(this),d=null==t?void 0:t[u];return void 0!==d?d.call(t,n):new RegExp(t)[u](String(n))},function(e){var u=a(t,e,this);if(u.done)return u.value;var c=n(e),o=String(this),i=c.lastIndex;d(i,0)||(c.lastIndex=0);var f=r(c,o);return d(c.lastIndex,i)||(c.lastIndex=i),null===f?-1:f.index}]}))},487:function(e,u,t){"use strict";t(497);var n=t(0),d=t.n(n),r=t(498),a=t(486),c=t(1),o=(t(488),t(489),t(499),t(470)),i=t(500),f=t(484),l=t.n(f),s=t(501),p=t.n(s),m=t(476),h=t(463),v=t.n(h),b=t(135),y=t.n(b),g=function(){return d.a.createElement("span",{className:v()(y.a.toggle,y.a.moon)})},_=function(){return d.a.createElement("span",{className:v()(y.a.toggle,y.a.sun)})},x=function(e){var u=Object(m.a)().isClient;return d.a.createElement(p.a,Object(c.a)({disabled:!u,icons:{checked:d.a.createElement(g,null),unchecked:d.a.createElement(_,null)}},e))};function w(){var e=Object(m.a)().siteConfig,u=(void 0===e?{}:e).customFields.metadata.latest_post,t=Date.parse(u.date),n=new Date,d=Math.abs(n-t),r=Math.ceil(d/864e5),a=null;return"undefined"!=typeof window&&(a=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),r<30&&(!a||a0&&d.a.createElement("div",{className:"row footer__links"},d.a.createElement("div",{className:"col col--5 footer__col"},d.a.createElement("div",{className:"margin-bottom--md"},d.a.createElement(l.a,{className:"navbar__logo",src:p,alt:"Qovery",width:"150",height:"auto"})),d.a.createElement("div",{className:"margin-bottom--md"},d.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),d.a.createElement("div",null,d.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},d.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",d.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},d.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",d.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},d.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),o.map((function(e,u){return d.a.createElement("div",{key:u,className:"col footer__col"},null!=e.title?d.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?d.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,u){return e.html?d.a.createElement("li",{key:u,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):d.a.createElement("li",{key:e.href||e.to,className:"footer__item"},d.a.createElement(L,e))}))):null)}))),(f||a)&&d.a.createElement("div",{className:"text--center"},f&&f.src&&d.a.createElement("div",{className:"margin-bottom--sm"},f.href?d.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:R.a.footerLogoLink},d.a.createElement(F,{alt:f.alt,url:s})):d.a.createElement(F,{alt:f.alt,url:s})),d.a.createElement("small",null,a),d.a.createElement("br",null))))},D=t(502),U=t(503),z=t(3);t(138);u.a=function(e){var u=Object(m.a)().siteConfig,t=void 0===u?{}:u,n=t.title,c=t.themeConfig.image,o=t.url,i=e.children,f=e.title,l=e.noFooter,s=e.description,p=e.image,h=e.keywords,v=e.version,b=f?f+" | "+n:n,y=p||c,g=o+Object(I.a)(y),_=Object(z.h)(),x=_?"https://docs.qovery.com"+(_.pathname.endsWith("/")?_.pathname:_.pathname+"/"):null;return d.a.createElement(U.a,null,d.a.createElement(D.a,null,d.a.createElement(a.a,null,d.a.createElement("html",{lang:"en"}),d.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),b&&d.a.createElement("title",null,b),b&&d.a.createElement("meta",{property:"og:title",content:b}),d.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),d.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),d.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),d.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),d.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),d.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),d.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),d.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),s&&d.a.createElement("meta",{name:"description",content:s}),s&&d.a.createElement("meta",{property:"og:description",content:s}),v&&d.a.createElement("meta",{name:"docsearch:version",content:v}),h&&h.length&&d.a.createElement("meta",{name:"keywords",content:h.join(",")}),y&&d.a.createElement("meta",{property:"og:image",content:g}),y&&d.a.createElement("meta",{property:"twitter:image",content:g}),y&&d.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+b}),x&&d.a.createElement("meta",{property:"og:url",content:x}),d.a.createElement("meta",{name:"twitter:card",content:"summary"}),x&&d.a.createElement("link",{rel:"canonical",href:x})),d.a.createElement(r.a,null),d.a.createElement(P,null),d.a.createElement("div",{className:"main-wrapper"},i),!l&&d.a.createElement(B,null)))}},491:function(e,u,t){(function(e,n){var d;(function(){var r="Expected a function",a="__lodash_placeholder__",c=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],o="[object Arguments]",i="[object Array]",f="[object Boolean]",l="[object Date]",s="[object Error]",p="[object Function]",m="[object GeneratorFunction]",h="[object Map]",v="[object Number]",b="[object Object]",y="[object RegExp]",g="[object Set]",_="[object String]",x="[object Symbol]",w="[object WeakMap]",E="[object ArrayBuffer]",I="[object DataView]",S="[object Float32Array]",A="[object Float64Array]",k="[object Int8Array]",O="[object Int16Array]",j="[object Int32Array]",N="[object Uint8Array]",C="[object Uint16Array]",P="[object Uint32Array]",T=/\b__p \+= '';/g,M=/\b(__p \+=) '' \+/g,R=/(__e\(.*?\)|\b__t\)) \+\n'';/g,L=/&(?:amp|lt|gt|quot|#39);/g,F=/[&<>"']/g,B=RegExp(L.source),D=RegExp(F.source),U=/<%-([\s\S]+?)%>/g,z=/<%([\s\S]+?)%>/g,W=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,G=/^\w*$/,q=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,H=/[\\^$.*+?()[\]{}|]/g,K=RegExp(H.source),V=/^\s+|\s+$/g,J=/^\s+/,Z=/\s+$/,Q=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,ee=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ue=/\\(\\)?/g,te=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ne=/\w*$/,de=/^[-+]0x[0-9a-f]+$/i,re=/^0b[01]+$/i,ae=/^\[object .+?Constructor\]$/,ce=/^0o[0-7]+$/i,oe=/^(?:0|[1-9]\d*)$/,ie=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,fe=/($^)/,le=/['\n\r\u2028\u2029\\]/g,se="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",pe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",me="[\\ud800-\\udfff]",he="["+pe+"]",ve="["+se+"]",be="\\d+",ye="[\\u2700-\\u27bf]",ge="[a-z\\xdf-\\xf6\\xf8-\\xff]",_e="[^\\ud800-\\udfff"+pe+be+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",xe="\\ud83c[\\udffb-\\udfff]",we="[^\\ud800-\\udfff]",Ee="(?:\\ud83c[\\udde6-\\uddff]){2}",Ie="[\\ud800-\\udbff][\\udc00-\\udfff]",Se="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Ae="(?:"+ge+"|"+_e+")",ke="(?:"+Se+"|"+_e+")",Oe="(?:"+ve+"|"+xe+")"+"?",je="[\\ufe0e\\ufe0f]?"+Oe+("(?:\\u200d(?:"+[we,Ee,Ie].join("|")+")[\\ufe0e\\ufe0f]?"+Oe+")*"),Ne="(?:"+[ye,Ee,Ie].join("|")+")"+je,Ce="(?:"+[we+ve+"?",ve,Ee,Ie,me].join("|")+")",Pe=RegExp("['\u2019]","g"),Te=RegExp(ve,"g"),Me=RegExp(xe+"(?="+xe+")|"+Ce+je,"g"),Re=RegExp([Se+"?"+ge+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[he,Se,"$"].join("|")+")",ke+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[he,Se+Ae,"$"].join("|")+")",Se+"?"+Ae+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",Se+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",be,Ne].join("|"),"g"),Le=RegExp("[\\u200d\\ud800-\\udfff"+se+"\\ufe0e\\ufe0f]"),Fe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Be=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],De=-1,Ue={};Ue[S]=Ue[A]=Ue[k]=Ue[O]=Ue[j]=Ue[N]=Ue["[object Uint8ClampedArray]"]=Ue[C]=Ue[P]=!0,Ue[o]=Ue[i]=Ue[E]=Ue[f]=Ue[I]=Ue[l]=Ue[s]=Ue[p]=Ue[h]=Ue[v]=Ue[b]=Ue[y]=Ue[g]=Ue[_]=Ue[w]=!1;var ze={};ze[o]=ze[i]=ze[E]=ze[I]=ze[f]=ze[l]=ze[S]=ze[A]=ze[k]=ze[O]=ze[j]=ze[h]=ze[v]=ze[b]=ze[y]=ze[g]=ze[_]=ze[x]=ze[N]=ze["[object Uint8ClampedArray]"]=ze[C]=ze[P]=!0,ze[s]=ze[p]=ze[w]=!1;var We={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},$e=parseFloat,Ge=parseInt,qe="object"==typeof e&&e&&e.Object===Object&&e,He="object"==typeof self&&self&&self.Object===Object&&self,Ke=qe||He||Function("return this")(),Ve=u&&!u.nodeType&&u,Je=Ve&&"object"==typeof n&&n&&!n.nodeType&&n,Ze=Je&&Je.exports===Ve,Qe=Ze&&qe.process,Ye=function(){try{var e=Je&&Je.require&&Je.require("util").types;return e||Qe&&Qe.binding&&Qe.binding("util")}catch(u){}}(),Xe=Ye&&Ye.isArrayBuffer,eu=Ye&&Ye.isDate,uu=Ye&&Ye.isMap,tu=Ye&&Ye.isRegExp,nu=Ye&&Ye.isSet,du=Ye&&Ye.isTypedArray;function ru(e,u,t){switch(t.length){case 0:return e.call(u);case 1:return e.call(u,t[0]);case 2:return e.call(u,t[0],t[1]);case 3:return e.call(u,t[0],t[1],t[2])}return e.apply(u,t)}function au(e,u,t,n){for(var d=-1,r=null==e?0:e.length;++d-1}function su(e,u,t){for(var n=-1,d=null==e?0:e.length;++n-1;);return t}function Mu(e,u){for(var t=e.length;t--&&xu(u,e[t],0)>-1;);return t}function Ru(e,u){for(var t=e.length,n=0;t--;)e[t]===u&&++n;return n}var Lu=Au({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Fu=Au({"&":"&","<":"<",">":">",'"':""","'":"'"});function Bu(e){return"\\"+We[e]}function Du(e){return Le.test(e)}function Uu(e){var u=-1,t=Array(e.size);return e.forEach((function(e,n){t[++u]=[n,e]})),t}function zu(e,u){return function(t){return e(u(t))}}function Wu(e,u){for(var t=-1,n=e.length,d=0,r=[];++t",""":'"',"'":"'"});var Vu=function e(u){var t,n=(u=null==u?Ke:Vu.defaults(Ke.Object(),u,Vu.pick(Ke,Be))).Array,d=u.Date,se=u.Error,pe=u.Function,me=u.Math,he=u.Object,ve=u.RegExp,be=u.String,ye=u.TypeError,ge=n.prototype,_e=pe.prototype,xe=he.prototype,we=u["__core-js_shared__"],Ee=_e.toString,Ie=xe.hasOwnProperty,Se=0,Ae=(t=/[^.]+$/.exec(we&&we.keys&&we.keys.IE_PROTO||""))?"Symbol(src)_1."+t:"",ke=xe.toString,Oe=Ee.call(he),je=Ke._,Ne=ve("^"+Ee.call(Ie).replace(H,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ce=Ze?u.Buffer:void 0,Me=u.Symbol,Le=u.Uint8Array,We=Ce?Ce.allocUnsafe:void 0,qe=zu(he.getPrototypeOf,he),He=he.create,Ve=xe.propertyIsEnumerable,Je=ge.splice,Qe=Me?Me.isConcatSpreadable:void 0,Ye=Me?Me.iterator:void 0,yu=Me?Me.toStringTag:void 0,Au=function(){try{var e=Xd(he,"defineProperty");return e({},"",{}),e}catch(u){}}(),Ju=u.clearTimeout!==Ke.clearTimeout&&u.clearTimeout,Zu=d&&d.now!==Ke.Date.now&&d.now,Qu=u.setTimeout!==Ke.setTimeout&&u.setTimeout,Yu=me.ceil,Xu=me.floor,et=he.getOwnPropertySymbols,ut=Ce?Ce.isBuffer:void 0,tt=u.isFinite,nt=ge.join,dt=zu(he.keys,he),rt=me.max,at=me.min,ct=d.now,ot=u.parseInt,it=me.random,ft=ge.reverse,lt=Xd(u,"DataView"),st=Xd(u,"Map"),pt=Xd(u,"Promise"),mt=Xd(u,"Set"),ht=Xd(u,"WeakMap"),vt=Xd(he,"create"),bt=ht&&new ht,yt={},gt=Ar(lt),_t=Ar(st),xt=Ar(pt),wt=Ar(mt),Et=Ar(ht),It=Me?Me.prototype:void 0,St=It?It.valueOf:void 0,At=It?It.toString:void 0;function kt(e){if($a(e)&&!Pa(e)&&!(e instanceof Ct)){if(e instanceof Nt)return e;if(Ie.call(e,"__wrapped__"))return kr(e)}return new Nt(e)}var Ot=function(){function e(){}return function(u){if(!Wa(u))return{};if(He)return He(u);e.prototype=u;var t=new e;return e.prototype=void 0,t}}();function jt(){}function Nt(e,u){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!u,this.__index__=0,this.__values__=void 0}function Ct(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Pt(e){var u=-1,t=null==e?0:e.length;for(this.clear();++u=u?e:u)),e}function Jt(e,u,t,n,d,r){var a,c=1&u,i=2&u,s=4&u;if(t&&(a=d?t(e,n,d,r):t(e)),void 0!==a)return a;if(!Wa(e))return e;var w=Pa(e);if(w){if(a=function(e){var u=e.length,t=new e.constructor(u);u&&"string"==typeof e[0]&&Ie.call(e,"index")&&(t.index=e.index,t.input=e.input);return t}(e),!c)return bd(e,a)}else{var T=tr(e),M=T==p||T==m;if(La(e))return ld(e,c);if(T==b||T==o||M&&!d){if(a=i||M?{}:dr(e),!c)return i?function(e,u){return yd(e,ur(e),u)}(e,function(e,u){return e&&yd(u,_c(u),e)}(a,e)):function(e,u){return yd(e,er(e),u)}(e,qt(a,e))}else{if(!ze[T])return d?e:{};a=function(e,u,t){var n=e.constructor;switch(u){case E:return sd(e);case f:case l:return new n(+e);case I:return function(e,u){var t=u?sd(e.buffer):e.buffer;return new e.constructor(t,e.byteOffset,e.byteLength)}(e,t);case S:case A:case k:case O:case j:case N:case"[object Uint8ClampedArray]":case C:case P:return pd(e,t);case h:return new n;case v:case _:return new n(e);case y:return function(e){var u=new e.constructor(e.source,ne.exec(e));return u.lastIndex=e.lastIndex,u}(e);case g:return new n;case x:return d=e,St?he(St.call(d)):{}}var d}(e,T,c)}}r||(r=new Lt);var R=r.get(e);if(R)return R;r.set(e,a),Va(e)?e.forEach((function(n){a.add(Jt(n,u,t,n,e,r))})):Ga(e)&&e.forEach((function(n,d){a.set(d,Jt(n,u,t,d,e,r))}));var L=w?void 0:(s?i?Hd:qd:i?_c:gc)(e);return cu(L||e,(function(n,d){L&&(n=e[d=n]),Wt(a,d,Jt(n,u,t,d,e,r))})),a}function Zt(e,u,t){var n=t.length;if(null==e)return!n;for(e=he(e);n--;){var d=t[n],r=u[d],a=e[d];if(void 0===a&&!(d in e)||!r(a))return!1}return!0}function Qt(e,u,t){if("function"!=typeof e)throw new ye(r);return gr((function(){e.apply(void 0,t)}),u)}function Yt(e,u,t,n){var d=-1,r=lu,a=!0,c=e.length,o=[],i=u.length;if(!c)return o;t&&(u=pu(u,Nu(t))),n?(r=su,a=!1):u.length>=200&&(r=Pu,a=!1,u=new Rt(u));e:for(;++d-1},Tt.prototype.set=function(e,u){var t=this.__data__,n=$t(t,e);return n<0?(++this.size,t.push([e,u])):t[n][1]=u,this},Mt.prototype.clear=function(){this.size=0,this.__data__={hash:new Pt,map:new(st||Tt),string:new Pt}},Mt.prototype.delete=function(e){var u=Qd(this,e).delete(e);return this.size-=u?1:0,u},Mt.prototype.get=function(e){return Qd(this,e).get(e)},Mt.prototype.has=function(e){return Qd(this,e).has(e)},Mt.prototype.set=function(e,u){var t=Qd(this,e),n=t.size;return t.set(e,u),this.size+=t.size==n?0:1,this},Rt.prototype.add=Rt.prototype.push=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},Rt.prototype.has=function(e){return this.__data__.has(e)},Lt.prototype.clear=function(){this.__data__=new Tt,this.size=0},Lt.prototype.delete=function(e){var u=this.__data__,t=u.delete(e);return this.size=u.size,t},Lt.prototype.get=function(e){return this.__data__.get(e)},Lt.prototype.has=function(e){return this.__data__.has(e)},Lt.prototype.set=function(e,u){var t=this.__data__;if(t instanceof Tt){var n=t.__data__;if(!st||n.length<199)return n.push([e,u]),this.size=++t.size,this;t=this.__data__=new Mt(n)}return t.set(e,u),this.size=t.size,this};var Xt=xd(cn),en=xd(on,!0);function un(e,u){var t=!0;return Xt(e,(function(e,n,d){return t=!!u(e,n,d)})),t}function tn(e,u,t){for(var n=-1,d=e.length;++n0&&t(c)?u>1?dn(c,u-1,t,n,d):mu(d,c):n||(d[d.length]=c)}return d}var rn=wd(),an=wd(!0);function cn(e,u){return e&&rn(e,u,gc)}function on(e,u){return e&&an(e,u,gc)}function fn(e,u){return fu(u,(function(u){return Da(e[u])}))}function ln(e,u){for(var t=0,n=(u=cd(u,e)).length;null!=e&&tu}function hn(e,u){return null!=e&&Ie.call(e,u)}function vn(e,u){return null!=e&&u in he(e)}function bn(e,u,t){for(var d=t?su:lu,r=e[0].length,a=e.length,c=a,o=n(a),i=1/0,f=[];c--;){var l=e[c];c&&u&&(l=pu(l,Nu(u))),i=at(l.length,i),o[c]=!t&&(u||r>=120&&l.length>=120)?new Rt(c&&l):void 0}l=e[0];var s=-1,p=o[0];e:for(;++s=c)return o;var i=t[n];return o*("desc"==i?-1:1)}}return e.index-u.index}(e,u,t)}))}function Tn(e,u,t){for(var n=-1,d=u.length,r={};++n-1;)c!==e&&Je.call(c,o,1),Je.call(e,o,1);return e}function Rn(e,u){for(var t=e?u.length:0,n=t-1;t--;){var d=u[t];if(t==n||d!==r){var r=d;ar(d)?Je.call(e,d,1):Xn(e,d)}}return e}function Ln(e,u){return e+Xu(it()*(u-e+1))}function Fn(e,u){var t="";if(!e||u<1||u>9007199254740991)return t;do{u%2&&(t+=e),(u=Xu(u/2))&&(e+=e)}while(u);return t}function Bn(e,u){return _r(mr(e,u,qc),e+"")}function Dn(e){return Bt(Oc(e))}function Un(e,u){var t=Oc(e);return Er(t,Vt(u,0,t.length))}function zn(e,u,t,n){if(!Wa(e))return e;for(var d=-1,r=(u=cd(u,e)).length,a=r-1,c=e;null!=c&&++dr?0:r+u),(t=t>r?r:t)<0&&(t+=r),r=u>t?0:t-u>>>0,u>>>=0;for(var a=n(r);++d>>1,a=e[r];null!==a&&!Za(a)&&(t?a<=u:a=200){var i=u?null:Fd(e);if(i)return $u(i);a=!1,d=Pu,o=new Rt}else o=u?[]:c;e:for(;++n=n?e:qn(e,u,t)}var fd=Ju||function(e){return Ke.clearTimeout(e)};function ld(e,u){if(u)return e.slice();var t=e.length,n=We?We(t):new e.constructor(t);return e.copy(n),n}function sd(e){var u=new e.constructor(e.byteLength);return new Le(u).set(new Le(e)),u}function pd(e,u){var t=u?sd(e.buffer):e.buffer;return new e.constructor(t,e.byteOffset,e.length)}function md(e,u){if(e!==u){var t=void 0!==e,n=null===e,d=e==e,r=Za(e),a=void 0!==u,c=null===u,o=u==u,i=Za(u);if(!c&&!i&&!r&&e>u||r&&a&&o&&!c&&!i||n&&a&&o||!t&&o||!d)return 1;if(!n&&!r&&!i&&e1?t[d-1]:void 0,a=d>2?t[2]:void 0;for(r=e.length>3&&"function"==typeof r?(d--,r):void 0,a&&cr(t[0],t[1],a)&&(r=d<3?void 0:r,d=1),u=he(u);++n-1?d[r?u[a]:a]:void 0}}function kd(e){return Gd((function(u){var t=u.length,n=t,d=Nt.prototype.thru;for(e&&u.reverse();n--;){var a=u[n];if("function"!=typeof a)throw new ye(r);if(d&&!c&&"wrapper"==Vd(a))var c=new Nt([],!0)}for(n=c?n:t;++n1&&g.reverse(),l&&ic))return!1;var i=r.get(e);if(i&&r.get(u))return i==u;var f=-1,l=!0,s=2&t?new Rt:void 0;for(r.set(e,u),r.set(u,e);++f-1&&e%1==0&&e1?"& ":"")+u[n],u=u.join(t>2?", ":" "),e.replace(Q,"{\n/* [wrapped with "+u+"] */\n")}(n,function(e,u){return cu(c,(function(t){var n="_."+t[0];u&t[1]&&!lu(e,n)&&e.push(n)})),e.sort()}(function(e){var u=e.match(Y);return u?u[1].split(X):[]}(n),t)))}function wr(e){var u=0,t=0;return function(){var n=ct(),d=16-(n-t);if(t=n,d>0){if(++u>=800)return arguments[0]}else u=0;return e.apply(void 0,arguments)}}function Er(e,u){var t=-1,n=e.length,d=n-1;for(u=void 0===u?n:u;++t1?e[u-1]:void 0;return t="function"==typeof t?(e.pop(),t):void 0,Kr(e,t)}));function ea(e){var u=kt(e);return u.__chain__=!0,u}function ua(e,u){return u(e)}var ta=Gd((function(e){var u=e.length,t=u?e[0]:0,n=this.__wrapped__,d=function(u){return Kt(u,e)};return!(u>1||this.__actions__.length)&&n instanceof Ct&&ar(t)?((n=n.slice(t,+t+(u?1:0))).__actions__.push({func:ua,args:[d],thisArg:void 0}),new Nt(n,this.__chain__).thru((function(e){return u&&!e.length&&e.push(void 0),e}))):this.thru(d)}));var na=gd((function(e,u,t){Ie.call(e,t)?++e[t]:Ht(e,t,1)}));var da=Ad(Cr),ra=Ad(Pr);function aa(e,u){return(Pa(e)?cu:Xt)(e,Zd(u,3))}function ca(e,u){return(Pa(e)?ou:en)(e,Zd(u,3))}var oa=gd((function(e,u,t){Ie.call(e,t)?e[t].push(u):Ht(e,t,[u])}));var ia=Bn((function(e,u,t){var d=-1,r="function"==typeof u,a=Ma(e)?n(e.length):[];return Xt(e,(function(e){a[++d]=r?ru(u,e,t):yn(e,u,t)})),a})),fa=gd((function(e,u,t){Ht(e,t,u)}));function la(e,u){return(Pa(e)?pu:kn)(e,Zd(u,3))}var sa=gd((function(e,u,t){e[t?0:1].push(u)}),(function(){return[[],[]]}));var pa=Bn((function(e,u){if(null==e)return[];var t=u.length;return t>1&&cr(e,u[0],u[1])?u=[]:t>2&&cr(u[0],u[1],u[2])&&(u=[u[0]]),Pn(e,dn(u,1),[])})),ma=Zu||function(){return Ke.Date.now()};function ha(e,u,t){return u=t?void 0:u,Dd(e,128,void 0,void 0,void 0,void 0,u=e&&null==u?e.length:u)}function va(e,u){var t;if("function"!=typeof u)throw new ye(r);return e=tc(e),function(){return--e>0&&(t=u.apply(this,arguments)),e<=1&&(u=void 0),t}}var ba=Bn((function(e,u,t){var n=1;if(t.length){var d=Wu(t,Jd(ba));n|=32}return Dd(e,n,u,t,d)})),ya=Bn((function(e,u,t){var n=3;if(t.length){var d=Wu(t,Jd(ya));n|=32}return Dd(u,n,e,t,d)}));function ga(e,u,t){var n,d,a,c,o,i,f=0,l=!1,s=!1,p=!0;if("function"!=typeof e)throw new ye(r);function m(u){var t=n,r=d;return n=d=void 0,f=u,c=e.apply(r,t)}function h(e){return f=e,o=gr(b,u),l?m(e):c}function v(e){var t=e-i;return void 0===i||t>=u||t<0||s&&e-f>=a}function b(){var e=ma();if(v(e))return y(e);o=gr(b,function(e){var t=u-(e-i);return s?at(t,a-(e-f)):t}(e))}function y(e){return o=void 0,p&&n?m(e):(n=d=void 0,c)}function g(){var e=ma(),t=v(e);if(n=arguments,d=this,i=e,t){if(void 0===o)return h(i);if(s)return fd(o),o=gr(b,u),m(i)}return void 0===o&&(o=gr(b,u)),c}return u=dc(u)||0,Wa(t)&&(l=!!t.leading,a=(s="maxWait"in t)?rt(dc(t.maxWait)||0,u):a,p="trailing"in t?!!t.trailing:p),g.cancel=function(){void 0!==o&&fd(o),f=0,n=i=d=o=void 0},g.flush=function(){return void 0===o?c:y(ma())},g}var _a=Bn((function(e,u){return Qt(e,1,u)})),xa=Bn((function(e,u,t){return Qt(e,dc(u)||0,t)}));function wa(e,u){if("function"!=typeof e||null!=u&&"function"!=typeof u)throw new ye(r);var t=function(){var n=arguments,d=u?u.apply(this,n):n[0],r=t.cache;if(r.has(d))return r.get(d);var a=e.apply(this,n);return t.cache=r.set(d,a)||r,a};return t.cache=new(wa.Cache||Mt),t}function Ea(e){if("function"!=typeof e)throw new ye(r);return function(){var u=arguments;switch(u.length){case 0:return!e.call(this);case 1:return!e.call(this,u[0]);case 2:return!e.call(this,u[0],u[1]);case 3:return!e.call(this,u[0],u[1],u[2])}return!e.apply(this,u)}}wa.Cache=Mt;var Ia=od((function(e,u){var t=(u=1==u.length&&Pa(u[0])?pu(u[0],Nu(Zd())):pu(dn(u,1),Nu(Zd()))).length;return Bn((function(n){for(var d=-1,r=at(n.length,t);++d=u})),Ca=gn(function(){return arguments}())?gn:function(e){return $a(e)&&Ie.call(e,"callee")&&!Ve.call(e,"callee")},Pa=n.isArray,Ta=Xe?Nu(Xe):function(e){return $a(e)&&pn(e)==E};function Ma(e){return null!=e&&za(e.length)&&!Da(e)}function Ra(e){return $a(e)&&Ma(e)}var La=ut||ro,Fa=eu?Nu(eu):function(e){return $a(e)&&pn(e)==l};function Ba(e){if(!$a(e))return!1;var u=pn(e);return u==s||"[object DOMException]"==u||"string"==typeof e.message&&"string"==typeof e.name&&!Ha(e)}function Da(e){if(!Wa(e))return!1;var u=pn(e);return u==p||u==m||"[object AsyncFunction]"==u||"[object Proxy]"==u}function Ua(e){return"number"==typeof e&&e==tc(e)}function za(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}function Wa(e){var u=typeof e;return null!=e&&("object"==u||"function"==u)}function $a(e){return null!=e&&"object"==typeof e}var Ga=uu?Nu(uu):function(e){return $a(e)&&tr(e)==h};function qa(e){return"number"==typeof e||$a(e)&&pn(e)==v}function Ha(e){if(!$a(e)||pn(e)!=b)return!1;var u=qe(e);if(null===u)return!0;var t=Ie.call(u,"constructor")&&u.constructor;return"function"==typeof t&&t instanceof t&&Ee.call(t)==Oe}var Ka=tu?Nu(tu):function(e){return $a(e)&&pn(e)==y};var Va=nu?Nu(nu):function(e){return $a(e)&&tr(e)==g};function Ja(e){return"string"==typeof e||!Pa(e)&&$a(e)&&pn(e)==_}function Za(e){return"symbol"==typeof e||$a(e)&&pn(e)==x}var Qa=du?Nu(du):function(e){return $a(e)&&za(e.length)&&!!Ue[pn(e)]};var Ya=Md(An),Xa=Md((function(e,u){return e<=u}));function ec(e){if(!e)return[];if(Ma(e))return Ja(e)?Hu(e):bd(e);if(Ye&&e[Ye])return function(e){for(var u,t=[];!(u=e.next()).done;)t.push(u.value);return t}(e[Ye]());var u=tr(e);return(u==h?Uu:u==g?$u:Oc)(e)}function uc(e){return e?(e=dc(e))===1/0||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function tc(e){var u=uc(e),t=u%1;return u==u?t?u-t:u:0}function nc(e){return e?Vt(tc(e),0,4294967295):0}function dc(e){if("number"==typeof e)return e;if(Za(e))return NaN;if(Wa(e)){var u="function"==typeof e.valueOf?e.valueOf():e;e=Wa(u)?u+"":u}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(V,"");var t=re.test(e);return t||ce.test(e)?Ge(e.slice(2),t?2:8):de.test(e)?NaN:+e}function rc(e){return yd(e,_c(e))}function ac(e){return null==e?"":Qn(e)}var cc=_d((function(e,u){if(lr(u)||Ma(u))yd(u,gc(u),e);else for(var t in u)Ie.call(u,t)&&Wt(e,t,u[t])})),oc=_d((function(e,u){yd(u,_c(u),e)})),ic=_d((function(e,u,t,n){yd(u,_c(u),e,n)})),fc=_d((function(e,u,t,n){yd(u,gc(u),e,n)})),lc=Gd(Kt);var sc=Bn((function(e,u){e=he(e);var t=-1,n=u.length,d=n>2?u[2]:void 0;for(d&&cr(u[0],u[1],d)&&(n=1);++t1),u})),yd(e,Hd(e),t),n&&(t=Jt(t,7,Wd));for(var d=u.length;d--;)Xn(t,u[d]);return t}));var Ic=Gd((function(e,u){return null==e?{}:function(e,u){return Tn(e,u,(function(u,t){return hc(e,t)}))}(e,u)}));function Sc(e,u){if(null==e)return{};var t=pu(Hd(e),(function(e){return[e]}));return u=Zd(u),Tn(e,t,(function(e,t){return u(e,t[0])}))}var Ac=Bd(gc),kc=Bd(_c);function Oc(e){return null==e?[]:Cu(e,gc(e))}var jc=Id((function(e,u,t){return u=u.toLowerCase(),e+(t?Nc(u):u)}));function Nc(e){return Bc(ac(e).toLowerCase())}function Cc(e){return(e=ac(e))&&e.replace(ie,Lu).replace(Te,"")}var Pc=Id((function(e,u,t){return e+(t?"-":"")+u.toLowerCase()})),Tc=Id((function(e,u,t){return e+(t?" ":"")+u.toLowerCase()})),Mc=Ed("toLowerCase");var Rc=Id((function(e,u,t){return e+(t?"_":"")+u.toLowerCase()}));var Lc=Id((function(e,u,t){return e+(t?" ":"")+Bc(u)}));var Fc=Id((function(e,u,t){return e+(t?" ":"")+u.toUpperCase()})),Bc=Ed("toUpperCase");function Dc(e,u,t){return e=ac(e),void 0===(u=t?void 0:u)?function(e){return Fe.test(e)}(e)?function(e){return e.match(Re)||[]}(e):function(e){return e.match(ee)||[]}(e):e.match(u)||[]}var Uc=Bn((function(e,u){try{return ru(e,void 0,u)}catch(t){return Ba(t)?t:new se(t)}})),zc=Gd((function(e,u){return cu(u,(function(u){u=Sr(u),Ht(e,u,ba(e[u],e))})),e}));function Wc(e){return function(){return e}}var $c=kd(),Gc=kd(!0);function qc(e){return e}function Hc(e){return En("function"==typeof e?e:Jt(e,1))}var Kc=Bn((function(e,u){return function(t){return yn(t,e,u)}})),Vc=Bn((function(e,u){return function(t){return yn(e,t,u)}}));function Jc(e,u,t){var n=gc(u),d=fn(u,n);null!=t||Wa(u)&&(d.length||!n.length)||(t=u,u=e,e=this,d=fn(u,gc(u)));var r=!(Wa(t)&&"chain"in t&&!t.chain),a=Da(e);return cu(d,(function(t){var n=u[t];e[t]=n,a&&(e.prototype[t]=function(){var u=this.__chain__;if(r||u){var t=e(this.__wrapped__),d=t.__actions__=bd(this.__actions__);return d.push({func:n,args:arguments,thisArg:e}),t.__chain__=u,t}return n.apply(e,mu([this.value()],arguments))})})),e}function Zc(){}var Qc=Cd(pu),Yc=Cd(iu),Xc=Cd(bu);function eo(e){return or(e)?Su(Sr(e)):function(e){return function(u){return ln(u,e)}}(e)}var uo=Td(),to=Td(!0);function no(){return[]}function ro(){return!1}var ao=Nd((function(e,u){return e+u}),0),co=Ld("ceil"),oo=Nd((function(e,u){return e/u}),1),io=Ld("floor");var fo,lo=Nd((function(e,u){return e*u}),1),so=Ld("round"),po=Nd((function(e,u){return e-u}),0);return kt.after=function(e,u){if("function"!=typeof u)throw new ye(r);return e=tc(e),function(){if(--e<1)return u.apply(this,arguments)}},kt.ary=ha,kt.assign=cc,kt.assignIn=oc,kt.assignInWith=ic,kt.assignWith=fc,kt.at=lc,kt.before=va,kt.bind=ba,kt.bindAll=zc,kt.bindKey=ya,kt.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return Pa(e)?e:[e]},kt.chain=ea,kt.chunk=function(e,u,t){u=(t?cr(e,u,t):void 0===u)?1:rt(tc(u),0);var d=null==e?0:e.length;if(!d||u<1)return[];for(var r=0,a=0,c=n(Yu(d/u));rd?0:d+t),(n=void 0===n||n>d?d:tc(n))<0&&(n+=d),n=t>n?0:nc(n);t>>0)?(e=ac(e))&&("string"==typeof u||null!=u&&!Ka(u))&&!(u=Qn(u))&&Du(e)?id(Hu(e),0,t):e.split(u,t):[]},kt.spread=function(e,u){if("function"!=typeof e)throw new ye(r);return u=null==u?0:rt(tc(u),0),Bn((function(t){var n=t[u],d=id(t,0,u);return n&&mu(d,n),ru(e,this,d)}))},kt.tail=function(e){var u=null==e?0:e.length;return u?qn(e,1,u):[]},kt.take=function(e,u,t){return e&&e.length?qn(e,0,(u=t||void 0===u?1:tc(u))<0?0:u):[]},kt.takeRight=function(e,u,t){var n=null==e?0:e.length;return n?qn(e,(u=n-(u=t||void 0===u?1:tc(u)))<0?0:u,n):[]},kt.takeRightWhile=function(e,u){return e&&e.length?ud(e,Zd(u,3),!1,!0):[]},kt.takeWhile=function(e,u){return e&&e.length?ud(e,Zd(u,3)):[]},kt.tap=function(e,u){return u(e),e},kt.throttle=function(e,u,t){var n=!0,d=!0;if("function"!=typeof e)throw new ye(r);return Wa(t)&&(n="leading"in t?!!t.leading:n,d="trailing"in t?!!t.trailing:d),ga(e,u,{leading:n,maxWait:u,trailing:d})},kt.thru=ua,kt.toArray=ec,kt.toPairs=Ac,kt.toPairsIn=kc,kt.toPath=function(e){return Pa(e)?pu(e,Sr):Za(e)?[e]:bd(Ir(ac(e)))},kt.toPlainObject=rc,kt.transform=function(e,u,t){var n=Pa(e),d=n||La(e)||Qa(e);if(u=Zd(u,4),null==t){var r=e&&e.constructor;t=d?n?new r:[]:Wa(e)&&Da(r)?Ot(qe(e)):{}}return(d?cu:cn)(e,(function(e,n,d){return u(t,e,n,d)})),t},kt.unary=function(e){return ha(e,1)},kt.union=$r,kt.unionBy=Gr,kt.unionWith=qr,kt.uniq=function(e){return e&&e.length?Yn(e):[]},kt.uniqBy=function(e,u){return e&&e.length?Yn(e,Zd(u,2)):[]},kt.uniqWith=function(e,u){return u="function"==typeof u?u:void 0,e&&e.length?Yn(e,void 0,u):[]},kt.unset=function(e,u){return null==e||Xn(e,u)},kt.unzip=Hr,kt.unzipWith=Kr,kt.update=function(e,u,t){return null==e?e:ed(e,u,ad(t))},kt.updateWith=function(e,u,t,n){return n="function"==typeof n?n:void 0,null==e?e:ed(e,u,ad(t),n)},kt.values=Oc,kt.valuesIn=function(e){return null==e?[]:Cu(e,_c(e))},kt.without=Vr,kt.words=Dc,kt.wrap=function(e,u){return Sa(ad(u),e)},kt.xor=Jr,kt.xorBy=Zr,kt.xorWith=Qr,kt.zip=Yr,kt.zipObject=function(e,u){return dd(e||[],u||[],Wt)},kt.zipObjectDeep=function(e,u){return dd(e||[],u||[],zn)},kt.zipWith=Xr,kt.entries=Ac,kt.entriesIn=kc,kt.extend=oc,kt.extendWith=ic,Jc(kt,kt),kt.add=ao,kt.attempt=Uc,kt.camelCase=jc,kt.capitalize=Nc,kt.ceil=co,kt.clamp=function(e,u,t){return void 0===t&&(t=u,u=void 0),void 0!==t&&(t=(t=dc(t))==t?t:0),void 0!==u&&(u=(u=dc(u))==u?u:0),Vt(dc(e),u,t)},kt.clone=function(e){return Jt(e,4)},kt.cloneDeep=function(e){return Jt(e,5)},kt.cloneDeepWith=function(e,u){return Jt(e,5,u="function"==typeof u?u:void 0)},kt.cloneWith=function(e,u){return Jt(e,4,u="function"==typeof u?u:void 0)},kt.conformsTo=function(e,u){return null==u||Zt(e,u,gc(u))},kt.deburr=Cc,kt.defaultTo=function(e,u){return null==e||e!=e?u:e},kt.divide=oo,kt.endsWith=function(e,u,t){e=ac(e),u=Qn(u);var n=e.length,d=t=void 0===t?n:Vt(tc(t),0,n);return(t-=u.length)>=0&&e.slice(t,d)==u},kt.eq=Oa,kt.escape=function(e){return(e=ac(e))&&D.test(e)?e.replace(F,Fu):e},kt.escapeRegExp=function(e){return(e=ac(e))&&K.test(e)?e.replace(H,"\\$&"):e},kt.every=function(e,u,t){var n=Pa(e)?iu:un;return t&&cr(e,u,t)&&(u=void 0),n(e,Zd(u,3))},kt.find=da,kt.findIndex=Cr,kt.findKey=function(e,u){return gu(e,Zd(u,3),cn)},kt.findLast=ra,kt.findLastIndex=Pr,kt.findLastKey=function(e,u){return gu(e,Zd(u,3),on)},kt.floor=io,kt.forEach=aa,kt.forEachRight=ca,kt.forIn=function(e,u){return null==e?e:rn(e,Zd(u,3),_c)},kt.forInRight=function(e,u){return null==e?e:an(e,Zd(u,3),_c)},kt.forOwn=function(e,u){return e&&cn(e,Zd(u,3))},kt.forOwnRight=function(e,u){return e&&on(e,Zd(u,3))},kt.get=mc,kt.gt=ja,kt.gte=Na,kt.has=function(e,u){return null!=e&&nr(e,u,hn)},kt.hasIn=hc,kt.head=Mr,kt.identity=qc,kt.includes=function(e,u,t,n){e=Ma(e)?e:Oc(e),t=t&&!n?tc(t):0;var d=e.length;return t<0&&(t=rt(d+t,0)),Ja(e)?t<=d&&e.indexOf(u,t)>-1:!!d&&xu(e,u,t)>-1},kt.indexOf=function(e,u,t){var n=null==e?0:e.length;if(!n)return-1;var d=null==t?0:tc(t);return d<0&&(d=rt(n+d,0)),xu(e,u,d)},kt.inRange=function(e,u,t){return u=uc(u),void 0===t?(t=u,u=0):t=uc(t),function(e,u,t){return e>=at(u,t)&&e=-9007199254740991&&e<=9007199254740991},kt.isSet=Va,kt.isString=Ja,kt.isSymbol=Za,kt.isTypedArray=Qa,kt.isUndefined=function(e){return void 0===e},kt.isWeakMap=function(e){return $a(e)&&tr(e)==w},kt.isWeakSet=function(e){return $a(e)&&"[object WeakSet]"==pn(e)},kt.join=function(e,u){return null==e?"":nt.call(e,u)},kt.kebabCase=Pc,kt.last=Br,kt.lastIndexOf=function(e,u,t){var n=null==e?0:e.length;if(!n)return-1;var d=n;return void 0!==t&&(d=(d=tc(t))<0?rt(n+d,0):at(d,n-1)),u==u?function(e,u,t){for(var n=t+1;n--;)if(e[n]===u)return n;return n}(e,u,d):_u(e,Eu,d,!0)},kt.lowerCase=Tc,kt.lowerFirst=Mc,kt.lt=Ya,kt.lte=Xa,kt.max=function(e){return e&&e.length?tn(e,qc,mn):void 0},kt.maxBy=function(e,u){return e&&e.length?tn(e,Zd(u,2),mn):void 0},kt.mean=function(e){return Iu(e,qc)},kt.meanBy=function(e,u){return Iu(e,Zd(u,2))},kt.min=function(e){return e&&e.length?tn(e,qc,An):void 0},kt.minBy=function(e,u){return e&&e.length?tn(e,Zd(u,2),An):void 0},kt.stubArray=no,kt.stubFalse=ro,kt.stubObject=function(){return{}},kt.stubString=function(){return""},kt.stubTrue=function(){return!0},kt.multiply=lo,kt.nth=function(e,u){return e&&e.length?Cn(e,tc(u)):void 0},kt.noConflict=function(){return Ke._===this&&(Ke._=je),this},kt.noop=Zc,kt.now=ma,kt.pad=function(e,u,t){e=ac(e);var n=(u=tc(u))?qu(e):0;if(!u||n>=u)return e;var d=(u-n)/2;return Pd(Xu(d),t)+e+Pd(Yu(d),t)},kt.padEnd=function(e,u,t){e=ac(e);var n=(u=tc(u))?qu(e):0;return u&&nu){var n=e;e=u,u=n}if(t||e%1||u%1){var d=it();return at(e+d*(u-e+$e("1e-"+((d+"").length-1))),u)}return Ln(e,u)},kt.reduce=function(e,u,t){var n=Pa(e)?hu:ku,d=arguments.length<3;return n(e,Zd(u,4),t,d,Xt)},kt.reduceRight=function(e,u,t){var n=Pa(e)?vu:ku,d=arguments.length<3;return n(e,Zd(u,4),t,d,en)},kt.repeat=function(e,u,t){return u=(t?cr(e,u,t):void 0===u)?1:tc(u),Fn(ac(e),u)},kt.replace=function(){var e=arguments,u=ac(e[0]);return e.length<3?u:u.replace(e[1],e[2])},kt.result=function(e,u,t){var n=-1,d=(u=cd(u,e)).length;for(d||(d=1,e=void 0);++n9007199254740991)return[];var t=4294967295,n=at(e,4294967295);e-=4294967295;for(var d=ju(n,u=Zd(u));++t=r)return e;var c=t-qu(n);if(c<1)return n;var o=a?id(a,0,c).join(""):e.slice(0,c);if(void 0===d)return o+n;if(a&&(c+=o.length-c),Ka(d)){if(e.slice(c).search(d)){var i,f=o;for(d.global||(d=ve(d.source,ac(ne.exec(d))+"g")),d.lastIndex=0;i=d.exec(f);)var l=i.index;o=o.slice(0,void 0===l?c:l)}}else if(e.indexOf(Qn(d),c)!=c){var s=o.lastIndexOf(d);s>-1&&(o=o.slice(0,s))}return o+n},kt.unescape=function(e){return(e=ac(e))&&B.test(e)?e.replace(L,Ku):e},kt.uniqueId=function(e){var u=++Se;return ac(e)+u},kt.upperCase=Fc,kt.upperFirst=Bc,kt.each=aa,kt.eachRight=ca,kt.first=Mr,Jc(kt,(fo={},cn(kt,(function(e,u){Ie.call(kt.prototype,u)||(fo[u]=e)})),fo),{chain:!1}),kt.VERSION="4.17.15",cu(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){kt[e].placeholder=kt})),cu(["drop","take"],(function(e,u){Ct.prototype[e]=function(t){t=void 0===t?1:rt(tc(t),0);var n=this.__filtered__&&!u?new Ct(this):this.clone();return n.__filtered__?n.__takeCount__=at(t,n.__takeCount__):n.__views__.push({size:at(t,4294967295),type:e+(n.__dir__<0?"Right":"")}),n},Ct.prototype[e+"Right"]=function(u){return this.reverse()[e](u).reverse()}})),cu(["filter","map","takeWhile"],(function(e,u){var t=u+1,n=1==t||3==t;Ct.prototype[e]=function(e){var u=this.clone();return u.__iteratees__.push({iteratee:Zd(e,3),type:t}),u.__filtered__=u.__filtered__||n,u}})),cu(["head","last"],(function(e,u){var t="take"+(u?"Right":"");Ct.prototype[e]=function(){return this[t](1).value()[0]}})),cu(["initial","tail"],(function(e,u){var t="drop"+(u?"":"Right");Ct.prototype[e]=function(){return this.__filtered__?new Ct(this):this[t](1)}})),Ct.prototype.compact=function(){return this.filter(qc)},Ct.prototype.find=function(e){return this.filter(e).head()},Ct.prototype.findLast=function(e){return this.reverse().find(e)},Ct.prototype.invokeMap=Bn((function(e,u){return"function"==typeof e?new Ct(this):this.map((function(t){return yn(t,e,u)}))})),Ct.prototype.reject=function(e){return this.filter(Ea(Zd(e)))},Ct.prototype.slice=function(e,u){e=tc(e);var t=this;return t.__filtered__&&(e>0||u<0)?new Ct(t):(e<0?t=t.takeRight(-e):e&&(t=t.drop(e)),void 0!==u&&(t=(u=tc(u))<0?t.dropRight(-u):t.take(u-e)),t)},Ct.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},Ct.prototype.toArray=function(){return this.take(4294967295)},cn(Ct.prototype,(function(e,u){var t=/^(?:filter|find|map|reject)|While$/.test(u),n=/^(?:head|last)$/.test(u),d=kt[n?"take"+("last"==u?"Right":""):u],r=n||/^find/.test(u);d&&(kt.prototype[u]=function(){var u=this.__wrapped__,a=n?[1]:arguments,c=u instanceof Ct,o=a[0],i=c||Pa(u),f=function(e){var u=d.apply(kt,mu([e],a));return n&&l?u[0]:u};i&&t&&"function"==typeof o&&1!=o.length&&(c=i=!1);var l=this.__chain__,s=!!this.__actions__.length,p=r&&!l,m=c&&!s;if(!r&&i){u=m?u:new Ct(this);var h=e.apply(u,a);return h.__actions__.push({func:ua,args:[f],thisArg:void 0}),new Nt(h,l)}return p&&m?e.apply(this,a):(h=this.thru(f),p?n?h.value()[0]:h.value():h)})})),cu(["pop","push","shift","sort","splice","unshift"],(function(e){var u=ge[e],t=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",n=/^(?:pop|shift)$/.test(e);kt.prototype[e]=function(){var e=arguments;if(n&&!this.__chain__){var d=this.value();return u.apply(Pa(d)?d:[],e)}return this[t]((function(t){return u.apply(Pa(t)?t:[],e)}))}})),cn(Ct.prototype,(function(e,u){var t=kt[u];if(t){var n=t.name+"";Ie.call(yt,n)||(yt[n]=[]),yt[n].push({name:u,func:t})}})),yt[Od(void 0,2).name]=[{name:"wrapper",func:void 0}],Ct.prototype.clone=function(){var e=new Ct(this.__wrapped__);return e.__actions__=bd(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=bd(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=bd(this.__views__),e},Ct.prototype.reverse=function(){if(this.__filtered__){var e=new Ct(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},Ct.prototype.value=function(){var e=this.__wrapped__.value(),u=this.__dir__,t=Pa(e),n=u<0,d=t?e.length:0,r=function(e,u,t){var n=-1,d=t.length;for(;++n=this.__values__.length;return{done:e,value:e?void 0:this.__values__[this.__index__++]}},kt.prototype.plant=function(e){for(var u,t=this;t instanceof jt;){var n=kr(t);n.__index__=0,n.__values__=void 0,u?d.__wrapped__=n:u=n;var d=n;t=t.__wrapped__}return d.__wrapped__=e,u},kt.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof Ct){var u=e;return this.__actions__.length&&(u=new Ct(this)),(u=u.reverse()).__actions__.push({func:ua,args:[Wr],thisArg:void 0}),new Nt(u,this.__chain__)}return this.thru(Wr)},kt.prototype.toJSON=kt.prototype.valueOf=kt.prototype.value=function(){return td(this.__wrapped__,this.__actions__)},kt.prototype.first=kt.prototype.head,Ye&&(kt.prototype[Ye]=function(){return this}),kt}();Ke._=Vu,void 0===(d=function(){return Vu}.call(u,t,u,n))||(n.exports=d)}).call(this)}).call(this,t(76),t(496)(e))},494:function(e,u,t){"use strict";var n=t(0),d=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});u.a=d},496:function(e,u){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},509:function(e,u,t){"use strict";var n=SyntaxError,d=Function,r=TypeError,a=function(e){try{return d('"use strict"; return ('+e+").constructor;")()}catch(u){}},c=Object.getOwnPropertyDescriptor;if(c)try{c({},"")}catch(k){c=null}var o=function(){throw new r},i=c?function(){try{return o}catch(e){try{return c(arguments,"callee").get}catch(u){return o}}}():o,f=t(547)(),l=Object.getPrototypeOf||function(e){return e.__proto__},s={},p="undefined"==typeof Uint8Array?void 0:l(Uint8Array),m={"%AggregateError%":"undefined"==typeof AggregateError?void 0:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?void 0:ArrayBuffer,"%ArrayIteratorPrototype%":f?l([][Symbol.iterator]()):void 0,"%AsyncFromSyncIteratorPrototype%":void 0,"%AsyncFunction%":s,"%AsyncGenerator%":s,"%AsyncGeneratorFunction%":s,"%AsyncIteratorPrototype%":s,"%Atomics%":"undefined"==typeof Atomics?void 0:Atomics,"%BigInt%":"undefined"==typeof BigInt?void 0:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?void 0:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?void 0:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?void 0:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?void 0:FinalizationRegistry,"%Function%":d,"%GeneratorFunction%":s,"%Int8Array%":"undefined"==typeof Int8Array?void 0:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?void 0:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?void 0:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":f?l(l([][Symbol.iterator]())):void 0,"%JSON%":"object"==typeof JSON?JSON:void 0,"%Map%":"undefined"==typeof Map?void 0:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&f?l((new Map)[Symbol.iterator]()):void 0,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?void 0:Promise,"%Proxy%":"undefined"==typeof Proxy?void 0:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?void 0:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?void 0:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&f?l((new Set)[Symbol.iterator]()):void 0,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?void 0:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":f?l(""[Symbol.iterator]()):void 0,"%Symbol%":f?Symbol:void 0,"%SyntaxError%":n,"%ThrowTypeError%":i,"%TypedArray%":p,"%TypeError%":r,"%Uint8Array%":"undefined"==typeof Uint8Array?void 0:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?void 0:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?void 0:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?void 0:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?void 0:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?void 0:WeakSet},h={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},v=t(510),b=t(550),y=v.call(Function.call,Array.prototype.concat),g=v.call(Function.apply,Array.prototype.splice),_=v.call(Function.call,String.prototype.replace),x=v.call(Function.call,String.prototype.slice),w=v.call(Function.call,RegExp.prototype.exec),E=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,I=/\\(\\)?/g,S=function(e){var u=x(e,0,1),t=x(e,-1);if("%"===u&&"%"!==t)throw new n("invalid intrinsic syntax, expected closing `%`");if("%"===t&&"%"!==u)throw new n("invalid intrinsic syntax, expected opening `%`");var d=[];return _(e,E,(function(e,u,t,n){d[d.length]=t?_(n,I,"$1"):u||e})),d},A=function(e,u){var t,d=e;if(b(h,d)&&(d="%"+(t=h[d])[0]+"%"),b(m,d)){var c=m[d];if(c===s&&(c=function e(u){var t;if("%AsyncFunction%"===u)t=a("async function () {}");else if("%GeneratorFunction%"===u)t=a("function* () {}");else if("%AsyncGeneratorFunction%"===u)t=a("async function* () {}");else if("%AsyncGenerator%"===u){var n=e("%AsyncGeneratorFunction%");n&&(t=n.prototype)}else if("%AsyncIteratorPrototype%"===u){var d=e("%AsyncGenerator%");d&&(t=l(d.prototype))}return m[u]=t,t}(d)),void 0===c&&!u)throw new r("intrinsic "+e+" exists, but is not available. Please file an issue!");return{alias:t,name:d,value:c}}throw new n("intrinsic "+e+" does not exist!")};e.exports=function(e,u){if("string"!=typeof e||0===e.length)throw new r("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof u)throw new r('"allowMissing" argument must be a boolean');if(null===w(/^%?[^%]*%?$/,e))throw new n("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var t=S(e),d=t.length>0?t[0]:"",a=A("%"+d+"%",u),o=a.name,i=a.value,f=!1,l=a.alias;l&&(d=l[0],g(t,y([0,1],l)));for(var s=1,p=!0;s=t.length){var E=c(i,h);i=(p=!!E)&&"get"in E&&!("originalValue"in E.get)?E.get:i[h]}else p=b(i,h),i=i[h];p&&!f&&(m[o]=i)}}return i}},510:function(e,u,t){"use strict";var n=t(549);e.exports=Function.prototype.bind||n},511:function(e,u,t){"use strict";var n=String.prototype.replace,d=/%20/g,r="RFC1738",a="RFC3986";e.exports={default:a,formatters:{RFC1738:function(e){return n.call(e,d,"+")},RFC3986:function(e){return String(e)}},RFC1738:r,RFC3986:a}},518:function(e,u,t){"use strict";var n=t(511),d=Object.prototype.hasOwnProperty,r=Array.isArray,a=function(){for(var e=[],u=0;u<256;++u)e.push("%"+((u<16?"0":"")+u.toString(16)).toUpperCase());return e}(),c=function(e,u){for(var t=u&&u.plainObjects?Object.create(null):{},n=0;n1;){var u=e.pop(),t=u.obj[u.prop];if(r(t)){for(var n=[],d=0;d=48&&f<=57||f>=65&&f<=90||f>=97&&f<=122||r===n.RFC1738&&(40===f||41===f)?o+=c.charAt(i):f<128?o+=a[f]:f<2048?o+=a[192|f>>6]+a[128|63&f]:f<55296||f>=57344?o+=a[224|f>>12]+a[128|f>>6&63]+a[128|63&f]:(i+=1,f=65536+((1023&f)<<10|1023&c.charCodeAt(i)),o+=a[240|f>>18]+a[128|f>>12&63]+a[128|f>>6&63]+a[128|63&f])}return o},isBuffer:function(e){return!(!e||"object"!=typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},maybeMap:function(e,u){if(r(e)){for(var t=[],n=0;n{if("string"!=typeof e)throw new TypeError("Expected a string");return e=(e=(e=n(e)).toLowerCase().replace(/[_-]+/g," ").replace(/\s{2,}/g," ").trim()).charAt(0).toUpperCase()+e.slice(1)};e.exports=d,e.exports.default=d},526:function(e,u){e.exports=Object.is||function(e,u){return e===u?0!==e||1/e==1/u:e!=e&&u!=u}},529:function(e,u,t){"use strict";var n=t(30),d=t(12),r=t(27),a=t(91),c=t(92),o=t(26),i=t(585),f=t(93);d(d.S+d.F*!t(83)((function(e){Array.from(e)})),"Array",{from:function(e){var u,t,d,l,s=r(e),p="function"==typeof this?this:Array,m=arguments.length,h=m>1?arguments[1]:void 0,v=void 0!==h,b=0,y=f(s);if(v&&(h=n(h,m>2?arguments[2]:void 0,2)),null==y||p==Array&&c(y))for(t=new p(u=o(s.length));u>b;b++)i(t,b,v?h(s[b],b):s[b]);else for(l=y.call(s),t=new p;!(d=l.next()).done;b++)i(t,b,v?a(l,h,[d.value,b],!0):d.value);return t.length=b,t}})},530:function(e,u,t){"use strict";var n=t(586),d=t(532);e.exports=t(587)("Set",(function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(e){return n.def(d(this,"Set"),e=0===e?0:e,e)}},n)},531:function(e,u,t){var n=t(40)("meta"),d=t(13),r=t(31),a=t(28).f,c=0,o=Object.isExtensible||function(){return!0},i=!t(14)((function(){return o(Object.preventExtensions({}))})),f=function(e){a(e,n,{value:{i:"O"+ ++c,w:{}}})},l=e.exports={KEY:n,NEED:!1,fastKey:function(e,u){if(!d(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!r(e,n)){if(!o(e))return"F";if(!u)return"E";f(e)}return e[n].i},getWeak:function(e,u){if(!r(e,n)){if(!o(e))return!0;if(!u)return!1;f(e)}return e[n].w},onFreeze:function(e){return i&&l.NEED&&o(e)&&!r(e,n)&&f(e),e}}},532:function(e,u,t){var n=t(13);e.exports=function(e,u){if(!n(e)||e._t!==u)throw TypeError("Incompatible receiver, "+u+" required!");return e}},533:function(e,u,t){"use strict";const n=t(534);e.exports=(e,u)=>{if("string"!=typeof e)throw new TypeError("Expected a string");u=void 0===u?"_":u;const t=n("([\\p{Ll}\\d])(\\p{Lu})","g"),d=n("(\\p{Lu}+)(\\p{Lu}[\\p{Ll}\\d]+)","g");return e.replace(t,`$1${u}$2`).replace(d,`$1${u}$2`).toLowerCase()}},534:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0});var n=l(t(535)),d=l(t(536)),r=l(t(537)),a=l(t(538)),c=l(t(539)),o=l(t(540)),i=l(t(541)),f=l(t(542));function l(e){return e&&e.__esModule?e:{default:e}}(0,d.default)(n.default),(0,r.default)(n.default),(0,a.default)(n.default),(0,c.default)(n.default),(0,o.default)(n.default),(0,i.default)(n.default),(0,f.default)(n.default),u.default=n.default,e.exports=u.default},535:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0});var n={astral:!1},d={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},r={},a={},c={},o=[],i={default:/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,class:/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},f=/\$(?:{([\w$]+)}|<([\w$]+)>|(\d\d?|[\s\S]))/g,l=void 0===d.exec.call(/()??/,"")[1],s=void 0!==/x/.flags,p={}.toString;function m(e){var u=!0;try{new RegExp("",e)}catch(t){u=!1}return u}var h=m("u"),v=m("y"),b={g:!0,i:!0,m:!0,u:h,y:v};function y(e,u,t,n,d){var r=void 0;if(e.xregexp={captureNames:u},d)return e;if(e.__proto__)e.__proto__=C.prototype;else for(r in C.prototype)e[r]=C.prototype[r];return e.xregexp.source=t,e.xregexp.flags=n?n.split("").sort().join(""):n,e}function g(e){return d.replace.call(e,/([\s\S])(?=[\s\S]*\1)/g,"")}function _(e,u){if(!C.isRegExp(e))throw new TypeError("Type RegExp expected");var t=e.xregexp||{},n=function(e){return s?e.flags:d.exec.call(/\/([a-z]*)$/i,RegExp.prototype.toString.call(e))[1]}(e),r="",a="",c=null,o=null;return(u=u||{}).removeG&&(a+="g"),u.removeY&&(a+="y"),a&&(n=d.replace.call(n,new RegExp("["+a+"]+","g"),"")),u.addG&&(r+="g"),u.addY&&(r+="y"),r&&(n=g(n+r)),u.isInternalOnly||(void 0!==t.source&&(c=t.source),null!=t.flags&&(o=r?g(t.flags+r):t.flags)),e=y(new RegExp(u.source||e.source,n),function(e){return!(!e.xregexp||!e.xregexp.captureNames)}(e)?t.captureNames.slice(0):null,c,o,u.isInternalOnly)}function x(e){return parseInt(e,16)}function w(e,u,t){return"("===e.input[e.index-1]||")"===e.input[e.index+e[0].length]||function(e,u,t){return d.test.call(-1!==t.indexOf("x")?/^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/,e.slice(u))}(e.input,e.index+e[0].length,t)?"":"(?:)"}function E(e){return parseInt(e,10).toString(16)}function I(e,u){return p.call(e)==="[object "+u+"]"}function S(e){for(;e.length<4;)e="0"+e;return e}function A(e){var u={};return I(e,"String")?(C.forEach(e,/[^\s,]+/,(function(e){u[e]=!0})),u):e}function k(e){if(!/^[\w$]$/.test(e))throw new Error("Flag must be a single character A-Za-z0-9_$");b[e]=!0}function O(e,u,t,n,d){for(var r=o.length,a=e[t],c=null,i=void 0,f=void 0;r--;)if(!((f=o[r]).leadChar&&f.leadChar!==a||f.scope!==n&&"all"!==f.scope||f.flag&&-1===u.indexOf(f.flag))&&(i=C.exec(e,f.regex,t,"sticky"))){c={matchLength:i[0].length,output:f.handler.call(d,i,n,u),reparse:f.reparse};break}return c}function j(e){n.astral=e}function N(e){if(null==e)throw new TypeError("Cannot convert null or undefined to object");return e}function C(e,u){if(C.isRegExp(e)){if(void 0!==u)throw new TypeError("Cannot supply flags when copying a RegExp");return _(e)}if(e=void 0===e?"":String(e),u=void 0===u?"":String(u),C.isInstalled("astral")&&-1===u.indexOf("A")&&(u+="A"),c[e]||(c[e]={}),!c[e][u]){for(var t={hasNamedCapture:!1,captureNames:[]},n="default",r="",a=0,o=void 0,f=function(e,u){var t=void 0;if(g(u)!==u)throw new SyntaxError("Invalid duplicate regex flag "+u);for(e=d.replace.call(e,/^\(\?([\w$]+)\)/,(function(e,t){if(d.test.call(/[gy]/,t))throw new SyntaxError("Cannot use flag g or y in mode modifier "+e);return u=g(u+t),""})),t=0;t"}else if(t)return"\\"+(+t+a);return e}if(!I(e,"Array")||!e.length)throw new TypeError("Must provide a nonempty array of patterns to merge");for(var i=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,f=[],l=void 0,s=0;s1&&-1!==t.indexOf("")){var n=_(this,{removeG:!0,isInternalOnly:!0});d.replace.call(String(e).slice(t.index),n,(function(){for(var e=arguments.length,u=Array(e),n=0;nt.index&&(this.lastIndex=t.index)}return this.global||(this.lastIndex=u),t},r.test=function(e){return!!r.exec.call(this,e)},r.match=function(e){if(C.isRegExp(e)){if(e.global){var u=d.match.apply(this,arguments);return e.lastIndex=0,u}}else e=new RegExp(e);return r.exec.call(e,N(this))},r.replace=function(e,u){var t=C.isRegExp(e),n=void 0,r=void 0,a=void 0;return t?(e.xregexp&&(r=e.xregexp.captureNames),n=e.lastIndex):e+="",a=I(u,"Function")?d.replace.call(String(this),e,(function(){for(var n=arguments.length,d=Array(n),a=0;at.length-3)throw new SyntaxError("Backreference to undefined group "+e);return t[d]||""}throw new SyntaxError("Invalid token "+e)}})),t&&(e.global?e.lastIndex=0:e.lastIndex=n),a},r.split=function(e,u){if(!C.isRegExp(e))return d.split.apply(this,arguments);var t=String(this),n=[],r=e.lastIndex,a=0,c=void 0;return u=(void 0===u?-1:u)>>>0,C.forEach(t,e,(function(e){e.index+e[0].length>a&&(n.push(t.slice(a,e.index)),e.length>1&&e.indexu?n.slice(0,u):n},C.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,(function(e,u){if("B"===e[1]&&"default"===u)return e[0];throw new SyntaxError("Invalid escape "+e[0])}),{scope:"all",leadChar:"\\"}),C.addToken(/\\u{([\dA-Fa-f]+)}/,(function(e,u,t){var n=x(e[1]);if(n>1114111)throw new SyntaxError("Invalid Unicode code point "+e[0]);if(n<=65535)return"\\u"+S(E(n));if(h&&-1!==t.indexOf("u"))return e[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u")}),{scope:"all",leadChar:"\\"}),C.addToken(/\[(\^?)\]/,(function(e){return e[1]?"[\\s\\S]":"\\b\\B"}),{leadChar:"["}),C.addToken(/\(\?#[^)]*\)/,w,{leadChar:"("}),C.addToken(/\s+|#[^\n]*\n?/,w,{flag:"x"}),C.addToken(/\./,(function(){return"[\\s\\S]"}),{flag:"s",leadChar:"."}),C.addToken(/\\k<([\w$]+)>/,(function(e){var u=isNaN(e[1])?this.captureNames.indexOf(e[1])+1:+e[1],t=e.index+e[0].length;if(!u||u>this.captureNames.length)throw new SyntaxError("Backreference to undefined group "+e[0]);return"\\"+u+(t===e.input.length||isNaN(e.input[t])?"":"(?:)")}),{leadChar:"\\"}),C.addToken(/\\(\d+)/,(function(e,u){if(!("default"===u&&/^[1-9]/.test(e[1])&&+e[1]<=this.captureNames.length)&&"0"!==e[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group "+e[0]);return e[0]}),{scope:"all",leadChar:"\\"}),C.addToken(/\(\?P?<([\w$]+)>/,(function(e){if(!isNaN(e[1]))throw new SyntaxError("Cannot use integer as capture name "+e[0]);if("length"===e[1]||"__proto__"===e[1])throw new SyntaxError("Cannot use reserved word as capture name "+e[0]);if(-1!==this.captureNames.indexOf(e[1]))throw new SyntaxError("Cannot use same name for multiple groups "+e[0]);return this.captureNames.push(e[1]),this.hasNamedCapture=!0,"("}),{leadChar:"("}),C.addToken(/\((?!\?)/,(function(e,u,t){return-1!==t.indexOf("n")?"(?:":(this.captureNames.push(null),"(")}),{optionalFlags:"n",leadChar:"("}),u.default=C,e.exports=u.default},536:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){var u=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,t=e.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,u],"g",{conjunction:"or"});function n(e){var u=/^(?:\(\?:\))*\^/,t=/\$(?:\(\?:\))*$/;return u.test(e)&&t.test(e)&&t.test(e.replace(/\\[\s\S]/g,""))?e.replace(u,"").replace(t,""):e}function d(u,t){var n=t?"x":"";return e.isRegExp(u)?u.xregexp&&u.xregexp.captureNames?u:e(u.source,n):e(u,n)}function r(u){return u instanceof RegExp?u:e.escape(u)}function a(e,u,t){return e["subpattern"+t]=u,e}function c(e,u,t){return e+(u1?n-1:0),o=1;o"):o="(?:",h=m,""+o+f[a].pattern.replace(u,(function(e,u,t){if(u){if(c=f[a].names[m-h],++m,c)return"(?<"+c+">"}else if(t)return i=+t-1,f[a].names[i]?"\\k<"+f[a].names[i]+">":"\\"+(+t+h);return e}))+")"}if(d){if(c=y[v],b[++v]=++m,c)return"(?<"+c+">"}else if(r)return y[i=+r-1]?"\\k<"+y[i]+">":"\\"+b[+r];return e}));return e(g,c)}},e.exports=u.default},537:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){function u(e,u,t,n){return{name:e,value:u,start:t,end:n}}e.matchRecursive=function(t,n,d,r,a){a=a||{};var c=-1!==(r=r||"").indexOf("g"),o=-1!==r.indexOf("y"),i=r.replace(/y/g,""),f=a.escapeChar,l=a.valueNames,s=[],p=0,m=0,h=0,v=0,b=void 0,y=void 0,g=void 0,_=void 0,x=void 0;if(n=e(n,i),d=e(d,i),f){if(f.length>1)throw new Error("Cannot use more than one escape character");f=e.escape(f),x=new RegExp("(?:"+f+"[\\S\\s]|(?:(?!"+e.union([n,d],"",{conjunction:"or"}).source+")[^"+f+"])+)+",r.replace(/[^imu]+/g,""))}for(;;){if(f&&(h+=(e.exec(t,x,h,"sticky")||[""])[0].length),g=e.exec(t,n,h),_=e.exec(t,d,h),g&&_&&(g.index<=_.index?_=null:g=null),g||_)h=(m=(g||_).index)+(g||_)[0].length;else if(!p)break;if(o&&!p&&m>v)break;if(g)p||(b=m,y=h),++p;else{if(!_||!p)throw new Error("Unbalanced delimiter found in string");if(!--p&&(l?(l[0]&&b>v&&s.push(u(l[0],t.slice(v,b),v,b)),l[1]&&s.push(u(l[1],t.slice(b,y),b,y)),l[2]&&s.push(u(l[2],t.slice(y,m),y,m)),l[3]&&s.push(u(l[3],t.slice(m,h),m,h))):s.push(t.slice(y,m)),v=h,!c))break}m===h&&++h}return c&&!o&&l&&l[0]&&t.length>v&&s.push(u(l[0],t.slice(v),v,t.length)),s}},e.exports=u.default},538:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){var u={},t=e._dec,n=e._hex,d=e._pad4;function r(e){return e.replace(/[- _]+/g,"").toLowerCase()}function a(e){var u=/^\\[xu](.+)/.exec(e);return u?t(u[1]):e.charCodeAt("\\"===e[0]?1:0)}function c(t){var r,c,o;return u[t]["b!"]||(u[t]["b!"]=(r=u[t].bmp,c="",o=-1,e.forEach(r,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,(function(e){var u=a(e[1]);u>o+1&&(c+="\\u"+d(n(o+1)),u>o+2&&(c+="-\\u"+d(n(u-1)))),o=a(e[2]||e[1])})),o<65535&&(c+="\\u"+d(n(o+1)),o<65534&&(c+="-\\uFFFF")),c))}function o(e,t){var n=t?"a!":"a=";return u[e][n]||(u[e][n]=function(e,t){var n=u[e],d="";return n.bmp&&!n.isBmpLast&&(d="["+n.bmp+"]"+(n.astral?"|":"")),n.astral&&(d+=n.astral),n.isBmpLast&&n.bmp&&(d+=(n.astral?"|":"")+"["+n.bmp+"]"),t?"(?:(?!"+d+")(?:[\ud800-\udbff][\udc00-\udfff]|[\0-\uffff]))":"(?:"+d+")"}(e,t))}e.addToken(/\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/,(function(e,t,n){var d="P"===e[1]||!!e[2],a=-1!==n.indexOf("A"),i=r(e[4]||e[3]),f=u[i];if("P"===e[1]&&e[2])throw new SyntaxError("Invalid double negation "+e[0]);if(!u.hasOwnProperty(i))throw new SyntaxError("Unknown Unicode token "+e[0]);if(f.inverseOf){if(i=r(f.inverseOf),!u.hasOwnProperty(i))throw new ReferenceError("Unicode token missing data "+e[0]+" -> "+f.inverseOf);f=u[i],d=!d}if(!f.bmp&&!a)throw new SyntaxError("Astral mode required for Unicode token "+e[0]);if(a){if("class"===t)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");return o(i,d)}return"class"===t?d?c(i):f.bmp:(d?"[^":"[")+f.bmp+"]"}),{scope:"all",optionalFlags:"A",leadChar:"\\"}),e.addUnicodeData=function(t){for(var n=void 0,d=0;d\\x5E`\\x7C~\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20be\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83b[\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\x24\xa2-\xa5\u058f\u060b\u09f2\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20be\ua838\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\x5E`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u309b\u309c\ua700-\ua716\ua720\ua721\ua789\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3",astral:"\ud83c[\udffb-\udfff]"},{name:"Sm",alias:"Math_Symbol",bmp:"\\x2B<->\\x7C~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec",astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"\xa6\xa9\xae\xb0\u0482\u058d\u058e\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u214a\u214c\u214d\u214f\u218a\u218b\u2195-\u2199\u219c-\u219f\u21a1\u21a2\u21a4\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udffa]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Z",alias:"Separator",bmp:" \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:" \xa0\u1680\u2000-\u200a\u202f\u205f\u3000"}])},e.exports=u.default},541:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");var u=[{name:"ASCII",bmp:"\0-\x7f"},{name:"Alphabetic",bmp:"A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0345\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05b0-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0657\u0659-\u065f\u066e-\u06d3\u06d5-\u06dc\u06e1-\u06e8\u06ed-\u06ef\u06fa-\u06fc\u06ff\u0710-\u073f\u074d-\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0817\u081a-\u082c\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08df\u08e3-\u08e9\u08f0-\u093b\u093d-\u094c\u094e-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c4\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac5\u0ac7-\u0ac9\u0acb\u0acc\u0ad0\u0ae0-\u0ae3\u0af9\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d-\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4c\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccc\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e46\u0e4d\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ecd\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f71-\u0f81\u0f88-\u0f97\u0f99-\u0fbc\u1000-\u1036\u1038\u103b-\u103f\u1050-\u1062\u1065-\u1068\u106e-\u1086\u108e\u109c\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135f\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17b3\u17b6-\u17c8\u17d7\u17dc\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u1938\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a61-\u1a74\u1aa7\u1b00-\u1b33\u1b35-\u1b43\u1b45-\u1b4b\u1b80-\u1ba9\u1bac-\u1baf\u1bba-\u1be5\u1be7-\u1bf1\u1c00-\u1c35\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1de7-\u1df4\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua674-\ua67b\ua67f-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua827\ua840-\ua873\ua880-\ua8c3\ua8c5\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua92a\ua930-\ua952\ua960-\ua97c\ua980-\ua9b2\ua9b4-\ua9bf\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a\uaa7e-\uaabe\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc00-\udc45\udc82-\udcb8\udcd0-\udce8\udd00-\udd32\udd50-\udd72\udd76\udd80-\uddbf\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude34\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udee8\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d-\udf44\udf47\udf48\udf4b\udf4c\udf50\udf57\udf5d-\udf63]|\ud805[\udc00-\udc41\udc43-\udc45\udc47-\udc4a\udc80-\udcc1\udcc4\udcc5\udcc7\udd80-\uddb5\uddb8-\uddbe\uddd8-\udddd\ude00-\ude3e\ude40\ude44\ude80-\udeb5\udf00-\udf19\udf1d-\udf2a]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc3e\udc40\udc72-\udc8f\udc92-\udca7\udca9-\udcb6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf36\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9e]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd47]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Any",isBmpLast:!0,bmp:"\0-\uffff",astral:"[\ud800-\udbff][\udc00-\udfff]"},{name:"Default_Ignorable_Code_Point",bmp:"\xad\u034f\u061c\u115f\u1160\u17b4\u17b5\u180b-\u180e\u200b-\u200f\u202a-\u202e\u2060-\u206f\u3164\ufe00-\ufe0f\ufeff\uffa0\ufff0-\ufff8",astral:"\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|[\udb40-\udb43][\udc00-\udfff]"},{name:"Lowercase",bmp:"a-z\xaa\xb5\xba\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02b8\u02c0\u02c1\u02e0-\u02e4\u0345\u0371\u0373\u0377\u037a-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0561-\u0587\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1dbf\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u2071\u207f\u2090-\u209c\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2170-\u217f\u2184\u24d0-\u24e9\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7d\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b-\ua69d\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7b5\ua7b7\ua7f8-\ua7fa\uab30-\uab5a\uab5c-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a",astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud83a[\udd22-\udd43]"},{name:"Noncharacter_Code_Point",bmp:"\ufdd0-\ufdef\ufffe\uffff",astral:"[\ud83f\ud87f\ud8bf\ud8ff\ud93f\ud97f\ud9bf\ud9ff\uda3f\uda7f\udabf\udaff\udb3f\udb7f\udbbf\udbff][\udffe\udfff]"},{name:"Uppercase",bmp:"A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2160-\u216f\u2183\u24b6-\u24cf\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\uff21-\uff3a",astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]"},{name:"White_Space",bmp:"\t-\r \x85\xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"}];u.push({name:"Assigned",inverseOf:"Cn"}),e.addUnicodeData(u)},e.exports=u.default},542:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");e.addUnicodeData([{name:"Adlam",astral:"\ud83a[\udd00-\udd4a\udd50-\udd59\udd5e\udd5f]"},{name:"Ahom",astral:"\ud805[\udf00-\udf19\udf1d-\udf2b\udf30-\udf3f]"},{name:"Anatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude46]"},{name:"Arabic",bmp:"\u0600-\u0604\u0606-\u060b\u060d-\u061a\u061e\u0620-\u063f\u0641-\u064a\u0656-\u066f\u0671-\u06dc\u06de-\u06ff\u0750-\u077f\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08e1\u08e3-\u08ff\ufb50-\ufbc1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfd\ufe70-\ufe74\ufe76-\ufefc",astral:"\ud803[\ude60-\ude7e]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb\udef0\udef1]"},{name:"Armenian",bmp:"\u0531-\u0556\u0559-\u055f\u0561-\u0587\u058a\u058d-\u058f\ufb13-\ufb17"},{name:"Avestan",astral:"\ud802[\udf00-\udf35\udf39-\udf3f]"},{name:"Balinese",bmp:"\u1b00-\u1b4b\u1b50-\u1b7c"},{name:"Bamum",bmp:"\ua6a0-\ua6f7",astral:"\ud81a[\udc00-\ude38]"},{name:"Bassa_Vah",astral:"\ud81a[\uded0-\udeed\udef0-\udef5]"},{name:"Batak",bmp:"\u1bc0-\u1bf3\u1bfc-\u1bff"},{name:"Bengali",bmp:"\u0980-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09fb"},{name:"Bhaiksuki",astral:"\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc45\udc50-\udc6c]"},{name:"Bopomofo",bmp:"\u02ea\u02eb\u3105-\u312d\u31a0-\u31ba"},{name:"Brahmi",astral:"\ud804[\udc00-\udc4d\udc52-\udc6f\udc7f]"},{name:"Braille",bmp:"\u2800-\u28ff"},{name:"Buginese",bmp:"\u1a00-\u1a1b\u1a1e\u1a1f"},{name:"Buhid",bmp:"\u1740-\u1753"},{name:"Canadian_Aboriginal",bmp:"\u1400-\u167f\u18b0-\u18f5"},{name:"Carian",astral:"\ud800[\udea0-\uded0]"},{name:"Caucasian_Albanian",astral:"\ud801[\udd30-\udd63\udd6f]"},{name:"Chakma",astral:"\ud804[\udd00-\udd34\udd36-\udd43]"},{name:"Cham",bmp:"\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f"},{name:"Cherokee",bmp:"\u13a0-\u13f5\u13f8-\u13fd\uab70-\uabbf"},{name:"Common",bmp:"\0-@\\x5B-`\\x7B-\xa9\xab-\xb9\xbb-\xbf\xd7\xf7\u02b9-\u02df\u02e5-\u02e9\u02ec-\u02ff\u0374\u037e\u0385\u0387\u0589\u0605\u060c\u061b\u061c\u061f\u0640\u06dd\u08e2\u0964\u0965\u0e3f\u0fd5-\u0fd8\u10fb\u16eb-\u16ed\u1735\u1736\u1802\u1803\u1805\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u2000-\u200b\u200e-\u2064\u2066-\u2070\u2074-\u207e\u2080-\u208e\u20a0-\u20be\u2100-\u2125\u2127-\u2129\u212c-\u2131\u2133-\u214d\u214f-\u215f\u2189-\u218b\u2190-\u23fe\u2400-\u2426\u2440-\u244a\u2460-\u27ff\u2900-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2e00-\u2e44\u2ff0-\u2ffb\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303c-\u303f\u309b\u309c\u30a0\u30fb\u30fc\u3190-\u319f\u31c0-\u31e3\u3220-\u325f\u327f-\u32cf\u3358-\u33ff\u4dc0-\u4dff\ua700-\ua721\ua788-\ua78a\ua830-\ua839\ua92e\ua9cf\uab5b\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe66\ufe68-\ufe6b\ufeff\uff01-\uff20\uff3b-\uff40\uff5b-\uff65\uff70\uff9e\uff9f\uffe0-\uffe6\uffe8-\uffee\ufff9-\ufffd",astral:"\ud800[\udd00-\udd02\udd07-\udd33\udd37-\udd3f\udd90-\udd9b\uddd0-\uddfc\udee1-\udefb]|\ud82f[\udca0-\udca3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd66\udd6a-\udd7a\udd83\udd84\udd8c-\udda9\uddae-\udde8\udf00-\udf56\udf60-\udf71]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udfcb\udfce-\udfff]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd00-\udd0c\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\uddff\ude01\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|\udb40[\udc01\udc20-\udc7f]"},{name:"Coptic",bmp:"\u03e2-\u03ef\u2c80-\u2cf3\u2cf9-\u2cff"},{name:"Cuneiform",astral:"\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc70-\udc74\udc80-\udd43]"},{name:"Cypriot",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f]"},{name:"Cyrillic",bmp:"\u0400-\u0484\u0487-\u052f\u1c80-\u1c88\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f"},{name:"Deseret",astral:"\ud801[\udc00-\udc4f]"},{name:"Devanagari",bmp:"\u0900-\u0950\u0953-\u0963\u0966-\u097f\ua8e0-\ua8fd"},{name:"Duployan",astral:"\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9c-\udc9f]"},{name:"Egyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]"},{name:"Elbasan",astral:"\ud801[\udd00-\udd27]"},{name:"Ethiopic",bmp:"\u1200-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u137c\u1380-\u1399\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e"},{name:"Georgian",bmp:"\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u10ff\u2d00-\u2d25\u2d27\u2d2d"},{name:"Glagolitic",bmp:"\u2c00-\u2c2e\u2c30-\u2c5e",astral:"\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]"},{name:"Gothic",astral:"\ud800[\udf30-\udf4a]"},{name:"Grantha",astral:"\ud804[\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3c-\udf44\udf47\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]"},{name:"Greek",bmp:"\u0370-\u0373\u0375-\u0377\u037a-\u037d\u037f\u0384\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03e1\u03f0-\u03ff\u1d26-\u1d2a\u1d5d-\u1d61\u1d66-\u1d6a\u1dbf\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2126\uab65",astral:"\ud800[\udd40-\udd8e\udda0]|\ud834[\ude00-\ude45]"},{name:"Gujarati",bmp:"\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0af1\u0af9"},{name:"Gurmukhi",bmp:"\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75"},{name:"Han",bmp:"\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u3005\u3007\u3021-\u3029\u3038-\u303b\u3400-\u4db5\u4e00-\u9fd5\uf900-\ufa6d\ufa70-\ufad9",astral:"[\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Hangul",bmp:"\u1100-\u11ff\u302e\u302f\u3131-\u318e\u3200-\u321e\u3260-\u327e\ua960-\ua97c\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"},{name:"Hanunoo",bmp:"\u1720-\u1734"},{name:"Hatran",astral:"\ud802[\udce0-\udcf2\udcf4\udcf5\udcfb-\udcff]"},{name:"Hebrew",bmp:"\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufb4f"},{name:"Hiragana",bmp:"\u3041-\u3096\u309d-\u309f",astral:"\ud82c\udc01|\ud83c\ude00"},{name:"Imperial_Aramaic",astral:"\ud802[\udc40-\udc55\udc57-\udc5f]"},{name:"Inherited",bmp:"\u0300-\u036f\u0485\u0486\u064b-\u0655\u0670\u0951\u0952\u1ab0-\u1abe\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u200c\u200d\u20d0-\u20f0\u302a-\u302d\u3099\u309a\ufe00-\ufe0f\ufe20-\ufe2d",astral:"\ud800[\uddfd\udee0]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad]|\udb40[\udd00-\uddef]"},{name:"Inscriptional_Pahlavi",astral:"\ud802[\udf60-\udf72\udf78-\udf7f]"},{name:"Inscriptional_Parthian",astral:"\ud802[\udf40-\udf55\udf58-\udf5f]"},{name:"Javanese",bmp:"\ua980-\ua9cd\ua9d0-\ua9d9\ua9de\ua9df"},{name:"Kaithi",astral:"\ud804[\udc80-\udcc1]"},{name:"Kannada",bmp:"\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2"},{name:"Katakana",bmp:"\u30a1-\u30fa\u30fd-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff6f\uff71-\uff9d",astral:"\ud82c\udc00"},{name:"Kayah_Li",bmp:"\ua900-\ua92d\ua92f"},{name:"Kharoshthi",astral:"\ud802[\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f-\ude47\ude50-\ude58]"},{name:"Khmer",bmp:"\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9\u19e0-\u19ff"},{name:"Khojki",astral:"\ud804[\ude00-\ude11\ude13-\ude3e]"},{name:"Khudawadi",astral:"\ud804[\udeb0-\udeea\udef0-\udef9]"},{name:"Lao",bmp:"\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf"},{name:"Latin",bmp:"A-Za-z\xaa\xba\xc0-\xd6\xd8-\xf6\xf8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua7ff\uab30-\uab5a\uab5c-\uab64\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a"},{name:"Lepcha",bmp:"\u1c00-\u1c37\u1c3b-\u1c49\u1c4d-\u1c4f"},{name:"Limbu",bmp:"\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1940\u1944-\u194f"},{name:"Linear_A",astral:"\ud801[\ude00-\udf36\udf40-\udf55\udf60-\udf67]"},{name:"Linear_B",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa]"},{name:"Lisu",bmp:"\ua4d0-\ua4ff"},{name:"Lycian",astral:"\ud800[\ude80-\ude9c]"},{name:"Lydian",astral:"\ud802[\udd20-\udd39\udd3f]"},{name:"Mahajani",astral:"\ud804[\udd50-\udd76]"},{name:"Malayalam",bmp:"\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4f\u0d54-\u0d63\u0d66-\u0d7f"},{name:"Mandaic",bmp:"\u0840-\u085b\u085e"},{name:"Manichaean",astral:"\ud802[\udec0-\udee6\udeeb-\udef6]"},{name:"Marchen",astral:"\ud807[\udc70-\udc8f\udc92-\udca7\udca9-\udcb6]"},{name:"Meetei_Mayek",bmp:"\uaae0-\uaaf6\uabc0-\uabed\uabf0-\uabf9"},{name:"Mende_Kikakui",astral:"\ud83a[\udc00-\udcc4\udcc7-\udcd6]"},{name:"Meroitic_Cursive",astral:"\ud802[\udda0-\uddb7\uddbc-\uddcf\uddd2-\uddff]"},{name:"Meroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"Miao",astral:"\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]"},{name:"Modi",astral:"\ud805[\ude00-\ude44\ude50-\ude59]"},{name:"Mongolian",bmp:"\u1800\u1801\u1804\u1806-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18aa",astral:"\ud805[\ude60-\ude6c]"},{name:"Mro",astral:"\ud81a[\ude40-\ude5e\ude60-\ude69\ude6e\ude6f]"},{name:"Multani",astral:"\ud804[\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea9]"},{name:"Myanmar",bmp:"\u1000-\u109f\ua9e0-\ua9fe\uaa60-\uaa7f"},{name:"Nabataean",astral:"\ud802[\udc80-\udc9e\udca7-\udcaf]"},{name:"New_Tai_Lue",bmp:"\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de\u19df"},{name:"Newa",astral:"\ud805[\udc00-\udc59\udc5b\udc5d]"},{name:"Nko",bmp:"\u07c0-\u07fa"},{name:"Ogham",bmp:"\u1680-\u169c"},{name:"Ol_Chiki",bmp:"\u1c50-\u1c7f"},{name:"Old_Hungarian",astral:"\ud803[\udc80-\udcb2\udcc0-\udcf2\udcfa-\udcff]"},{name:"Old_Italic",astral:"\ud800[\udf00-\udf23]"},{name:"Old_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"Old_Permic",astral:"\ud800[\udf50-\udf7a]"},{name:"Old_Persian",astral:"\ud800[\udfa0-\udfc3\udfc8-\udfd5]"},{name:"Old_South_Arabian",astral:"\ud802[\ude60-\ude7f]"},{name:"Old_Turkic",astral:"\ud803[\udc00-\udc48]"},{name:"Oriya",bmp:"\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b77"},{name:"Osage",astral:"\ud801[\udcb0-\udcd3\udcd8-\udcfb]"},{name:"Osmanya",astral:"\ud801[\udc80-\udc9d\udca0-\udca9]"},{name:"Pahawh_Hmong",astral:"\ud81a[\udf00-\udf45\udf50-\udf59\udf5b-\udf61\udf63-\udf77\udf7d-\udf8f]"},{name:"Palmyrene",astral:"\ud802[\udc60-\udc7f]"},{name:"Pau_Cin_Hau",astral:"\ud806[\udec0-\udef8]"},{name:"Phags_Pa",bmp:"\ua840-\ua877"},{name:"Phoenician",astral:"\ud802[\udd00-\udd1b\udd1f]"},{name:"Psalter_Pahlavi",astral:"\ud802[\udf80-\udf91\udf99-\udf9c\udfa9-\udfaf]"},{name:"Rejang",bmp:"\ua930-\ua953\ua95f"},{name:"Runic",bmp:"\u16a0-\u16ea\u16ee-\u16f8"},{name:"Samaritan",bmp:"\u0800-\u082d\u0830-\u083e"},{name:"Saurashtra",bmp:"\ua880-\ua8c5\ua8ce-\ua8d9"},{name:"Sharada",astral:"\ud804[\udd80-\uddcd\uddd0-\udddf]"},{name:"Shavian",astral:"\ud801[\udc50-\udc7f]"},{name:"Siddham",astral:"\ud805[\udd80-\uddb5\uddb8-\udddd]"},{name:"SignWriting",astral:"\ud836[\udc00-\ude8b\ude9b-\ude9f\udea1-\udeaf]"},{name:"Sinhala",bmp:"\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4",astral:"\ud804[\udde1-\uddf4]"},{name:"Sora_Sompeng",astral:"\ud804[\udcd0-\udce8\udcf0-\udcf9]"},{name:"Sundanese",bmp:"\u1b80-\u1bbf\u1cc0-\u1cc7"},{name:"Syloti_Nagri",bmp:"\ua800-\ua82b"},{name:"Syriac",bmp:"\u0700-\u070d\u070f-\u074a\u074d-\u074f"},{name:"Tagalog",bmp:"\u1700-\u170c\u170e-\u1714"},{name:"Tagbanwa",bmp:"\u1760-\u176c\u176e-\u1770\u1772\u1773"},{name:"Tai_Le",bmp:"\u1950-\u196d\u1970-\u1974"},{name:"Tai_Tham",bmp:"\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad"},{name:"Tai_Viet",bmp:"\uaa80-\uaac2\uaadb-\uaadf"},{name:"Takri",astral:"\ud805[\ude80-\udeb7\udec0-\udec9]"},{name:"Tamil",bmp:"\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bfa"},{name:"Tangut",astral:"\ud81b\udfe0|[\ud81c-\ud820][\udc00-\udfff]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]"},{name:"Telugu",bmp:"\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f"},{name:"Thaana",bmp:"\u0780-\u07b1"},{name:"Thai",bmp:"\u0e01-\u0e3a\u0e40-\u0e5b"},{name:"Tibetan",bmp:"\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc\u0fce-\u0fd4\u0fd9\u0fda"},{name:"Tifinagh",bmp:"\u2d30-\u2d67\u2d6f\u2d70\u2d7f"},{name:"Tirhuta",astral:"\ud805[\udc80-\udcc7\udcd0-\udcd9]"},{name:"Ugaritic",astral:"\ud800[\udf80-\udf9d\udf9f]"},{name:"Vai",bmp:"\ua500-\ua62b"},{name:"Warang_Citi",astral:"\ud806[\udca0-\udcf2\udcff]"},{name:"Yi",bmp:"\ua000-\ua48c\ua490-\ua4c6"}])},e.exports=u.default},543:function(e,u,t){"use strict";var n=t(0),d=t.n(n);u.a=function(e){var u=e.text;return d.a.createElement("section",{className:"empty"},d.a.createElement("div",{className:"icon"},d.a.createElement("img",{src:"/img/logo-square.svg",alt:"The Qovery Logo"})),d.a.createElement("div",{className:"text"},u))}},544:function(e,u,t){"use strict";var n=t(545),d=t(555),r=t(511);e.exports={formats:r,parse:d,stringify:n}},545:function(e,u,t){"use strict";var n=t(546),d=t(518),r=t(511),a=Object.prototype.hasOwnProperty,c={brackets:function(e){return e+"[]"},comma:"comma",indices:function(e,u){return e+"["+u+"]"},repeat:function(e){return e}},o=Array.isArray,i=String.prototype.split,f=Array.prototype.push,l=function(e,u){f.apply(e,o(u)?u:[u])},s=Date.prototype.toISOString,p=r.default,m={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:d.encode,encodeValuesOnly:!1,format:p,formatter:r.formatters[p],indices:!1,serializeDate:function(e){return s.call(e)},skipNulls:!1,strictNullHandling:!1},h={},v=function e(u,t,r,a,c,f,s,p,v,b,y,g,_,x,w,E){for(var I,S=u,A=E,k=0,O=!1;void 0!==(A=A.get(h))&&!O;){var j=A.get(u);if(k+=1,void 0!==j){if(j===k)throw new RangeError("Cyclic object value");O=!0}void 0===A.get(h)&&(k=0)}if("function"==typeof p?S=p(t,S):S instanceof Date?S=y(S):"comma"===r&&o(S)&&(S=d.maybeMap(S,(function(e){return e instanceof Date?y(e):e}))),null===S){if(c)return s&&!x?s(t,m.encoder,w,"key",g):t;S=""}if("string"==typeof(I=S)||"number"==typeof I||"boolean"==typeof I||"symbol"==typeof I||"bigint"==typeof I||d.isBuffer(S)){if(s){var N=x?t:s(t,m.encoder,w,"key",g);if("comma"===r&&x){for(var C=i.call(String(S),","),P="",T=0;T0?S.join(",")||null:void 0}];else if(o(p))M=p;else{var L=Object.keys(S);M=v?L.sort(v):L}for(var F=a&&o(S)&&1===S.length?t+"[]":t,B=0;B0?x+_:""}},546:function(e,u,t){"use strict";var n=t(509),d=t(551),r=t(553),a=n("%TypeError%"),c=n("%WeakMap%",!0),o=n("%Map%",!0),i=d("WeakMap.prototype.get",!0),f=d("WeakMap.prototype.set",!0),l=d("WeakMap.prototype.has",!0),s=d("Map.prototype.get",!0),p=d("Map.prototype.set",!0),m=d("Map.prototype.has",!0),h=function(e,u){for(var t,n=e;null!==(t=n.next);n=t)if(t.key===u)return n.next=t.next,t.next=e.next,e.next=t,t};e.exports=function(){var e,u,t,n={assert:function(e){if(!n.has(e))throw new a("Side channel does not contain "+r(e))},get:function(n){if(c&&n&&("object"==typeof n||"function"==typeof n)){if(e)return i(e,n)}else if(o){if(u)return s(u,n)}else if(t)return function(e,u){var t=h(e,u);return t&&t.value}(t,n)},has:function(n){if(c&&n&&("object"==typeof n||"function"==typeof n)){if(e)return l(e,n)}else if(o){if(u)return m(u,n)}else if(t)return function(e,u){return!!h(e,u)}(t,n);return!1},set:function(n,d){c&&n&&("object"==typeof n||"function"==typeof n)?(e||(e=new c),f(e,n,d)):o?(u||(u=new o),p(u,n,d)):(t||(t={key:{},next:null}),function(e,u,t){var n=h(e,u);n?n.value=t:e.next={key:u,next:e.next,value:t}}(t,n,d))}};return n}},547:function(e,u,t){"use strict";var n="undefined"!=typeof Symbol&&Symbol,d=t(548);e.exports=function(){return"function"==typeof n&&("function"==typeof Symbol&&("symbol"==typeof n("foo")&&("symbol"==typeof Symbol("bar")&&d())))}},548:function(e,u,t){"use strict";e.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var e={},u=Symbol("test"),t=Object(u);if("string"==typeof u)return!1;if("[object Symbol]"!==Object.prototype.toString.call(u))return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;for(u in e[u]=42,e)return!1;if("function"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var n=Object.getOwnPropertySymbols(e);if(1!==n.length||n[0]!==u)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,u))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var d=Object.getOwnPropertyDescriptor(e,u);if(42!==d.value||!0!==d.enumerable)return!1}return!0}},549:function(e,u,t){"use strict";var n="Function.prototype.bind called on incompatible ",d=Array.prototype.slice,r=Object.prototype.toString;e.exports=function(e){var u=this;if("function"!=typeof u||"[object Function]"!==r.call(u))throw new TypeError(n+u);for(var t,a=d.call(arguments,1),c=function(){if(this instanceof t){var n=u.apply(this,a.concat(d.call(arguments)));return Object(n)===n?n:this}return u.apply(e,a.concat(d.call(arguments)))},o=Math.max(0,u.length-a.length),i=[],f=0;f-1?d(t):t}},552:function(e,u,t){"use strict";var n=t(510),d=t(509),r=d("%Function.prototype.apply%"),a=d("%Function.prototype.call%"),c=d("%Reflect.apply%",!0)||n.call(a,r),o=d("%Object.getOwnPropertyDescriptor%",!0),i=d("%Object.defineProperty%",!0),f=d("%Math.max%");if(i)try{i({},"a",{value:1})}catch(s){i=null}e.exports=function(e){var u=c(n,a,arguments);if(o&&i){var t=o(u,"length");t.configurable&&i(u,"length",{value:1+f(0,e.length-(arguments.length-1))})}return u};var l=function(){return c(n,r,arguments)};i?i(e.exports,"apply",{value:l}):e.exports.apply=l},553:function(e,u,t){var n="function"==typeof Map&&Map.prototype,d=Object.getOwnPropertyDescriptor&&n?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,r=n&&d&&"function"==typeof d.get?d.get:null,a=n&&Map.prototype.forEach,c="function"==typeof Set&&Set.prototype,o=Object.getOwnPropertyDescriptor&&c?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,i=c&&o&&"function"==typeof o.get?o.get:null,f=c&&Set.prototype.forEach,l="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,s="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,p="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,m=Boolean.prototype.valueOf,h=Object.prototype.toString,v=Function.prototype.toString,b=String.prototype.match,y=String.prototype.slice,g=String.prototype.replace,_=String.prototype.toUpperCase,x=String.prototype.toLowerCase,w=RegExp.prototype.test,E=Array.prototype.concat,I=Array.prototype.join,S=Array.prototype.slice,A=Math.floor,k="function"==typeof BigInt?BigInt.prototype.valueOf:null,O=Object.getOwnPropertySymbols,j="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,N="function"==typeof Symbol&&"object"==typeof Symbol.iterator,C="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===N||"symbol")?Symbol.toStringTag:null,P=Object.prototype.propertyIsEnumerable,T=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(e){return e.__proto__}:null);function M(e,u){if(e===1/0||e===-1/0||e!=e||e&&e>-1e3&&e<1e3||w.call(/e/,u))return u;var t=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof e){var n=e<0?-A(-e):A(e);if(n!==e){var d=String(n),r=y.call(u,d.length+1);return g.call(d,t,"$&_")+"."+g.call(g.call(r,/([0-9]{3})/g,"$&_"),/_$/,"")}}return g.call(u,t,"$&_")}var R=t(554),L=R.custom,F=W(L)?L:null;function B(e,u,t){var n="double"===(t.quoteStyle||u)?'"':"'";return n+e+n}function D(e){return g.call(String(e),/"/g,""")}function U(e){return!("[object Array]"!==q(e)||C&&"object"==typeof e&&C in e)}function z(e){return!("[object RegExp]"!==q(e)||C&&"object"==typeof e&&C in e)}function W(e){if(N)return e&&"object"==typeof e&&e instanceof Symbol;if("symbol"==typeof e)return!0;if(!e||"object"!=typeof e||!j)return!1;try{return j.call(e),!0}catch(u){}return!1}e.exports=function e(u,t,n,d){var c=t||{};if(G(c,"quoteStyle")&&"single"!==c.quoteStyle&&"double"!==c.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(G(c,"maxStringLength")&&("number"==typeof c.maxStringLength?c.maxStringLength<0&&c.maxStringLength!==1/0:null!==c.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var o=!G(c,"customInspect")||c.customInspect;if("boolean"!=typeof o&&"symbol"!==o)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(G(c,"indent")&&null!==c.indent&&"\t"!==c.indent&&!(parseInt(c.indent,10)===c.indent&&c.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(G(c,"numericSeparator")&&"boolean"!=typeof c.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var h=c.numericSeparator;if(void 0===u)return"undefined";if(null===u)return"null";if("boolean"==typeof u)return u?"true":"false";if("string"==typeof u)return function e(u,t){if(u.length>t.maxStringLength){var n=u.length-t.maxStringLength,d="... "+n+" more character"+(n>1?"s":"");return e(y.call(u,0,t.maxStringLength),t)+d}return B(g.call(g.call(u,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,K),"single",t)}(u,c);if("number"==typeof u){if(0===u)return 1/0/u>0?"0":"-0";var _=String(u);return h?M(u,_):_}if("bigint"==typeof u){var w=String(u)+"n";return h?M(u,w):w}var A=void 0===c.depth?5:c.depth;if(void 0===n&&(n=0),n>=A&&A>0&&"object"==typeof u)return U(u)?"[Array]":"[Object]";var O=function(e,u){var t;if("\t"===e.indent)t="\t";else{if(!("number"==typeof e.indent&&e.indent>0))return null;t=I.call(Array(e.indent+1)," ")}return{base:t,prev:I.call(Array(u+1),t)}}(c,n);if(void 0===d)d=[];else if(H(d,u)>=0)return"[Circular]";function L(u,t,r){if(t&&(d=S.call(d)).push(t),r){var a={depth:c.depth};return G(c,"quoteStyle")&&(a.quoteStyle=c.quoteStyle),e(u,a,n+1,d)}return e(u,c,n+1,d)}if("function"==typeof u&&!z(u)){var $=function(e){if(e.name)return e.name;var u=b.call(v.call(e),/^function\s*([\w$]+)/);if(u)return u[1];return null}(u),X=Y(u,L);return"[Function"+($?": "+$:" (anonymous)")+"]"+(X.length>0?" { "+I.call(X,", ")+" }":"")}if(W(u)){var ee=N?g.call(String(u),/^(Symbol\(.*\))_[^)]*$/,"$1"):j.call(u);return"object"!=typeof u||N?ee:V(ee)}if(function(e){if(!e||"object"!=typeof e)return!1;if("undefined"!=typeof HTMLElement&&e instanceof HTMLElement)return!0;return"string"==typeof e.nodeName&&"function"==typeof e.getAttribute}(u)){for(var ue="<"+x.call(String(u.nodeName)),te=u.attributes||[],ne=0;ne"}if(U(u)){if(0===u.length)return"[]";var de=Y(u,L);return O&&!function(e){for(var u=0;u=0)return!1;return!0}(de)?"["+Q(de,O)+"]":"[ "+I.call(de,", ")+" ]"}if(function(e){return!("[object Error]"!==q(e)||C&&"object"==typeof e&&C in e)}(u)){var re=Y(u,L);return"cause"in Error.prototype||!("cause"in u)||P.call(u,"cause")?0===re.length?"["+String(u)+"]":"{ ["+String(u)+"] "+I.call(re,", ")+" }":"{ ["+String(u)+"] "+I.call(E.call("[cause]: "+L(u.cause),re),", ")+" }"}if("object"==typeof u&&o){if(F&&"function"==typeof u[F]&&R)return R(u,{depth:A-n});if("symbol"!==o&&"function"==typeof u.inspect)return u.inspect()}if(function(e){if(!r||!e||"object"!=typeof e)return!1;try{r.call(e);try{i.call(e)}catch(ue){return!0}return e instanceof Map}catch(u){}return!1}(u)){var ae=[];return a.call(u,(function(e,t){ae.push(L(t,u,!0)+" => "+L(e,u))})),Z("Map",r.call(u),ae,O)}if(function(e){if(!i||!e||"object"!=typeof e)return!1;try{i.call(e);try{r.call(e)}catch(u){return!0}return e instanceof Set}catch(t){}return!1}(u)){var ce=[];return f.call(u,(function(e){ce.push(L(e,u))})),Z("Set",i.call(u),ce,O)}if(function(e){if(!l||!e||"object"!=typeof e)return!1;try{l.call(e,l);try{s.call(e,s)}catch(ue){return!0}return e instanceof WeakMap}catch(u){}return!1}(u))return J("WeakMap");if(function(e){if(!s||!e||"object"!=typeof e)return!1;try{s.call(e,s);try{l.call(e,l)}catch(ue){return!0}return e instanceof WeakSet}catch(u){}return!1}(u))return J("WeakSet");if(function(e){if(!p||!e||"object"!=typeof e)return!1;try{return p.call(e),!0}catch(u){}return!1}(u))return J("WeakRef");if(function(e){return!("[object Number]"!==q(e)||C&&"object"==typeof e&&C in e)}(u))return V(L(Number(u)));if(function(e){if(!e||"object"!=typeof e||!k)return!1;try{return k.call(e),!0}catch(u){}return!1}(u))return V(L(k.call(u)));if(function(e){return!("[object Boolean]"!==q(e)||C&&"object"==typeof e&&C in e)}(u))return V(m.call(u));if(function(e){return!("[object String]"!==q(e)||C&&"object"==typeof e&&C in e)}(u))return V(L(String(u)));if(!function(e){return!("[object Date]"!==q(e)||C&&"object"==typeof e&&C in e)}(u)&&!z(u)){var oe=Y(u,L),ie=T?T(u)===Object.prototype:u instanceof Object||u.constructor===Object,fe=u instanceof Object?"":"null prototype",le=!ie&&C&&Object(u)===u&&C in u?y.call(q(u),8,-1):fe?"Object":"",se=(ie||"function"!=typeof u.constructor?"":u.constructor.name?u.constructor.name+" ":"")+(le||fe?"["+I.call(E.call([],le||[],fe||[]),": ")+"] ":"");return 0===oe.length?se+"{}":O?se+"{"+Q(oe,O)+"}":se+"{ "+I.call(oe,", ")+" }"}return String(u)};var $=Object.prototype.hasOwnProperty||function(e){return e in this};function G(e,u){return $.call(e,u)}function q(e){return h.call(e)}function H(e,u){if(e.indexOf)return e.indexOf(u);for(var t=0,n=e.length;t-1?e.split(","):e},i=function(e,u,t,n){if(e){var r=t.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e,a=/(\[[^[\]]*])/g,c=t.depth>0&&/(\[[^[\]]*])/.exec(r),i=c?r.slice(0,c.index):r,f=[];if(i){if(!t.plainObjects&&d.call(Object.prototype,i)&&!t.allowPrototypes)return;f.push(i)}for(var l=0;t.depth>0&&null!==(c=a.exec(r))&&l=0;--r){var a,c=e[r];if("[]"===c&&t.parseArrays)a=[].concat(d);else{a=t.plainObjects?Object.create(null):{};var i="["===c.charAt(0)&&"]"===c.charAt(c.length-1)?c.slice(1,-1):c,f=parseInt(i,10);t.parseArrays||""!==i?!isNaN(f)&&c!==i&&String(f)===i&&f>=0&&t.parseArrays&&f<=t.arrayLimit?(a=[])[f]=d:"__proto__"!==i&&(a[i]=d):a={0:d}}d=a}return d}(f,u,t,n)}};e.exports=function(e,u){var t=function(e){if(!e)return a;if(null!==e.decoder&&void 0!==e.decoder&&"function"!=typeof e.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var u=void 0===e.charset?a.charset:e.charset;return{allowDots:void 0===e.allowDots?a.allowDots:!!e.allowDots,allowPrototypes:"boolean"==typeof e.allowPrototypes?e.allowPrototypes:a.allowPrototypes,allowSparse:"boolean"==typeof e.allowSparse?e.allowSparse:a.allowSparse,arrayLimit:"number"==typeof e.arrayLimit?e.arrayLimit:a.arrayLimit,charset:u,charsetSentinel:"boolean"==typeof e.charsetSentinel?e.charsetSentinel:a.charsetSentinel,comma:"boolean"==typeof e.comma?e.comma:a.comma,decoder:"function"==typeof e.decoder?e.decoder:a.decoder,delimiter:"string"==typeof e.delimiter||n.isRegExp(e.delimiter)?e.delimiter:a.delimiter,depth:"number"==typeof e.depth||!1===e.depth?+e.depth:a.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof e.interpretNumericEntities?e.interpretNumericEntities:a.interpretNumericEntities,parameterLimit:"number"==typeof e.parameterLimit?e.parameterLimit:a.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:"boolean"==typeof e.plainObjects?e.plainObjects:a.plainObjects,strictNullHandling:"boolean"==typeof e.strictNullHandling?e.strictNullHandling:a.strictNullHandling}}(u);if(""===e||null==e)return t.plainObjects?Object.create(null):{};for(var f="string"==typeof e?function(e,u){var t,i={},f=u.ignoreQueryPrefix?e.replace(/^\?/,""):e,l=u.parameterLimit===1/0?void 0:u.parameterLimit,s=f.split(u.delimiter,l),p=-1,m=u.charset;if(u.charsetSentinel)for(t=0;t-1&&(v=r(v)?[v]:v),d.call(i,h)?i[h]=n.combine(i[h],v):i[h]=v}return i}(e,t):e,l=t.plainObjects?Object.create(null):{},s=Object.keys(f),p=0;p1?arguments[1]:void 0,3);t=t?t.n:this._f;)for(n(t.v,t.k,this);t&&t.r;)t=t.p},has:function(e){return!!v(m(this,u),e)}}),s&&n(f.prototype,"size",{get:function(){return m(this,u)[h]}}),f},def:function(e,u,t){var n,d,r=v(e,u);return r?r.v=t:(e._l=r={i:d=p(u,!0),k:u,v:t,p:n=e._l,n:void 0,r:!1},e._f||(e._f=r),n&&(n.n=r),e[h]++,"F"!==d&&(e._i[d]=r)),e},getEntry:v,setStrong:function(e,u,t){i(e,u,(function(e,t){this._t=m(e,u),this._k=t,this._l=void 0}),(function(){for(var e=this._k,u=this._l;u&&u.r;)u=u.p;return this._t&&(this._l=u=u?u.n:this._t._f)?f(0,"keys"==e?u.k:"values"==e?u.v:[u.k,u.v]):(this._t=void 0,f(1))}),t?"entries":"values",!t,!0),l(u)}}},587:function(e,u,t){"use strict";var n=t(5),d=t(12),r=t(16),a=t(82),c=t(531),o=t(81),i=t(80),f=t(13),l=t(14),s=t(83),p=t(41),m=t(588);e.exports=function(e,u,t,h,v,b){var y=n[e],g=y,_=v?"set":"add",x=g&&g.prototype,w={},E=function(e){var u=x[e];r(x,e,"delete"==e||"has"==e?function(e){return!(b&&!f(e))&&u.call(this,0===e?0:e)}:"get"==e?function(e){return b&&!f(e)?void 0:u.call(this,0===e?0:e)}:"add"==e?function(e){return u.call(this,0===e?0:e),this}:function(e,t){return u.call(this,0===e?0:e,t),this})};if("function"==typeof g&&(b||x.forEach&&!l((function(){(new g).entries().next()})))){var I=new g,S=I[_](b?{}:-0,1)!=I,A=l((function(){I.has(1)})),k=s((function(e){new g(e)})),O=!b&&l((function(){for(var e=new g,u=5;u--;)e[_](u,u);return!e.has(-0)}));k||((g=u((function(u,t){i(u,g,e);var n=m(new y,u,g);return null!=t&&o(t,v,n[_],n),n}))).prototype=x,x.constructor=g),(A||O)&&(E("delete"),E("has"),v&&E("get")),(O||S)&&E(_),b&&x.clear&&delete x.clear}else g=h.getConstructor(u,e,v,_),a(g.prototype,t),c.NEED=!0;return p(g,e),w[e]=g,d(d.G+d.W+d.F*(g!=y),w),b||h.setStrong(g,e,v),g}},588:function(e,u,t){var n=t(13),d=t(589).set;e.exports=function(e,u,t){var r,a=u.constructor;return a!==t&&"function"==typeof a&&(r=a.prototype)!==t.prototype&&n(r)&&d&&d(e,r),e}},589:function(e,u,t){var n=t(13),d=t(8),r=function(e,u){if(d(e),!n(u)&&null!==u)throw TypeError(u+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,u,n){try{(n=t(30)(Function.call,t(590).f(Object.prototype,"__proto__").set,2))(e,[]),u=!(e instanceof Array)}catch(d){u=!0}return function(e,t){return r(e,t),u?e.__proto__=t:n(e,t),e}}({},!1):void 0),check:r}},590:function(e,u,t){var n=t(62),d=t(57),r=t(33),a=t(87),c=t(31),o=t(86),i=Object.getOwnPropertyDescriptor;u.f=t(10)?i:function(e,u){if(e=r(e),u=a(u,!0),o)try{return i(e,u)}catch(t){}if(c(e,u))return d(!n.f.call(e,u),e[u])}},591:function(e,u,t){"use strict";var n=t(12),d=t(32),r=t(27),a=t(14),c=[].sort,o=[1,2,3];n(n.P+n.F*(a((function(){o.sort(void 0)}))||!a((function(){o.sort(null)}))||!t(592)(c)),"Array",{sort:function(e){return void 0===e?c.call(r(this)):c.call(r(this),d(e))}})},592:function(e,u,t){"use strict";var n=t(14);e.exports=function(e,u){return!!e&&n((function(){u?e.call(null,(function(){}),1):e.call(null)}))}},601:function(e,u,t){"use strict";t(529),t(79),t(530),t(591),t(29),t(22),t(21),t(85),t(480);var n=t(1),d=(t(488),t(489),t(77),t(468),t(0)),r=t.n(d),a=t(521),c=t.n(a);t(150);var o=function(e){var u=e.humanize,t=e.icon,n=e.values,d=e.currentState,a=e.setState;if(0==n.size)return null;var o=Array.from(n);return r.a.createElement(r.a.Fragment,null,o.map((function(e,n){var o="string"==typeof e&&u?c()(e):e;return r.a.createElement("label",{key:n},r.a.createElement("input",{type:"checkbox",onChange:function(u){var t=new Set(d);u.currentTarget.checked?t.add(e):t.delete(e),a(t)},checked:d.has(e)}),o&&r.a.createElement(r.a.Fragment,null,t?r.a.createElement("i",{className:"feather icon-"+t}):""," ",o))})))},i=t(543),f=t(473),l=t(470),s=(t(484),t(491)),p=t.n(s),m=t(463),h=t.n(m),v=t(544),b=t.n(v),y=t(476);t(151);function g(e){var u=e.delivery_guarantee,t=e.description,n=e.event_types,d=e.function_category,a=(e.logo_path,e.name),c=e.pathTemplate,o=e.status,i=e.title,f=e.type,s=c;s||("source"==f&&(s="/docs/reference/sources//"),"transform"==f&&(s="/docs/reference/transforms//"),"sink"==f&&(s="/docs/reference/sinks//"));var p=s.replace("",a);return r.a.createElement(l.a,{to:p,className:"qovery-component",title:t},r.a.createElement("div",{className:"qovery-component--header"},r.a.createElement("div",{className:"qovery-component--name"},i)),r.a.createElement("div",{className:"qovery-component--badges"},"beta"==o?r.a.createElement("span",{className:"badge badge--warning",title:"This component is in beta and is not recommended for production environments"},r.a.createElement("i",{className:"feather icon-alert-triangle"})):r.a.createElement("span",{className:"badge badge--primary",title:"This component has passed reliability standards that make it production ready"},r.a.createElement("i",{className:"feather icon-award"})),"best_effort"==u?r.a.createElement("span",{className:"badge badge--warning",title:"This component makes a best-effort delivery guarantee, and in rare cases can lose data"},r.a.createElement("i",{className:"feather icon-shield-off"})):r.a.createElement("span",{className:"badge badge--primary",title:"This component offers an at-least-once delivery guarantee"},r.a.createElement("i",{className:"feather icon-shield"})),n.includes("log")?r.a.createElement("span",{className:"badge badge--primary",title:"This component works with log event types"},"log"):"",n.includes("metric")?r.a.createElement("span",{className:"badge badge--primary",title:"This component works with metric event types"},"metric"):"",r.a.createElement("span",{className:"badge badge--primary"},d)))}function _(e){var u=e.components,t=e.headingLevel,d=e.pathTemplate,a=e.titles,c=u.filter((function(e){return"source"==e.type})),o=u.filter((function(e){return"transform"==e.type})),l=u.filter((function(e){return"sink"==e.type})),s="h"+(t||3);return u.length>0?r.a.createElement(r.a.Fragment,null,c.length>0?r.a.createElement(r.a.Fragment,null,a&&r.a.createElement(s,null,c.length," Sources"),r.a.createElement("div",{className:"qovery-components--grid"},c.map((function(e,u){return r.a.createElement(g,Object(n.a)({key:u,pathTemplate:d},e))})))):"",o.length>0?r.a.createElement(r.a.Fragment,null,a&&r.a.createElement(s,null,o.length," Transforms"),r.a.createElement("div",{className:"qovery-components--grid"},o.map((function(e,u){return r.a.createElement(g,Object(n.a)({key:u,pathTemplate:d},e))})))):"",l.length>0?r.a.createElement(r.a.Fragment,null,a&&r.a.createElement(s,null,l.length," Sinks"),r.a.createElement("div",{className:"qovery-components--grid"},l.map((function(e,u){return r.a.createElement(g,Object(n.a)({key:u,pathTemplate:d},e))})))):"",r.a.createElement("hr",null),r.a.createElement(f.a,{to:"https://github.com/qovery/documentation/issues/new?labels=type%3A+new+feature",target:"_blank",rightIcon:"plus-circle"},"Request a new component")):r.a.createElement(i.a,{text:"no components found"})}u.a=function(e){var u=Object(y.a)().siteConfig.customFields.metadata,t=u.sources,n=u.transforms,a=u.sinks,c=e.titles||null==e.titles,i=1==e.filterColumn,f=e.pathTemplate,s=e.location?b.a.parse(e.location.search,{ignoreQueryPrefix:!0}):{},m=[];(e.sources||null==e.sources)&&(m=m.concat(Object.values(t))),(e.transforms||null==e.transforms)&&(m=m.concat(Object.values(n))),(e.sinks||null==e.sinks)&&(m=m.concat(Object.values(a))),m=m.sort((function(e,u){return e.name>u.name?1:-1}));var v=Object(d.useState)("true"==s["at-least-once"]),g=v[0],x=v[1],w=Object(d.useState)(new Set(s["event-types"]||e.eventTypes)),E=w[0],I=w[1],S=Object(d.useState)(new Set(s.functions)),A=S[0],k=S[1],O=Object(d.useState)(new Set(s["operating-systems"])),j=O[0],N=O[1],C=Object(d.useState)("true"==s["prod-ready"]),P=C[0],T=C[1],M=Object(d.useState)(new Set(s.providers)),R=M[0],L=M[1],F=Object(d.useState)(s.search),B=F[0],D=F[1];B&&(m=m.filter((function(e){return(e.name.toLowerCase()+" "+e.type.toLowerCase()).includes(B.toLowerCase())}))),g&&(m=m.filter((function(e){return"at_least_once"==e.delivery_guarantee}))),E.size>0&&(m=m.filter((function(e){return Array.from(E).some((function(u){return e.event_types.includes(u)}))}))),A.size>0&&(m=m.filter((function(e){return A.has(e.function_category)}))),j.size>0&&(m=m.filter((function(e){return Array.from(j).every((function(u){return e.operating_systems.includes(u)}))}))),P&&(m=m.filter((function(e){return"prod-ready"==e.status}))),R.size>0&&(m=m.filter((function(e){return Array.from(R).every((function(u){return e.service_providers&&e.service_providers.includes(u)}))}))),e.exceptNames&&e.exceptNames.length>0&&(m=m.filter((function(u){return!e.exceptNames.includes(u.name)}))),e.exceptFunctions&&e.exceptFunctions.length>0&&(m=m.filter((function(u){return!e.exceptFunctions.includes(u.function_category)})));var U=E.size>0?E:new Set(p()(m).map((function(e){return e.event_types})).flatten().uniq().compact().sort().value()),z=new Set(p()(m).map((function(e){return e.operating_systems})).flatten().uniq().compact().sort().value()),W=new Set(p()(m).map((function(e){return e.service_providers})).flatten().uniq().compact().sort().value()),$=new Set(p()(m).filter((function(e){return"source"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),G=new Set(p()(m).filter((function(e){return"transform"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),q=new Set(p()(m).filter((function(e){return"sink"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value());return r.a.createElement("div",{className:h()("qovery-components",{"qovery-components--cols":i})},r.a.createElement("div",{className:"filters"},r.a.createElement("div",{className:"search"},r.a.createElement("input",{className:"input--text input--lg",type:"text",onChange:function(e){return D(e.currentTarget.value)},placeholder:"\ud83d\udd0d Search..."})),r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},r.a.createElement(l.a,{to:"/docs/getting-started/data-model/",title:"Learn more about Qovery's event types"},"Event types ",r.a.createElement("i",{className:"feather icon-info"}))),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Event Types",icon:"database",values:U,humanize:!0,currentState:E,setState:I}))),r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},r.a.createElement(l.a,{to:"/docs/getting-started/whats-next/",title:"Learn more about Qovery's guarantees"},"Guarantees ",r.a.createElement("i",{className:"feather icon-info"}))),r.a.createElement("div",{className:"filter--choices"},r.a.createElement("label",{title:"Show only components that offer an at-least-once delivery guarantee."},r.a.createElement("input",{type:"checkbox",onChange:function(e){return x(e.currentTarget.checked)},checked:g}),r.a.createElement("i",{className:"feather icon-shield"})," At-least-once"),r.a.createElement("label",{title:"Show only production ready components."},r.a.createElement("input",{type:"checkbox",onChange:function(e){return T(e.currentTarget.checked)},checked:P}),r.a.createElement("i",{className:"feather icon-award"})," Prod-ready"))),$.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Source Functions"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Functions",icon:"settings",values:$,humanize:!0,currentState:A,setState:k}))),G.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Transform Functions"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Functions",icon:"settings",values:G,humanize:!0,currentState:A,setState:k}))),q.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Sink Functions"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Functions",icon:"settings",values:q,humanize:!0,currentState:A,setState:k}))),W.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Providers"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Providers",icon:"cloud",values:W,currentState:R,setState:L}))),z.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},r.a.createElement(l.a,{to:"/docs/setup/installation/operating-systems/",title:"Learn more about Qovery's operating systems"},"Operating Systems")),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Operating Systems",icon:"cpu",values:z,currentState:j,setState:N})))),r.a.createElement("div",{className:"qovery-components--results"},r.a.createElement(_,{components:m,headingLevel:e.headingLevel,pathTemplate:f,titles:c})))}}}]); \ No newline at end of file diff --git a/54e7632e.f0125c35.js.LICENSE.txt b/54e7632e.5617fd6c.js.LICENSE.txt similarity index 100% rename from 54e7632e.f0125c35.js.LICENSE.txt rename to 54e7632e.5617fd6c.js.LICENSE.txt diff --git a/56c0a343.6cd92dce.js b/56c0a343.39f48dc7.js similarity index 99% rename from 56c0a343.6cd92dce.js rename to 56c0a343.39f48dc7.js index db5c7ed44d..33176177c2 100644 --- a/56c0a343.6cd92dce.js +++ b/56c0a343.39f48dc7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[112],{263:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return s})),n.d(t,"metadata",(function(){return c})),n.d(t,"rightToc",(function(){return b})),n.d(t,"default",(function(){return p}));var a=n(1),o=n(9),r=(n(0),n(465)),i=n(464),l=(n(477),n(469)),s={last_modified_on:"2023-09-08",$schema:"/.meta/.schemas/guides.json",title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},c={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",permalink:"/guides/tutorial/build-e2e-testing-ephemeral-environments",readingTime:"12 min read",source:"@site/guides/tutorial/build-e2e-testing-ephemeral-environments.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",truncated:!1,prevItem:{title:"Blazingly fast Preview Environments for NextJS, NodeJS, and MongoDB on AWS",permalink:"/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws"},nextItem:{title:"Continuous Integration",permalink:"/guides/advanced/continuous-integration"}},b=[{value:"Why E2E Testing?",id:"why-e2e-testing",children:[]},{value:"The Importance of Ephemeral Environments",id:"the-importance-of-ephemeral-environments",children:[]},{value:"GitHub Actions and Qovery: A Perfect Match",id:"github-actions-and-qovery-a-perfect-match",children:[]},{value:"What You'll Learn",id:"what-youll-learn",children:[]},{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Tools",id:"tools",children:[]},{value:"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery",id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery",children:[{value:"1. Prepare Qovery blueprint environment",id:"1-prepare-qovery-blueprint-environment",children:[]},{value:"2. Build and push container image",id:"2-build-and-push-container-image",children:[]},{value:"3. Create an Ephemeral Environment with GitHub Actions and Qovery",id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery",children:[]},{value:"4. Run E2E tests with K6",id:"4-run-e2e-tests-with-k6",children:[]},{value:"5. Display test results in Pull Request",id:"5-display-test-results-in-pull-request",children:[]},{value:"6. Destroy Ephemeral Environment and clean up resources",id:"6-destroy-ephemeral-environment-and-clean-up-resources",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:b};function p(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Welcome to this comprehensive step-by-step guide on building End-to-End (E2E) testing ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/ephemeral-environments"}),"ephemeral environments")," using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/features/actions"}),"GitHub Actions")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery"),". If you've been seeking ways to automate your testing processes, reduce operational overhead, and improve the efficiency of your development cycle, then you're in the right place."),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"This article is available in the webinar format as well")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/1be8d4229cb74ed7b0526cc2acbca8ad",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"why-e2e-testing"},"Why E2E Testing?"),Object(r.b)("p",null,"End-to-End testing is a critical phase in the software development lifecycle. It validates that your application works cohesively from start to finish, mimicking real-world scenarios."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/e2e-pyramid.png",alt:"E2E vs UI Tests vs Integation Tests vs Unit Tests - from SemaphoreCI"})),Object(r.b)("p",null,"While unit tests and integration tests offer valuable insights, they do not replicate how multiple components interact in a live production environment. E2E testing fills that gap and ensures that your application performs as expected when it goes live."),Object(r.b)("h2",{id:"the-importance-of-ephemeral-environments"},"The Importance of Ephemeral Environments"),Object(r.b)("p",null,"In the world of DevOps and CI/CD, ephemeral environments (aka ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/why-preview-environments-are-the-new-thing-in-devops"}),"Preview Environments"),") serve as temporary, isolated setups where you can test your applications. These environments are increasingly vital in agile development frameworks where frequent changes are the norm. They can be provisioned quickly, teared down when no longer needed, and replicated easily. This means you can push your changes more rapidly into production with confidence."),Object(r.b)("h2",{id:"github-actions-and-qovery-a-perfect-match"},"GitHub Actions and Qovery: A Perfect Match"),Object(r.b)("p",null,"GitHub Actions offers a powerful platform for automating workflows, allowing you to build, test, and deploy your code right from GitHub. Qovery, on the other hand, simplifies the provisioning and management of cloud resources, making it incredibly straightforward to set up ephemeral environments. When used in tandem, these tools provide a seamless, automated pipeline for E2E testing."),Object(r.b)("h2",{id:"what-youll-learn"},"What You'll Learn"),Object(r.b)("p",null,"This guide is designed to walk you through the entire process of setting up an automated E2E testing pipeline. We'll start by setting up GitHub Actions, move on to configuring ephemeral environments with Qovery, and finally, integrate these components into a cohesive, automated testing solution."),Object(r.b)("p",null,"By the end of this guide, you'll have a fully operational E2E testing pipeline that will allow you to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Automate your testing process"),Object(r.b)("li",{parentName:"ol"},"Quickly provision and de-provision environments"),Object(r.b)("li",{parentName:"ol"},"Integrate closely with your GitHub repository"),Object(r.b)("li",{parentName:"ol"},"Save both time and operational costs")),Object(r.b)("p",null,"So, whether you are a developer, a DevOps engineer, a QA specialist, an engineering manager, or even a CTO, this guide offers valuable insights for anyone involved in the software development process."),Object(r.b)("p",null,"Let's dive in!"),Object(r.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(r.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Contact us via ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning Qovery")),Object(r.b)("h2",{id:"tools"},"Tools"),Object(r.b)("p",null,"Here are the tools we will use in this guide:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.qovery.com"}),"Qovery")," for the infrastructure and the ephemeral environment"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/features/actions"}),"GitHub Actions")," for the CI/CD pipeline"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://k6.io/"}),"K6")," for the e2e tests")),Object(r.b)("h2",{id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery"},"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery"),Object(r.b)("p",null,"Here is the big picture of what we will build:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/1.png",alt:"e2e testing Workflow with github actions and Qovery"})),Object(r.b)("p",null,"We will focus on the most important parts of the workflow - from label number 2 to 11. I assume that you already know GitHub and how to create a Pull Request :)"),Object(r.b)("p",null,"Let's go!"),Object(r.b)("h3",{id:"1-prepare-qovery-blueprint-environment"},"1. Prepare Qovery blueprint environment"),Object(r.b)("p",null,"If you are not already familiar with Qovery, I recommend you to ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/getting-started/what-is-qovery/"}),"What's Qovery"),". In this guide, we will use Qovery to provision our ephemeral environments composed of a Java application (",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app"}),"TODO app"),") and a PostgreSQL database. For this, we will create a blueprint environment that will be used as a template to create ephemeral environments."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can skip this part if you already have an environment that you want to use as a base for your ephemeral environments.")),Object(r.b)("p",null,"Here are the steps I did to create my blueprint environment:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://console.qovery.com"}),"Qovery"),"."),Object(r.b)("li",{parentName:"ol"},"Create a new project."),Object(r.b)("li",{parentName:"ol"},"Create a new environment named ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint"),"."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/getting-started/create-a-database/"}),"PostgreSQL database")," inside your ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint")," environment."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/application/#create-an-application"}),"TODO app")," by using my ECR container registry where I push my image from GitHub Actions (cf next step).")),Object(r.b)("p",null,"At the end of those steps, you should have something like this:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/2.png",alt:"Blueprint environment"})),Object(r.b)("p",null,"If you want to use my ",Object(r.b)("inlineCode",{parentName:"p"},"TODO app")," as an example, you need to properly configure the environment variables of the application. Here is a table with the environment variables you need to set:"),Object(r.b)("details",null,Object(r.b)("summary",null,"Environment Variables"),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Name"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Is Alias?"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Scope"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Value"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Comment"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DB_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._DEFAULT_DATABASE_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database name")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_HOST")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._HOST_INTERNAL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database host")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database port")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_USERNAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._LOGIN")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database login")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database password")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"QUARKUS_DATASOURCE_JDBC_URL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"jdbc:postgresql://{{POSTGRES_HOST}}:{{POSTGRES_PORT}}/{{POSTGRES_DB_NAME}}"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Connection string to the PostgreSQL database"))))),Object(r.b)("p",null,"You're good to go! Now, let's move on to the next step."),Object(r.b)("h3",{id:"2-build-and-push-container-image"},"2. Build and push container image"),Object(r.b)("p",null,"In this step, we will build and push the container image of our application to our ECR container registry. We will use GitHub Actions to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"build-and-push-image.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n build-and-push-container:\n runs-on: ubuntu-latest\n needs: run-unit-tests\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v2\n with:\n aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n aws-region: eu-west-3\n\n - name: Login to Amazon ECR\n id: login-ecr\n uses: aws-actions/amazon-ecr-login@v1\n with:\n mask-password: 'true'\n\n - name: Build, Tag, and push image to Amazon ECR\n env:\n ECR_REGISTRY: 687975725498.dkr.ecr.eu-west-3.amazonaws.com\n ECR_REPOSITORY: todo-app\n IMAGE_TAG: ${{ github.sha }}\n run: |\n docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .\n docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest\n docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/build-and-push-image.yml"}),"here"))),Object(r.b)("p",null,Object(r.b)("inlineCode",{parentName:"p"},"AWS_ACCESS_KEY_ID")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AWS_SECRET_ACCESS_KEY")," are stored as ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/encrypted-secrets"}),"GitHub secrets"),"."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ECR registry is also connected to my Qovery account - so I can pull the pushed image from Qovery as well.")),Object(r.b)("h3",{id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery"},"3. Create an Ephemeral Environment with GitHub Actions and Qovery"),Object(r.b)("p",null,"In this step, we will create an ephemeral environment with GitHub Actions and Qovery. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI")," inside our GitHub Actions workflow to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"pull-request-run-e2e-tests.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'...\njobs:\n create-e2e-environment:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n permissions:\n pull-requests: write\n steps:\n - id: create-environment\n name: Create and deploy Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s clone \'${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}\' environment into \'$new_environment_name\' environment"\n\n qovery environment clone \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --new-environment-name "$new_environment_name"\n\n qovery container update \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" \\\n --tag ${{ github.sha }}\n\n qovery environment deploy \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n\n qovery_status_markdown_output=`qovery service list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --markdown`\n\n echo "QOVERY_STATUS_MARKDOWN_OUTPUT<> "$GITHUB_OUTPUT"\n echo "$qovery_status_markdown_output" >> "$GITHUB_OUTPUT"\n echo "EOF" >> "$GITHUB_OUTPUT"\n')),Object(r.b)("p",null,"Basically, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment clone")," command to clone our blueprint environment into a new environment. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container update")," command to update the container tag of our application. Finally, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment deploy")," command to deploy our application. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deployment to be completed. We also use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery service list")," command to get the status of our environment and store it in a GitHub output variable. This variable will be used in the next step to display the status of the environment in the Pull Request."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n - name: PR Comment with URL\n uses: mshick/add-pr-comment@v2\n with:\n message-id: qovery-e2e-environment-status\n message: |\n ${{ steps.create-environment.outputs.QOVERY_STATUS_MARKDOWN_OUTPUT }}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/3.png",alt:"Ephemeral environment status in Pull Request"})),Object(r.b)("h3",{id:"4-run-e2e-tests-with-k6"},"4. Run E2E tests with K6"),Object(r.b)("p",null,"In this step, we will run our E2E tests with ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io"}),"K6"),". K6 is a modern load testing tool that allows you to write tests in JavaScript. It's a great tool to run E2E tests as well. Here is the script we will use:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"import http from 'k6/http';\nimport {check, group, sleep, fail} from 'k6';\nimport {uuidv4} from 'https://jslib.k6.io/k6-utils/1.4.0/index.js';\n\nconst api_host = `${__ENV.API_HOST}/api`;\nexport const options = {\n stages: [\n {duration: '5m', target: 100}, // traffic ramp-up from 1 to 100 users over 5 minutes.\n //{ duration: '30m', target: 100 }, // stay at 100 users for 30 minutes\n {duration: '1m', target: 50}, // ramp-down to 50 users\n ]\n}\n\nexport function setup() {\n // add some data\n const params = {\n headers: {\n 'Content-Type': 'application/json',\n },\n };\n\n for (let i = 0; i < 20; i++) {\n const res = http.post(api_host, JSON.stringify({title: uuidv4()}), params);\n check(res, {'item added': (r) => r.status === 201});\n }\n}\n\nexport default function () {\n http.get(api_host);\n}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete script is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/e2e/e2e.js"}),"here"))),Object(r.b)("p",null,"We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"setup")," function to add some data to our database. Then, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"default")," function to get the list of items from our API. We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable to define the number of users we want to simulate. In this example, we will simulate 100 users for 5 minutes. You can find more information about the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io/docs/using-k6/options"}),"here"),"."),Object(r.b)("p",null,"To run our E2E tests, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6 run")," command inside our GitHub Actions workflow. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),' run-e2e-tests:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n needs: create-e2e-environment\n permissions:\n pull-requests: write\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - id: run-e2e\n name: Run E2E tests\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n sudo gpg -k\n sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69\n echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list\n sudo apt-get update\n sudo apt-get install k6\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n api_domain=`qovery container domain list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" | grep "BUILT_IN_DOMAIN" | head -1 | awk \'{print $5}\' | sed -e \'s/\\x1b\\[[0-9;]*m//g\'`\n\n echo "api_domain: $api_domain"\n\n api_host="https://$api_domain"\n echo "API_HOST: $api_host"\n\n e2e_report=`k6 --no-color -q -e API_HOST=$api_host run e2e/e2e.js`\n\n echo "E2E_REPORT<> $GITHUB_OUTPUT\n echo "$e2e_report" >> $GITHUB_OUTPUT\n echo "EOF" >> $GITHUB_OUTPUT\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"We use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command to get the domain of our application. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6")," command to run our E2E tests. We store the result of the tests in a GitHub output variable."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command returns ANSI color codes. We use the ",Object(r.b)("inlineCode",{parentName:"p"},"sed -e 's/\\x1b\\[[0-9;]*m//g'")," command to remove them.")),Object(r.b)("h3",{id:"5-display-test-results-in-pull-request"},"5. Display test results in Pull Request"),Object(r.b)("p",null,"In this step, we will display the result of our E2E tests in the Pull Request. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-output-parameter"}),"GitHub Actions output variables")," to do that. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"})," - name: Display E2E Report\n uses: mshick/add-pr-comment@v2\n with:\n message-id: e2e-report\n message: |\n E2E Tests Report\n\n --\n\n ```\n ${{ steps.run-e2e.outputs.E2E_REPORT }}\n ```\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml#L109C1-L120C16"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/4.png",alt:"E2E report in Pull Request"})),Object(r.b)("h3",{id:"6-destroy-ephemeral-environment-and-clean-up-resources"},"6. Destroy Ephemeral Environment and clean up resources"),Object(r.b)("p",null,"Now we will destroy the ephemeral environment and clean up the resources when the Pull Request is closed or merged. Here is the yaml:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'name: Destroy and clean up E2E Tests Environment\n\non:\n pull_request:\n types: [ closed ]\n\njobs:\n delete-e2e-environment:\n runs-on: ubuntu-latest\n steps:\n - id: delete-environment\n name: Delete Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s delete \'$new_environment_name\' environment and release its resources"\n\n qovery environment delete \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-destroy-e2e-environment.yml"}),"here"))),Object(r.b)("p",null,"We just use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment delete")," command to delete the ephemeral environment. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deletion to be completed. Qovery will automatically release the resources used by the environment."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congratulations! You've successfully built an automated E2E testing pipeline with GitHub Actions and Qovery. You can now run your tests in a fully isolated environment, provisioned and de-provisioned automatically, and integrated with your GitHub repository."),Object(r.b)("p",null,"Some resources:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://semaphoreci.com/blog/e2e-testing"}),"https://semaphoreci.com/blog/e2e-testing")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.loom.com/share/1be8d4229cb74ed7b0526cc2acbca8ad"}),"Webinar record"))))}p.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),o=n.n(a),r=n(463),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||s))}),t)}},468:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),o=n.n(a),r=n(464);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),o=(n(481),n(478),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(483),l=n(463),s=n.n(l),c=n(471),b=n.n(c),u=n(482),p=37,m=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",o,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function h(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,O=e.size,v=(e.style,e.values),g=e.urlKey,j=Object(u.a)(),E=j.tabGroupChoices,y=j.setTabGroupChoices,f=Object(o.useState)(n),N=f[0],w=f[1];if(null!=i){var _=E[i];null!=_&&_!==N&&w(_)}var T=function(e){w(e),null!=i&&y(i,e)},R=[],A=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=b.a.parse(window.location.search);e[g]&&w(e[g])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(O||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?r.a.createElement(h,Object(a.a)({changeSelectedValue:T,handleKeydown:A,placeholder:s,selectedValue:N,size:O,tabRefs:R},e)):r.a.createElement(d,Object(a.a)({changeSelectedValue:T,handleKeydown:A,selectedValue:N,tabRefs:R},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[112],{263:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return s})),n.d(t,"metadata",(function(){return c})),n.d(t,"rightToc",(function(){return b})),n.d(t,"default",(function(){return p}));var a=n(1),o=n(9),r=(n(0),n(465)),i=n(464),l=(n(477),n(469)),s={last_modified_on:"2023-09-08",$schema:"/.meta/.schemas/guides.json",title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},c={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",permalink:"/guides/tutorial/build-e2e-testing-ephemeral-environments",readingTime:"12 min read",source:"@site/guides/tutorial/build-e2e-testing-ephemeral-environments.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",truncated:!1,prevItem:{title:"Blazingly fast Preview Environments for NextJS, NodeJS, and MongoDB on AWS",permalink:"/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws"},nextItem:{title:"Continuous Integration",permalink:"/guides/advanced/continuous-integration"}},b=[{value:"Why E2E Testing?",id:"why-e2e-testing",children:[]},{value:"The Importance of Ephemeral Environments",id:"the-importance-of-ephemeral-environments",children:[]},{value:"GitHub Actions and Qovery: A Perfect Match",id:"github-actions-and-qovery-a-perfect-match",children:[]},{value:"What You'll Learn",id:"what-youll-learn",children:[]},{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Tools",id:"tools",children:[]},{value:"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery",id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery",children:[{value:"1. Prepare Qovery blueprint environment",id:"1-prepare-qovery-blueprint-environment",children:[]},{value:"2. Build and push container image",id:"2-build-and-push-container-image",children:[]},{value:"3. Create an Ephemeral Environment with GitHub Actions and Qovery",id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery",children:[]},{value:"4. Run E2E tests with K6",id:"4-run-e2e-tests-with-k6",children:[]},{value:"5. Display test results in Pull Request",id:"5-display-test-results-in-pull-request",children:[]},{value:"6. Destroy Ephemeral Environment and clean up resources",id:"6-destroy-ephemeral-environment-and-clean-up-resources",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:b};function p(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Welcome to this comprehensive step-by-step guide on building End-to-End (E2E) testing ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/ephemeral-environments"}),"ephemeral environments")," using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/features/actions"}),"GitHub Actions")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery"),". If you've been seeking ways to automate your testing processes, reduce operational overhead, and improve the efficiency of your development cycle, then you're in the right place."),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"This article is available in the webinar format as well")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/1be8d4229cb74ed7b0526cc2acbca8ad",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"why-e2e-testing"},"Why E2E Testing?"),Object(r.b)("p",null,"End-to-End testing is a critical phase in the software development lifecycle. It validates that your application works cohesively from start to finish, mimicking real-world scenarios."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/e2e-pyramid.png",alt:"E2E vs UI Tests vs Integation Tests vs Unit Tests - from SemaphoreCI"})),Object(r.b)("p",null,"While unit tests and integration tests offer valuable insights, they do not replicate how multiple components interact in a live production environment. E2E testing fills that gap and ensures that your application performs as expected when it goes live."),Object(r.b)("h2",{id:"the-importance-of-ephemeral-environments"},"The Importance of Ephemeral Environments"),Object(r.b)("p",null,"In the world of DevOps and CI/CD, ephemeral environments (aka ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/why-preview-environments-are-the-new-thing-in-devops"}),"Preview Environments"),") serve as temporary, isolated setups where you can test your applications. These environments are increasingly vital in agile development frameworks where frequent changes are the norm. They can be provisioned quickly, teared down when no longer needed, and replicated easily. This means you can push your changes more rapidly into production with confidence."),Object(r.b)("h2",{id:"github-actions-and-qovery-a-perfect-match"},"GitHub Actions and Qovery: A Perfect Match"),Object(r.b)("p",null,"GitHub Actions offers a powerful platform for automating workflows, allowing you to build, test, and deploy your code right from GitHub. Qovery, on the other hand, simplifies the provisioning and management of cloud resources, making it incredibly straightforward to set up ephemeral environments. When used in tandem, these tools provide a seamless, automated pipeline for E2E testing."),Object(r.b)("h2",{id:"what-youll-learn"},"What You'll Learn"),Object(r.b)("p",null,"This guide is designed to walk you through the entire process of setting up an automated E2E testing pipeline. We'll start by setting up GitHub Actions, move on to configuring ephemeral environments with Qovery, and finally, integrate these components into a cohesive, automated testing solution."),Object(r.b)("p",null,"By the end of this guide, you'll have a fully operational E2E testing pipeline that will allow you to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Automate your testing process"),Object(r.b)("li",{parentName:"ol"},"Quickly provision and de-provision environments"),Object(r.b)("li",{parentName:"ol"},"Integrate closely with your GitHub repository"),Object(r.b)("li",{parentName:"ol"},"Save both time and operational costs")),Object(r.b)("p",null,"So, whether you are a developer, a DevOps engineer, a QA specialist, an engineering manager, or even a CTO, this guide offers valuable insights for anyone involved in the software development process."),Object(r.b)("p",null,"Let's dive in!"),Object(r.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(r.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Contact us via ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning Qovery")),Object(r.b)("h2",{id:"tools"},"Tools"),Object(r.b)("p",null,"Here are the tools we will use in this guide:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.qovery.com"}),"Qovery")," for the infrastructure and the ephemeral environment"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/features/actions"}),"GitHub Actions")," for the CI/CD pipeline"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://k6.io/"}),"K6")," for the e2e tests")),Object(r.b)("h2",{id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery"},"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery"),Object(r.b)("p",null,"Here is the big picture of what we will build:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/1.png",alt:"e2e testing Workflow with github actions and Qovery"})),Object(r.b)("p",null,"We will focus on the most important parts of the workflow - from label number 2 to 11. I assume that you already know GitHub and how to create a Pull Request :)"),Object(r.b)("p",null,"Let's go!"),Object(r.b)("h3",{id:"1-prepare-qovery-blueprint-environment"},"1. Prepare Qovery blueprint environment"),Object(r.b)("p",null,"If you are not already familiar with Qovery, I recommend you to ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/getting-started/what-is-qovery/"}),"What's Qovery"),". In this guide, we will use Qovery to provision our ephemeral environments composed of a Java application (",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app"}),"TODO app"),") and a PostgreSQL database. For this, we will create a blueprint environment that will be used as a template to create ephemeral environments."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can skip this part if you already have an environment that you want to use as a base for your ephemeral environments.")),Object(r.b)("p",null,"Here are the steps I did to create my blueprint environment:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://console.qovery.com"}),"Qovery"),"."),Object(r.b)("li",{parentName:"ol"},"Create a new project."),Object(r.b)("li",{parentName:"ol"},"Create a new environment named ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint"),"."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/getting-started/create-a-database/"}),"PostgreSQL database")," inside your ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint")," environment."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/application/#create-an-application"}),"TODO app")," by using my ECR container registry where I push my image from GitHub Actions (cf next step).")),Object(r.b)("p",null,"At the end of those steps, you should have something like this:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/2.png",alt:"Blueprint environment"})),Object(r.b)("p",null,"If you want to use my ",Object(r.b)("inlineCode",{parentName:"p"},"TODO app")," as an example, you need to properly configure the environment variables of the application. Here is a table with the environment variables you need to set:"),Object(r.b)("details",null,Object(r.b)("summary",null,"Environment Variables"),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Name"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Is Alias?"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Scope"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Value"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Comment"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DB_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._DEFAULT_DATABASE_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database name")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_HOST")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._HOST_INTERNAL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database host")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database port")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_USERNAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._LOGIN")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database login")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database password")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"QUARKUS_DATASOURCE_JDBC_URL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"jdbc:postgresql://{{POSTGRES_HOST}}:{{POSTGRES_PORT}}/{{POSTGRES_DB_NAME}}"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Connection string to the PostgreSQL database"))))),Object(r.b)("p",null,"You're good to go! Now, let's move on to the next step."),Object(r.b)("h3",{id:"2-build-and-push-container-image"},"2. Build and push container image"),Object(r.b)("p",null,"In this step, we will build and push the container image of our application to our ECR container registry. We will use GitHub Actions to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"build-and-push-image.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n build-and-push-container:\n runs-on: ubuntu-latest\n needs: run-unit-tests\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v2\n with:\n aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n aws-region: eu-west-3\n\n - name: Login to Amazon ECR\n id: login-ecr\n uses: aws-actions/amazon-ecr-login@v1\n with:\n mask-password: 'true'\n\n - name: Build, Tag, and push image to Amazon ECR\n env:\n ECR_REGISTRY: 687975725498.dkr.ecr.eu-west-3.amazonaws.com\n ECR_REPOSITORY: todo-app\n IMAGE_TAG: ${{ github.sha }}\n run: |\n docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .\n docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest\n docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/build-and-push-image.yml"}),"here"))),Object(r.b)("p",null,Object(r.b)("inlineCode",{parentName:"p"},"AWS_ACCESS_KEY_ID")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AWS_SECRET_ACCESS_KEY")," are stored as ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/encrypted-secrets"}),"GitHub secrets"),"."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ECR registry is also connected to my Qovery account - so I can pull the pushed image from Qovery as well.")),Object(r.b)("h3",{id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery"},"3. Create an Ephemeral Environment with GitHub Actions and Qovery"),Object(r.b)("p",null,"In this step, we will create an ephemeral environment with GitHub Actions and Qovery. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI")," inside our GitHub Actions workflow to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"pull-request-run-e2e-tests.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'...\njobs:\n create-e2e-environment:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n permissions:\n pull-requests: write\n steps:\n - id: create-environment\n name: Create and deploy Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s clone \'${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}\' environment into \'$new_environment_name\' environment"\n\n qovery environment clone \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --new-environment-name "$new_environment_name"\n\n qovery container update \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" \\\n --tag ${{ github.sha }}\n\n qovery environment deploy \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n\n qovery_status_markdown_output=`qovery service list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --markdown`\n\n echo "QOVERY_STATUS_MARKDOWN_OUTPUT<> "$GITHUB_OUTPUT"\n echo "$qovery_status_markdown_output" >> "$GITHUB_OUTPUT"\n echo "EOF" >> "$GITHUB_OUTPUT"\n')),Object(r.b)("p",null,"Basically, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment clone")," command to clone our blueprint environment into a new environment. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container update")," command to update the container tag of our application. Finally, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment deploy")," command to deploy our application. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deployment to be completed. We also use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery service list")," command to get the status of our environment and store it in a GitHub output variable. This variable will be used in the next step to display the status of the environment in the Pull Request."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n - name: PR Comment with URL\n uses: mshick/add-pr-comment@v2\n with:\n message-id: qovery-e2e-environment-status\n message: |\n ${{ steps.create-environment.outputs.QOVERY_STATUS_MARKDOWN_OUTPUT }}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/3.png",alt:"Ephemeral environment status in Pull Request"})),Object(r.b)("h3",{id:"4-run-e2e-tests-with-k6"},"4. Run E2E tests with K6"),Object(r.b)("p",null,"In this step, we will run our E2E tests with ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io"}),"K6"),". K6 is a modern load testing tool that allows you to write tests in JavaScript. It's a great tool to run E2E tests as well. Here is the script we will use:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"import http from 'k6/http';\nimport {check, group, sleep, fail} from 'k6';\nimport {uuidv4} from 'https://jslib.k6.io/k6-utils/1.4.0/index.js';\n\nconst api_host = `${__ENV.API_HOST}/api`;\nexport const options = {\n stages: [\n {duration: '5m', target: 100}, // traffic ramp-up from 1 to 100 users over 5 minutes.\n //{ duration: '30m', target: 100 }, // stay at 100 users for 30 minutes\n {duration: '1m', target: 50}, // ramp-down to 50 users\n ]\n}\n\nexport function setup() {\n // add some data\n const params = {\n headers: {\n 'Content-Type': 'application/json',\n },\n };\n\n for (let i = 0; i < 20; i++) {\n const res = http.post(api_host, JSON.stringify({title: uuidv4()}), params);\n check(res, {'item added': (r) => r.status === 201});\n }\n}\n\nexport default function () {\n http.get(api_host);\n}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete script is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/e2e/e2e.js"}),"here"))),Object(r.b)("p",null,"We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"setup")," function to add some data to our database. Then, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"default")," function to get the list of items from our API. We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable to define the number of users we want to simulate. In this example, we will simulate 100 users for 5 minutes. You can find more information about the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io/docs/using-k6/options"}),"here"),"."),Object(r.b)("p",null,"To run our E2E tests, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6 run")," command inside our GitHub Actions workflow. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),' run-e2e-tests:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n needs: create-e2e-environment\n permissions:\n pull-requests: write\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - id: run-e2e\n name: Run E2E tests\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n sudo gpg -k\n sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69\n echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list\n sudo apt-get update\n sudo apt-get install k6\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n api_domain=`qovery container domain list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" | grep "BUILT_IN_DOMAIN" | head -1 | awk \'{print $5}\' | sed -e \'s/\\x1b\\[[0-9;]*m//g\'`\n\n echo "api_domain: $api_domain"\n\n api_host="https://$api_domain"\n echo "API_HOST: $api_host"\n\n e2e_report=`k6 --no-color -q -e API_HOST=$api_host run e2e/e2e.js`\n\n echo "E2E_REPORT<> $GITHUB_OUTPUT\n echo "$e2e_report" >> $GITHUB_OUTPUT\n echo "EOF" >> $GITHUB_OUTPUT\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"We use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command to get the domain of our application. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6")," command to run our E2E tests. We store the result of the tests in a GitHub output variable."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command returns ANSI color codes. We use the ",Object(r.b)("inlineCode",{parentName:"p"},"sed -e 's/\\x1b\\[[0-9;]*m//g'")," command to remove them.")),Object(r.b)("h3",{id:"5-display-test-results-in-pull-request"},"5. Display test results in Pull Request"),Object(r.b)("p",null,"In this step, we will display the result of our E2E tests in the Pull Request. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-output-parameter"}),"GitHub Actions output variables")," to do that. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"})," - name: Display E2E Report\n uses: mshick/add-pr-comment@v2\n with:\n message-id: e2e-report\n message: |\n E2E Tests Report\n\n --\n\n ```\n ${{ steps.run-e2e.outputs.E2E_REPORT }}\n ```\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml#L109C1-L120C16"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/4.png",alt:"E2E report in Pull Request"})),Object(r.b)("h3",{id:"6-destroy-ephemeral-environment-and-clean-up-resources"},"6. Destroy Ephemeral Environment and clean up resources"),Object(r.b)("p",null,"Now we will destroy the ephemeral environment and clean up the resources when the Pull Request is closed or merged. Here is the yaml:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'name: Destroy and clean up E2E Tests Environment\n\non:\n pull_request:\n types: [ closed ]\n\njobs:\n delete-e2e-environment:\n runs-on: ubuntu-latest\n steps:\n - id: delete-environment\n name: Delete Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s delete \'$new_environment_name\' environment and release its resources"\n\n qovery environment delete \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-destroy-e2e-environment.yml"}),"here"))),Object(r.b)("p",null,"We just use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment delete")," command to delete the ephemeral environment. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deletion to be completed. Qovery will automatically release the resources used by the environment."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congratulations! You've successfully built an automated E2E testing pipeline with GitHub Actions and Qovery. You can now run your tests in a fully isolated environment, provisioned and de-provisioned automatically, and integrated with your GitHub repository."),Object(r.b)("p",null,"Some resources:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://semaphoreci.com/blog/e2e-testing"}),"https://semaphoreci.com/blog/e2e-testing")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.loom.com/share/1be8d4229cb74ed7b0526cc2acbca8ad"}),"Webinar record"))))}p.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),o=n.n(a),r=n(463),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||s))}),t)}},468:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),o=n.n(a),r=n(464);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),o=(n(480),n(479),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(483),l=n(463),s=n.n(l),c=n(471),b=n.n(c),u=n(482),p=37,m=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",o,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function h(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,O=e.size,v=(e.style,e.values),g=e.urlKey,j=Object(u.a)(),E=j.tabGroupChoices,y=j.setTabGroupChoices,f=Object(o.useState)(n),N=f[0],w=f[1];if(null!=i){var _=E[i];null!=_&&_!==N&&w(_)}var T=function(e){w(e),null!=i&&y(i,e)},R=[],A=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=b.a.parse(window.location.search);e[g]&&w(e[g])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(O||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?r.a.createElement(h,Object(a.a)({changeSelectedValue:T,handleKeydown:A,placeholder:s,selectedValue:N,size:O,tabRefs:R},e)):r.a.createElement(d,Object(a.a)({changeSelectedValue:T,handleKeydown:A,selectedValue:N,tabRefs:R},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file diff --git a/5adf400e.cb23956e.js b/5adf400e.55c3f0a6.js similarity index 99% rename from 5adf400e.cb23956e.js rename to 5adf400e.55c3f0a6.js index 2563cf712d..2945f74265 100644 --- a/5adf400e.cb23956e.js +++ b/5adf400e.55c3f0a6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[117],{268:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return u})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return d})),n.d(t,"default",(function(){return m}));var a=n(1),r=n(9),o=(n(0),n(465)),i=n(477),c=n(479),s=n(472),l=(n(473),n(464)),u=(n(469),{last_modified_on:"2024-11-27",title:"AWS EKS",description:"Learn how to configure your AWS Kubernetes clusters on Qovery"}),b={id:"using-qovery/configuration/clusters/aws",title:"AWS EKS",description:"Learn how to configure your AWS Kubernetes clusters on Qovery",source:"@site/docs/using-qovery/configuration/clusters/aws.md",permalink:"/docs/using-qovery/configuration/clusters/aws",sidebar:"docs",previous:{title:"Clusters",permalink:"/docs/using-qovery/configuration/clusters"},next:{title:"AWS EKS with Karpenter",permalink:"/docs/using-qovery/configuration/clusters/aws-with-karpenter"}},d=[{value:"Creating a AWS EKS Cluster",id:"creating-a-aws-eks-cluster",children:[]},{value:"Managing your Cluster Settings",id:"managing-your-cluster-settings",children:[]}],p={rightToc:d};function m(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},p,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"By default, clusters will be deployed with the AWS default autoscaler. If you are looking to install Qovery on your AWS cluster with the Karpenter autoscaler to improve cluster resource usage and activate spot instances, please refer to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/aws-with-karpenter/"}),"this guide"),"."),Object(o.b)(l.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Karpenter is only available for non-production clusters. If you have created a production cluster, this option will not be visible."))),Object(o.b)("h3",{id:"creating-a-aws-eks-cluster"},"Creating a AWS EKS Cluster"),Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Click on ",Object(o.b)("inlineCode",{parentName:"p"},"AWS")," as hosting mode and then ",Object(o.b)("inlineCode",{parentName:"p"},"Qovery Managed")," option:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/cluster_hosting_selection_aws.png",alt:"Cluster AWS"})),Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Create Cluster")," window enter:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Cluster name"),": enter the name of your choice for your cluster."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Description"),": enter a description to identify better your cluster."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Production cluster"),": select this option if your cluster will be used for production."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Region"),": select the geographical area in which you want your cluster to be hosted."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Credentials"),": select one of the existing cloud provider credentials or add a new one by clicking on ",Object(o.b)("inlineCode",{parentName:"li"},"New Credentials"),". In the New credentials window, add the credentials that you have generated on your cloud provider console (",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/#attach-aws-credentials"}),"Procedure for AWS account"),"). Added credentials can be used later to create and manage additional cluster.")),Object(o.b)("p",null,"To confirm, click ",Object(o.b)("inlineCode",{parentName:"p"},"Next"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Set Resources")," window, select:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Karpenter"),": to activate karpenter. If you are looking to install Qovery on your AWS with Karpenter, please refer to ",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/clusters/aws-with-karpenter/"}),"this guide")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Instance type"),": select the type of ",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/clusters/#what-is-a-cluster"}),"worker nodes")," you want to deploy to your cluster."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Disk size"),": select the size of the disks to be attached to your cluster instances (to locally store container images etc..)."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Node auto-scaling"),": define the minimum and the maximum number of worker nodes that your cluster can run. The lowest number is the number of worker nodes running on your infrastructure at any time, while the highest number is the maximum number of worker nodes that can automatically be deployed as traffic grows. Please note that a minimum of 3 worker nodes is required to deploy your EKS cluster.")),Object(o.b)("br",null),Object(o.b)(l.a,{type:"warning",mdxType:"Alert"},"Instance type selection from your Qovery Console has direct consequences on your cloud provider\u2019s bill. While Qovery allows you to switch to a different instance type whenever you want, it is your sole responsibility to keep an eye on your infrastructure costs, especially when you want to upsize.",Object(o.b)("p",null,"Please be aware that changing the instance type or disk size might cause a downtime for your service."),Object(o.b)("p",null,"For more information on the instance types provided by each cloud provider and their associated pricing, see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#what-are-the-different-instance-types-available-when-creating-a-cluster"}),"What are the different instance types available when creating a cluster?")),Object(o.b)("p",null,"Also, before downsizing, you need to ensure that your applications will still have enough resources to run correctly.")),Object(o.b)("br",null),Object(o.b)("p",null,"To confirm, click ",Object(o.b)("inlineCode",{parentName:"p"},"Next"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Features")," step, select the features you want to enable on your cluster."),Object(o.b)("p",null,"If you want to manage the network layer of your cluster by yourself, you can switch VPC mode to ",Object(o.b)("inlineCode",{parentName:"p"},"Deploy on my existing VPC")," to use your own VPC instead of the one provided by Qovery."),Object(o.b)(l.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"These options can only be configured during cluster creation and cannot be modified later.")),Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"vpc managed by qovery",placeholder:"Select a VPC mode",select:!1,size:null,values:[{group:"Features",label:"VPC managed by Qovery",value:"vpc managed by qovery"},{group:"Features",label:"Use your existing VPC",value:"use existing vpc"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"vpc managed by qovery",mdxType:"TabItem"},Object(o.b)("h4",{id:"static-ip"},"Static IP"),Object(o.b)("p",null,"By default, when your cluster is created, its worker nodes are allocated public IP addresses, which are used for external communication. For improved security and control, the ",Object(o.b)("strong",{parentName:"p"},"Static IP")," feature allows you to ensure that outbound traffic from your cluster uses specific IP addresses."),Object(o.b)("p",null,"Here is what will be deployed on your cluster:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Nat Gateways"),Object(o.b)("li",{parentName:"ul"},"Elastic IPs"),Object(o.b)("li",{parentName:"ul"},"Private subnets")),Object(o.b)("p",null,"Once set up, here is the procedure to find your static IP addresses on ",Object(o.b)("inlineCode",{parentName:"p"},"AWS"),":"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"On your AWS account, select the VPC service."),Object(o.b)("li",{parentName:"ul"},"On the left menu, you\u2019ll find Elastic IP addresses. Once on it, in the Allocated IPv4 address column, you\u2019ll have your public IPs.")),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you work in a sensitive business area such as financial technology, enabling the ",Object(o.b)("strong",{parentName:"p"},"Static IP")," feature can help fulfil the security requirements of some of the external services you use, therefore making it easier for you to get whitelisted by them."),Object(o.b)("p",null,"This feature has been activated by default. Since February 1, 2024, AWS charge public IPv4 Addresses. Disabling it may cost you more, depending on the number of nodes in your cluster. Check this ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://aws.amazon.com/blogs/aws/new-aws-public-ipv4-address-charge-public-ip-insights/"}),"link")," for more information.")),Object(o.b)("h4",{id:"custom-vpc-subnet"},"Custom VPC Subnet"),Object(o.b)("p",null,"Virtual Private Cloud (VPC) peering allows you to set up a connection between your Qovery VPC and another VPC on your AWS account. This way, you can access resources stored on your AWS VPC directly from your Qovery applications."),Object(o.b)("p",null,"A VPC can only be used if it has at least one range of IP addresses called a ",Object(o.b)("strong",{parentName:"p"},"subnet"),". When you create a cluster, Qovery automatically picks a default subnet for it. However, to perform VPC peering, you may want to define which specific VPC subnet you want to use, so that you can avoid any conflicting settings. To do so, you can enable the ",Object(o.b)("strong",{parentName:"p"},"Custom VPC Subnet")," feature on your cluster. For more information on how to set up VPC peering, ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://hub.qovery.com/guides/tutorial/aws-vpc-peering-with-qovery/"}),"see our dedicated tutorial"),".")),Object(o.b)(c.a,{value:"use existing vpc",mdxType:"TabItem"},Object(o.b)("p",null,"You have to specify the ",Object(o.b)("inlineCode",{parentName:"p"},"VPC id")," (1) and ensure that in your VPC settings you have enabled the ",Object(o.b)("inlineCode",{parentName:"p"},"DNS hostnames")," (2):"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/existing_vpc_aws_dns_hostnames.png",alt:"Existing VPC AWS DNS Hostnmaes"})),Object(o.b)("p",null,"Then you have to specify the different subnets ids:"),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"EKS"),":"),Object(o.b)("p",null,"The EKS subnets are mandatory, you have to specify at least ",Object(o.b)("strong",{parentName:"p"},"one subnet id per zone")," (1) and ensure you have enabled the ",Object(o.b)("strong",{parentName:"p"},"auto-assign public IPv4 address")," setting on your subnets (2)."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/existing_vpc_aws_auto_assign.png",alt:"Existing VPC AWS DNS Hostnmaes"})),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"Managed databases"),":"),Object(o.b)("p",null,"This section is exclusively for enabling managed databases (container databases will be enabled by default)."),Object(o.b)("p",null,"Depending on the managed databases you want to you use (",Object(o.b)("strong",{parentName:"p"},"MongoDB"),", ",Object(o.b)("strong",{parentName:"p"},"RDS:MySQL/PostgreSQL")," and ",Object(o.b)("strong",{parentName:"p"},"Redis"),"), specify at least one subnet id per zone.")))),Object(o.b)("li",null,Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Ready to install your cluster")," window, check that the services needed to install your cluster are correct."),Object(o.b)("p",null,"You can now press the ",Object(o.b)("inlineCode",{parentName:"p"},"Create and Install")," button."),Object(o.b)("p",null,"Your cluster is now displayed in your organization settings, featuring the ",Object(o.b)("inlineCode",{parentName:"p"},"Installing...")," status (orange status). Once your cluster is properly installed, its status turns to green and you will be able to deploy your applications on it."),Object(o.b)("p",null,"You can follow the execution of the action via the cluster status and/or by accessing the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#logs"}),"Cluster Logs"))))),Object(o.b)("h3",{id:"managing-your-cluster-settings"},"Managing your Cluster Settings"),Object(o.b)("p",null,"To manage the settings of an existing cluster:"),Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Open your ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery Console"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"On the left menu bar, click on the Cluster page.")),Object(o.b)("li",null,Object(o.b)("p",null,"To access your cluster settings, click on the wheel button:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/cluster_settings.png",alt:"Display Cluster Settings"}))))),Object(o.b)("p",null,"Below you can find a description of each section"),Object(o.b)("h4",{id:"general"},"General"),Object(o.b)("p",null,"The ",Object(o.b)("inlineCode",{parentName:"p"},"General")," tab allows you to define high-level information on your cluster:"),Object(o.b)("table",null,Object(o.b)("thead",{parentName:"table"},Object(o.b)("tr",{parentName:"thead"},Object(o.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Item"),Object(o.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Description"))),Object(o.b)("tbody",{parentName:"table"},Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Cluster Name"),Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To edit the name of your cluster.")),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Description"),Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To enter or edit the description of your cluster.")),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Production Cluster"),Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To enter or edit the production flag of your cluster.")))),Object(o.b)("h4",{id:"credentials"},"Credentials"),Object(o.b)("p",null,"Here you can manage here the cloud provider credentials associated with your cluster."),Object(o.b)("p",null,"If you need to change the credentials:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"generate a new set of credentials on your cloud provider(",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/#attach-aws-credentials"}),"Procedure for AWS account"),")"),Object(o.b)("li",{parentName:"ul"},'create the new credential on the Qovery by opening the drop-down and selecting "New Credentials"')),Object(o.b)("p",null,"Once created and associated, you need to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#updating-a-cluster"}),"updating your cluster")," to apply the change."),Object(o.b)("h4",{id:"resources"},"Resources"),Object(o.b)("p",null,"Qovery allows you to modify the resources allocated for your cluster:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"In the ",Object(o.b)("inlineCode",{parentName:"li"},"Instance type")," dropdown menu, select the type of ",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/clusters/#what-is-a-cluster"}),"worker node(s)")," you want to deploy to your cluster."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("em",{parentName:"li"},"(AWS users only)")," In the ",Object(o.b)("inlineCode",{parentName:"li"},"Node disk size (GB)")," field, enter the disk capacity you want to allocate to your worker node(s) (meaning how much data, in gigabytes, you want each worker node to be able to hold)."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("em",{parentName:"li"},"(EKS users only)")," On the ",Object(o.b)("inlineCode",{parentName:"li"},"Nodes auto-scaling"),", define the range of worker nodes you want to deploy to your cluster.")),Object(o.b)(l.a,{type:"warning",mdxType:"Alert"},"Instance type selection from your Qovery Console has direct consequences on your cloud provider\u2019s bill. While Qovery allows you to switch to a different instance type whenever you want, it is your sole responsibility to keep an eye on your infrastructure costs, especially when you want to upsize.",Object(o.b)("p",null,"For more information on the instance types provided by each cloud provider and their associated pricing, see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#what-are-the-different-instance-types-available-when-creating-a-cluster"}),"What are the different instance types available when creating a cluster?"))),Object(o.b)("br",null),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"The lowest number is the number of worker nodes running on your infrastructure at any time, while the highest number is the maximum number of worker nodes that can automatically be deployed as traffic grows."),Object(o.b)("p",null,"Please note that a minimum of 3 worker nodes is required to deploy your ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#creating-a-cluster"}),"EKS cluster"),".")),Object(o.b)("h4",{id:"image-registry"},"Image registry"),Object(o.b)("p",null,"In this tab, you will see that a container registry already exist (called ",Object(o.b)("inlineCode",{parentName:"p"},"registry-{$UIID}"),").\nThis is your cloud provider container registry used by Qovery to manage the deployment of your applications by mirroring the docker images."),Object(o.b)("p",null,"The credentials configured on this registry are the one used to create the cluster. But you can still update them if you prefer to manage them separately (dedicated pair of creds just to access the registry)."),Object(o.b)("p",null,"Check ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/image-mirroring/"}),"this link")," for more information."),Object(o.b)("h4",{id:"features"},"Features"),Object(o.b)("p",null,"The ",Object(o.b)("inlineCode",{parentName:"p"},"Features")," tab in your cluster settings allows you to check if the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"#static-ip"}),Object(o.b)("strong",{parentName:"a"},"Static IP")),", ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"#custom-vpc-subnet"}),Object(o.b)("strong",{parentName:"a"},"Custom VPC subnet")),", ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"#use-existing-vpc"}),Object(o.b)("strong",{parentName:"a"},"Deploy on existing VPC"))," features are enabled on your cluster. The enabled features cannot be changed after the creation of the cluster."),Object(o.b)("h4",{id:"network"},"Network"),Object(o.b)("p",null,"The ",Object(o.b)("inlineCode",{parentName:"p"},"Network")," tab in your cluster settings allows you to update your Qovery VPC route table so that you can perform VPC peering. For step-by-step guidelines on how to set up VPC peering, ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://hub.qovery.com/guides/tutorial/aws-vpc-peering-with-qovery/"}),"see our dedicated tutorial"),"."))}m.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),o=n(463),i=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,c=e.type,s=null;switch(c){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return r.a.createElement("div",{className:i()(n,"alert","alert--"+c,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:i()("feather","icon-"+(o||s))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),o=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},470:function(e,t,n){"use strict";var a=n(1),r=n(0),o=n.n(r),i=n(39),c=n(474),s=n(20),l=n.n(s);t.a=function(e){var t,n=e.to,s=e.href,u=n||s,b=Object(c.a)(u),d=Object(r.useRef)(!1),p=l.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!p&&b&&window.docusaurus.prefetch(u),function(){p&&t&&t.disconnect()}}),[u,p,b]),u&&b?o.a.createElement(i.b,Object(a.a)({},e,{onMouseEnter:function(){d.current||(window.docusaurus.preload(u),d.current=!0)},innerRef:function(e){var n,a;p&&e&&b&&(n=e,a=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:u})):o.a.createElement("a",Object(a.a)({},e,{href:u}))}},472:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(463),n(471)),i=n.n(o);n(133);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},l="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(s),u=Object(a.useState)(null),b=u[0],d=u[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!b&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return d("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:l,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==b&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=n(470),i=n(463),c=n.n(i);n(134);t.a=function(e){var t=e.children,n=e.className,a=e.badge,i=e.leftIcon,s=e.rightIcon,l=e.size,u=e.target,b=e.to,d=c()("jump-to","jump-to--"+l,n),p=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},i&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+i})),r.a.createElement("div",{className:"jump-to--main"},a?r.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return u?r.a.createElement("a",{href:b,target:u,className:d},p):r.a.createElement(o.a,{to:b,className:d},p)}},474:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},477:function(e,t,n){"use strict";var a=n(1),r=(n(481),n(478),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),i=n(483),c=n(463),s=n.n(c),l=n(471),u=n.n(l),b=n(482),d=37,p=39;function m(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,i=e.handleKeydown,c=e.style,l=e.values,u=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",r,{"tabs--block":t}),style:c},l.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:s()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return i(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function h(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,c=e.values,s=c;if(s[0].group){var l=_.groupBy(s,"group");s=Object.keys(l).map((function(e){return{label:e,options:l[e]}}))}return o.a.createElement(i.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:c.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,c=e.label,s=e.placeholder,l=e.select,y=e.size,g=(e.style,e.values),f=e.urlKey,O=Object(b.a)(),j=O.tabGroupChoices,w=O.setTabGroupChoices,v=Object(r.useState)(n),N=v[0],C=v[1];if(null!=i){var k=j[i];null!=k&&k!==N&&C(k)}var S=function(e){C(e),null!=i&&w(i,e)},P=[],E=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=u.a.parse(window.location.search);e[f]&&C(e[f])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(y||"md")},c&&o.a.createElement("div",{className:"margin-vert--sm"},c),g.length>1&&(l?o.a.createElement(h,Object(a.a)({changeSelectedValue:S,handleKeydown:E,placeholder:s,selectedValue:N,size:y,tabRefs:P},e)):o.a.createElement(m,Object(a.a)({changeSelectedValue:S,handleKeydown:E,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},479:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[117],{268:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return u})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return d})),n.d(t,"default",(function(){return m}));var a=n(1),r=n(9),o=(n(0),n(465)),i=n(477),c=n(478),s=n(472),l=(n(473),n(464)),u=(n(469),{last_modified_on:"2024-11-27",title:"AWS EKS",description:"Learn how to configure your AWS Kubernetes clusters on Qovery"}),b={id:"using-qovery/configuration/clusters/aws",title:"AWS EKS",description:"Learn how to configure your AWS Kubernetes clusters on Qovery",source:"@site/docs/using-qovery/configuration/clusters/aws.md",permalink:"/docs/using-qovery/configuration/clusters/aws",sidebar:"docs",previous:{title:"Clusters",permalink:"/docs/using-qovery/configuration/clusters"},next:{title:"AWS EKS with Karpenter",permalink:"/docs/using-qovery/configuration/clusters/aws-with-karpenter"}},d=[{value:"Creating a AWS EKS Cluster",id:"creating-a-aws-eks-cluster",children:[]},{value:"Managing your Cluster Settings",id:"managing-your-cluster-settings",children:[]}],p={rightToc:d};function m(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},p,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"By default, clusters will be deployed with the AWS default autoscaler. If you are looking to install Qovery on your AWS cluster with the Karpenter autoscaler to improve cluster resource usage and activate spot instances, please refer to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/aws-with-karpenter/"}),"this guide"),"."),Object(o.b)(l.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Karpenter is only available for non-production clusters. If you have created a production cluster, this option will not be visible."))),Object(o.b)("h3",{id:"creating-a-aws-eks-cluster"},"Creating a AWS EKS Cluster"),Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Click on ",Object(o.b)("inlineCode",{parentName:"p"},"AWS")," as hosting mode and then ",Object(o.b)("inlineCode",{parentName:"p"},"Qovery Managed")," option:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/cluster_hosting_selection_aws.png",alt:"Cluster AWS"})),Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Create Cluster")," window enter:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Cluster name"),": enter the name of your choice for your cluster."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Description"),": enter a description to identify better your cluster."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Production cluster"),": select this option if your cluster will be used for production."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Region"),": select the geographical area in which you want your cluster to be hosted."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Credentials"),": select one of the existing cloud provider credentials or add a new one by clicking on ",Object(o.b)("inlineCode",{parentName:"li"},"New Credentials"),". In the New credentials window, add the credentials that you have generated on your cloud provider console (",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/#attach-aws-credentials"}),"Procedure for AWS account"),"). Added credentials can be used later to create and manage additional cluster.")),Object(o.b)("p",null,"To confirm, click ",Object(o.b)("inlineCode",{parentName:"p"},"Next"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Set Resources")," window, select:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Karpenter"),": to activate karpenter. If you are looking to install Qovery on your AWS with Karpenter, please refer to ",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/clusters/aws-with-karpenter/"}),"this guide")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Instance type"),": select the type of ",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/clusters/#what-is-a-cluster"}),"worker nodes")," you want to deploy to your cluster."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Disk size"),": select the size of the disks to be attached to your cluster instances (to locally store container images etc..)."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Node auto-scaling"),": define the minimum and the maximum number of worker nodes that your cluster can run. The lowest number is the number of worker nodes running on your infrastructure at any time, while the highest number is the maximum number of worker nodes that can automatically be deployed as traffic grows. Please note that a minimum of 3 worker nodes is required to deploy your EKS cluster.")),Object(o.b)("br",null),Object(o.b)(l.a,{type:"warning",mdxType:"Alert"},"Instance type selection from your Qovery Console has direct consequences on your cloud provider\u2019s bill. While Qovery allows you to switch to a different instance type whenever you want, it is your sole responsibility to keep an eye on your infrastructure costs, especially when you want to upsize.",Object(o.b)("p",null,"Please be aware that changing the instance type or disk size might cause a downtime for your service."),Object(o.b)("p",null,"For more information on the instance types provided by each cloud provider and their associated pricing, see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#what-are-the-different-instance-types-available-when-creating-a-cluster"}),"What are the different instance types available when creating a cluster?")),Object(o.b)("p",null,"Also, before downsizing, you need to ensure that your applications will still have enough resources to run correctly.")),Object(o.b)("br",null),Object(o.b)("p",null,"To confirm, click ",Object(o.b)("inlineCode",{parentName:"p"},"Next"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Features")," step, select the features you want to enable on your cluster."),Object(o.b)("p",null,"If you want to manage the network layer of your cluster by yourself, you can switch VPC mode to ",Object(o.b)("inlineCode",{parentName:"p"},"Deploy on my existing VPC")," to use your own VPC instead of the one provided by Qovery."),Object(o.b)(l.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"These options can only be configured during cluster creation and cannot be modified later.")),Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"vpc managed by qovery",placeholder:"Select a VPC mode",select:!1,size:null,values:[{group:"Features",label:"VPC managed by Qovery",value:"vpc managed by qovery"},{group:"Features",label:"Use your existing VPC",value:"use existing vpc"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"vpc managed by qovery",mdxType:"TabItem"},Object(o.b)("h4",{id:"static-ip"},"Static IP"),Object(o.b)("p",null,"By default, when your cluster is created, its worker nodes are allocated public IP addresses, which are used for external communication. For improved security and control, the ",Object(o.b)("strong",{parentName:"p"},"Static IP")," feature allows you to ensure that outbound traffic from your cluster uses specific IP addresses."),Object(o.b)("p",null,"Here is what will be deployed on your cluster:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Nat Gateways"),Object(o.b)("li",{parentName:"ul"},"Elastic IPs"),Object(o.b)("li",{parentName:"ul"},"Private subnets")),Object(o.b)("p",null,"Once set up, here is the procedure to find your static IP addresses on ",Object(o.b)("inlineCode",{parentName:"p"},"AWS"),":"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"On your AWS account, select the VPC service."),Object(o.b)("li",{parentName:"ul"},"On the left menu, you\u2019ll find Elastic IP addresses. Once on it, in the Allocated IPv4 address column, you\u2019ll have your public IPs.")),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you work in a sensitive business area such as financial technology, enabling the ",Object(o.b)("strong",{parentName:"p"},"Static IP")," feature can help fulfil the security requirements of some of the external services you use, therefore making it easier for you to get whitelisted by them."),Object(o.b)("p",null,"This feature has been activated by default. Since February 1, 2024, AWS charge public IPv4 Addresses. Disabling it may cost you more, depending on the number of nodes in your cluster. Check this ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://aws.amazon.com/blogs/aws/new-aws-public-ipv4-address-charge-public-ip-insights/"}),"link")," for more information.")),Object(o.b)("h4",{id:"custom-vpc-subnet"},"Custom VPC Subnet"),Object(o.b)("p",null,"Virtual Private Cloud (VPC) peering allows you to set up a connection between your Qovery VPC and another VPC on your AWS account. This way, you can access resources stored on your AWS VPC directly from your Qovery applications."),Object(o.b)("p",null,"A VPC can only be used if it has at least one range of IP addresses called a ",Object(o.b)("strong",{parentName:"p"},"subnet"),". When you create a cluster, Qovery automatically picks a default subnet for it. However, to perform VPC peering, you may want to define which specific VPC subnet you want to use, so that you can avoid any conflicting settings. To do so, you can enable the ",Object(o.b)("strong",{parentName:"p"},"Custom VPC Subnet")," feature on your cluster. For more information on how to set up VPC peering, ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://hub.qovery.com/guides/tutorial/aws-vpc-peering-with-qovery/"}),"see our dedicated tutorial"),".")),Object(o.b)(c.a,{value:"use existing vpc",mdxType:"TabItem"},Object(o.b)("p",null,"You have to specify the ",Object(o.b)("inlineCode",{parentName:"p"},"VPC id")," (1) and ensure that in your VPC settings you have enabled the ",Object(o.b)("inlineCode",{parentName:"p"},"DNS hostnames")," (2):"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/existing_vpc_aws_dns_hostnames.png",alt:"Existing VPC AWS DNS Hostnmaes"})),Object(o.b)("p",null,"Then you have to specify the different subnets ids:"),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"EKS"),":"),Object(o.b)("p",null,"The EKS subnets are mandatory, you have to specify at least ",Object(o.b)("strong",{parentName:"p"},"one subnet id per zone")," (1) and ensure you have enabled the ",Object(o.b)("strong",{parentName:"p"},"auto-assign public IPv4 address")," setting on your subnets (2)."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/existing_vpc_aws_auto_assign.png",alt:"Existing VPC AWS DNS Hostnmaes"})),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"Managed databases"),":"),Object(o.b)("p",null,"This section is exclusively for enabling managed databases (container databases will be enabled by default)."),Object(o.b)("p",null,"Depending on the managed databases you want to you use (",Object(o.b)("strong",{parentName:"p"},"MongoDB"),", ",Object(o.b)("strong",{parentName:"p"},"RDS:MySQL/PostgreSQL")," and ",Object(o.b)("strong",{parentName:"p"},"Redis"),"), specify at least one subnet id per zone.")))),Object(o.b)("li",null,Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Ready to install your cluster")," window, check that the services needed to install your cluster are correct."),Object(o.b)("p",null,"You can now press the ",Object(o.b)("inlineCode",{parentName:"p"},"Create and Install")," button."),Object(o.b)("p",null,"Your cluster is now displayed in your organization settings, featuring the ",Object(o.b)("inlineCode",{parentName:"p"},"Installing...")," status (orange status). Once your cluster is properly installed, its status turns to green and you will be able to deploy your applications on it."),Object(o.b)("p",null,"You can follow the execution of the action via the cluster status and/or by accessing the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#logs"}),"Cluster Logs"))))),Object(o.b)("h3",{id:"managing-your-cluster-settings"},"Managing your Cluster Settings"),Object(o.b)("p",null,"To manage the settings of an existing cluster:"),Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Open your ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery Console"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"On the left menu bar, click on the Cluster page.")),Object(o.b)("li",null,Object(o.b)("p",null,"To access your cluster settings, click on the wheel button:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/cluster_settings.png",alt:"Display Cluster Settings"}))))),Object(o.b)("p",null,"Below you can find a description of each section"),Object(o.b)("h4",{id:"general"},"General"),Object(o.b)("p",null,"The ",Object(o.b)("inlineCode",{parentName:"p"},"General")," tab allows you to define high-level information on your cluster:"),Object(o.b)("table",null,Object(o.b)("thead",{parentName:"table"},Object(o.b)("tr",{parentName:"thead"},Object(o.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Item"),Object(o.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Description"))),Object(o.b)("tbody",{parentName:"table"},Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Cluster Name"),Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To edit the name of your cluster.")),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Description"),Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To enter or edit the description of your cluster.")),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Production Cluster"),Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To enter or edit the production flag of your cluster.")))),Object(o.b)("h4",{id:"credentials"},"Credentials"),Object(o.b)("p",null,"Here you can manage here the cloud provider credentials associated with your cluster."),Object(o.b)("p",null,"If you need to change the credentials:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"generate a new set of credentials on your cloud provider(",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/#attach-aws-credentials"}),"Procedure for AWS account"),")"),Object(o.b)("li",{parentName:"ul"},'create the new credential on the Qovery by opening the drop-down and selecting "New Credentials"')),Object(o.b)("p",null,"Once created and associated, you need to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#updating-a-cluster"}),"updating your cluster")," to apply the change."),Object(o.b)("h4",{id:"resources"},"Resources"),Object(o.b)("p",null,"Qovery allows you to modify the resources allocated for your cluster:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"In the ",Object(o.b)("inlineCode",{parentName:"li"},"Instance type")," dropdown menu, select the type of ",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/clusters/#what-is-a-cluster"}),"worker node(s)")," you want to deploy to your cluster."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("em",{parentName:"li"},"(AWS users only)")," In the ",Object(o.b)("inlineCode",{parentName:"li"},"Node disk size (GB)")," field, enter the disk capacity you want to allocate to your worker node(s) (meaning how much data, in gigabytes, you want each worker node to be able to hold)."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("em",{parentName:"li"},"(EKS users only)")," On the ",Object(o.b)("inlineCode",{parentName:"li"},"Nodes auto-scaling"),", define the range of worker nodes you want to deploy to your cluster.")),Object(o.b)(l.a,{type:"warning",mdxType:"Alert"},"Instance type selection from your Qovery Console has direct consequences on your cloud provider\u2019s bill. While Qovery allows you to switch to a different instance type whenever you want, it is your sole responsibility to keep an eye on your infrastructure costs, especially when you want to upsize.",Object(o.b)("p",null,"For more information on the instance types provided by each cloud provider and their associated pricing, see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#what-are-the-different-instance-types-available-when-creating-a-cluster"}),"What are the different instance types available when creating a cluster?"))),Object(o.b)("br",null),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"The lowest number is the number of worker nodes running on your infrastructure at any time, while the highest number is the maximum number of worker nodes that can automatically be deployed as traffic grows."),Object(o.b)("p",null,"Please note that a minimum of 3 worker nodes is required to deploy your ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#creating-a-cluster"}),"EKS cluster"),".")),Object(o.b)("h4",{id:"image-registry"},"Image registry"),Object(o.b)("p",null,"In this tab, you will see that a container registry already exist (called ",Object(o.b)("inlineCode",{parentName:"p"},"registry-{$UIID}"),").\nThis is your cloud provider container registry used by Qovery to manage the deployment of your applications by mirroring the docker images."),Object(o.b)("p",null,"The credentials configured on this registry are the one used to create the cluster. But you can still update them if you prefer to manage them separately (dedicated pair of creds just to access the registry)."),Object(o.b)("p",null,"Check ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/image-mirroring/"}),"this link")," for more information."),Object(o.b)("h4",{id:"features"},"Features"),Object(o.b)("p",null,"The ",Object(o.b)("inlineCode",{parentName:"p"},"Features")," tab in your cluster settings allows you to check if the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"#static-ip"}),Object(o.b)("strong",{parentName:"a"},"Static IP")),", ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"#custom-vpc-subnet"}),Object(o.b)("strong",{parentName:"a"},"Custom VPC subnet")),", ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"#use-existing-vpc"}),Object(o.b)("strong",{parentName:"a"},"Deploy on existing VPC"))," features are enabled on your cluster. The enabled features cannot be changed after the creation of the cluster."),Object(o.b)("h4",{id:"network"},"Network"),Object(o.b)("p",null,"The ",Object(o.b)("inlineCode",{parentName:"p"},"Network")," tab in your cluster settings allows you to update your Qovery VPC route table so that you can perform VPC peering. For step-by-step guidelines on how to set up VPC peering, ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://hub.qovery.com/guides/tutorial/aws-vpc-peering-with-qovery/"}),"see our dedicated tutorial"),"."))}m.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),o=n(463),i=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,c=e.type,s=null;switch(c){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return r.a.createElement("div",{className:i()(n,"alert","alert--"+c,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:i()("feather","icon-"+(o||s))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),o=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},470:function(e,t,n){"use strict";var a=n(1),r=n(0),o=n.n(r),i=n(39),c=n(474),s=n(20),l=n.n(s);t.a=function(e){var t,n=e.to,s=e.href,u=n||s,b=Object(c.a)(u),d=Object(r.useRef)(!1),p=l.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!p&&b&&window.docusaurus.prefetch(u),function(){p&&t&&t.disconnect()}}),[u,p,b]),u&&b?o.a.createElement(i.b,Object(a.a)({},e,{onMouseEnter:function(){d.current||(window.docusaurus.preload(u),d.current=!0)},innerRef:function(e){var n,a;p&&e&&b&&(n=e,a=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:u})):o.a.createElement("a",Object(a.a)({},e,{href:u}))}},472:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(463),n(471)),i=n.n(o);n(133);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},l="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(s),u=Object(a.useState)(null),b=u[0],d=u[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!b&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return d("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:l,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==b&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=n(470),i=n(463),c=n.n(i);n(134);t.a=function(e){var t=e.children,n=e.className,a=e.badge,i=e.leftIcon,s=e.rightIcon,l=e.size,u=e.target,b=e.to,d=c()("jump-to","jump-to--"+l,n),p=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},i&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+i})),r.a.createElement("div",{className:"jump-to--main"},a?r.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return u?r.a.createElement("a",{href:b,target:u,className:d},p):r.a.createElement(o.a,{to:b,className:d},p)}},474:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},477:function(e,t,n){"use strict";var a=n(1),r=(n(480),n(479),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),i=n(483),c=n(463),s=n.n(c),l=n(471),u=n.n(l),b=n(482),d=37,p=39;function m(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,i=e.handleKeydown,c=e.style,l=e.values,u=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",r,{"tabs--block":t}),style:c},l.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:s()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return i(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function h(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,c=e.values,s=c;if(s[0].group){var l=_.groupBy(s,"group");s=Object.keys(l).map((function(e){return{label:e,options:l[e]}}))}return o.a.createElement(i.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:c.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,c=e.label,s=e.placeholder,l=e.select,y=e.size,g=(e.style,e.values),f=e.urlKey,O=Object(b.a)(),j=O.tabGroupChoices,w=O.setTabGroupChoices,v=Object(r.useState)(n),N=v[0],C=v[1];if(null!=i){var k=j[i];null!=k&&k!==N&&C(k)}var S=function(e){C(e),null!=i&&w(i,e)},P=[],E=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=u.a.parse(window.location.search);e[f]&&C(e[f])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(y||"md")},c&&o.a.createElement("div",{className:"margin-vert--sm"},c),g.length>1&&(l?o.a.createElement(h,Object(a.a)({changeSelectedValue:S,handleKeydown:E,placeholder:s,selectedValue:N,size:y,tabRefs:P},e)):o.a.createElement(m,Object(a.a)({changeSelectedValue:S,handleKeydown:E,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},478:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/60154927.76fa1eec.js b/60154927.775d490b.js similarity index 98% rename from 60154927.76fa1eec.js rename to 60154927.775d490b.js index 33b2dfd70d..e527be61ed 100644 --- a/60154927.76fa1eec.js +++ b/60154927.775d490b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[123],{274:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return u})),a.d(t,"metadata",(function(){return b})),a.d(t,"rightToc",(function(){return p})),a.d(t,"default",(function(){return m}));var n=a(1),l=a(9),o=(a(0),a(465)),r=a(464),c=a(477),s=a(479),i=a(472),u={last_modified_on:"2024-07-16",title:"Local",description:"Install Qovery on your local machine"},b={id:"getting-started/install-qovery/local",title:"Local",description:"Install Qovery on your local machine",source:"@site/docs/getting-started/install-qovery/local.md",permalink:"/docs/getting-started/install-qovery/local",sidebar:"docs",previous:{title:"Install Qovery",permalink:"/docs/getting-started/install-qovery"},next:{title:"AWS",permalink:"/docs/getting-started/install-qovery/aws"}},p=[{value:"Purpose and Limitations",id:"purpose-and-limitations",children:[]},{value:"Requirements",id:"requirements",children:[]},{value:"Installation",id:"installation",children:[]},{value:"Cleanup your local environment",id:"cleanup-your-local-environment",children:[]}],d={rightToc:p};function m(e){var t=e.components,a=Object(l.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"Here is how to install Qovery on your local machine. This is the fastest way to get started with Qovery and start deploying your applications to experience the Qovery experience."),Object(o.b)("h2",{id:"purpose-and-limitations"},"Purpose and Limitations"),Object(o.b)("p",null,"It's important to note that this local setup of Qovery using the ",Object(o.b)("inlineCode",{parentName:"p"},"qovery demo up")," command is designed for demonstration and testing purposes only. It is not intended for production use. Please refer to other guides for production-grade installations."),Object(o.b)("h2",{id:"requirements"},"Requirements"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Supported Operating Systems"),": Linux, MacOS, and Windows (only on WSL)."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Resources"),": 4 CPU and 8GB of RAM for your Docker runtime."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Binaries"),": ",Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.docker.com/"}),"docker")," (up and running), git."),Object(o.b)("li",{parentName:"ul"},"A stable Internet connection."),Object(o.b)("li",{parentName:"ul"},"A Qovery account. If you don't have one, please sign up at ",Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://start.qovery.com"}),"https://start.qovery.com"))),Object(o.b)("h2",{id:"installation"},"Installation"),Object(o.b)("p",null,"To install Qovery on your local machine, follow these steps:"),Object(o.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery CLI by running the following command:"),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(s.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(s.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(s.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(s.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(s.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(s.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(s.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(s.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(s.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(s.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(s.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(s.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("p",null,"Authenticate with Qovery by running the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(r.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")),Object(o.b)("li",null,Object(o.b)("p",null,"Set Qovery context:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"\nqovery context set\n\n"))),Object(o.b)("li",null,Object(o.b)("p",null,"Start the Qovery demo by running the following command:"),Object(o.b)(r.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Ensure you have ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.docker.com/"}),"Docker")," running and that you have installed jq, curl, sed, grep, and git.")),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"\nqovery demo up\n\n")),Object(o.b)("p",null,"A k3s Kubernetes cluster will be installed on your local machine and Qovery will be installed on top of it."),Object(o.b)("p",null,"Note that if you are on MacOS or Windows, you might be prompted for your admin password - which is necessary to properly route the traffic from your host to your k3s apps."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-shell"}),'...\n""""""""""""""""""""""""""""""""""""""""""""\nConfigure network\n""""""""""""""""""""""""""""""""""""""""""""\n+ sudo ifconfig lo0 alias 172.42.0.3/32 up\nPassword:\n...\n')),Object(o.b)("p",null,"At the end of the installation, you will see the following message:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-shell"}),'...\n\n""""""""""""""""""""""""""""""""""""""""""""\nQovery demo cluster is now installed !!!!\nThe kubeconfig is correctly set, so you can connect to it directly with kubectl or k9s from your local machine\nTo delete/stop/start your cluster, use k3d cluster xxxx\n\nGo to https://console.qovery.com to create your first environment on this cluster \'hello-local-cluster\'\n""""""""""""""""""""""""""""""""""""""""""""\n'))),Object(o.b)("li",null,Object(o.b)("p",null,"Access the Qovery dashboard by visiting ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://console.qovery.com"}),"console.qovery.com"),".")))),Object(o.b)("p",null,"Well done, you have successfully installed Qovery on your local machine. You can now start deploying your applications and experience the Qovery experience."),Object(o.b)("h2",{id:"cleanup-your-local-environment"},"Cleanup your local environment"),Object(o.b)("p",null,"To clean up your local environment, run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"\nqovery demo destroy\n\n")),Object(o.b)("p",null,"That's it! You have successfully removed the Qovery demo cluster from your local machine."))}m.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),l=a.n(n),o=a(463),r=a.n(o);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,o=e.icon,c=e.type,s=null;switch(c){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return l.a.createElement("div",{className:r()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==o}),role:"alert"},!1!==o&&l.a.createElement("i",{className:r()("feather","icon-"+(o||s))}),t)}},472:function(e,t,a){"use strict";var n=a(0),l=a.n(n),o=(a(463),a(471)),r=a.n(o);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,o=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},i="https://github.com/qovery/documentation/issues/new?"+r.a.stringify(s),u=Object(n.useState)(null),b=u[0],p=u[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!o&&!b&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:i,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==b&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,t,a){"use strict";var n=a(1),l=(a(481),a(478),a(52),a(29),a(22),a(21),a(0)),o=a.n(l),r=a(483),c=a(463),s=a.n(c),i=a(471),u=a.n(i),b=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,r=e.handleKeydown,c=e.style,i=e.values,u=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:a?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",l,{"tabs--block":t}),style:c},i.map((function(e){var t=e.value,a=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:s()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return r(b,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,c=e.values,s=c;if(s[0].group){var i=_.groupBy(s,"group");s=Object.keys(i).map((function(e){return{label:e,options:i[e]}}))}return o.a.createElement(r.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:s,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,r=e.groupId,c=e.label,s=e.placeholder,i=e.select,y=e.size,v=(e.style,e.values),O=e.urlKey,j=Object(b.a)(),g=j.tabGroupChoices,f=j.setTabGroupChoices,w=Object(l.useState)(a),N=w[0],T=w[1];if(null!=r){var k=g[r];null!=k&&k!==N&&T(k)}var x=function(e){T(e),null!=r&&f(r,e)},I=[],q=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=u.a.parse(window.location.search);e[O]&&T(e[O])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(y||"md")},c&&o.a.createElement("div",{className:"margin-vert--sm"},c),v.length>1&&(i?o.a.createElement(h,Object(n.a)({changeSelectedValue:x,handleKeydown:q,placeholder:s,selectedValue:N,size:y,tabRefs:I},e)):o.a.createElement(m,Object(n.a)({changeSelectedValue:x,handleKeydown:q,selectedValue:N,tabRefs:I},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},479:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[123],{274:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return u})),a.d(t,"metadata",(function(){return b})),a.d(t,"rightToc",(function(){return p})),a.d(t,"default",(function(){return m}));var n=a(1),l=a(9),o=(a(0),a(465)),r=a(464),c=a(477),s=a(478),i=a(472),u={last_modified_on:"2024-07-16",title:"Local",description:"Install Qovery on your local machine"},b={id:"getting-started/install-qovery/local",title:"Local",description:"Install Qovery on your local machine",source:"@site/docs/getting-started/install-qovery/local.md",permalink:"/docs/getting-started/install-qovery/local",sidebar:"docs",previous:{title:"Install Qovery",permalink:"/docs/getting-started/install-qovery"},next:{title:"AWS",permalink:"/docs/getting-started/install-qovery/aws"}},p=[{value:"Purpose and Limitations",id:"purpose-and-limitations",children:[]},{value:"Requirements",id:"requirements",children:[]},{value:"Installation",id:"installation",children:[]},{value:"Cleanup your local environment",id:"cleanup-your-local-environment",children:[]}],d={rightToc:p};function m(e){var t=e.components,a=Object(l.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"Here is how to install Qovery on your local machine. This is the fastest way to get started with Qovery and start deploying your applications to experience the Qovery experience."),Object(o.b)("h2",{id:"purpose-and-limitations"},"Purpose and Limitations"),Object(o.b)("p",null,"It's important to note that this local setup of Qovery using the ",Object(o.b)("inlineCode",{parentName:"p"},"qovery demo up")," command is designed for demonstration and testing purposes only. It is not intended for production use. Please refer to other guides for production-grade installations."),Object(o.b)("h2",{id:"requirements"},"Requirements"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Supported Operating Systems"),": Linux, MacOS, and Windows (only on WSL)."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Resources"),": 4 CPU and 8GB of RAM for your Docker runtime."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Binaries"),": ",Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.docker.com/"}),"docker")," (up and running), git."),Object(o.b)("li",{parentName:"ul"},"A stable Internet connection."),Object(o.b)("li",{parentName:"ul"},"A Qovery account. If you don't have one, please sign up at ",Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://start.qovery.com"}),"https://start.qovery.com"))),Object(o.b)("h2",{id:"installation"},"Installation"),Object(o.b)("p",null,"To install Qovery on your local machine, follow these steps:"),Object(o.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery CLI by running the following command:"),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(s.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(s.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(s.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(s.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(s.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(s.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(s.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(s.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(s.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(s.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(s.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(s.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("p",null,"Authenticate with Qovery by running the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(r.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")),Object(o.b)("li",null,Object(o.b)("p",null,"Set Qovery context:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"\nqovery context set\n\n"))),Object(o.b)("li",null,Object(o.b)("p",null,"Start the Qovery demo by running the following command:"),Object(o.b)(r.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Ensure you have ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.docker.com/"}),"Docker")," running and that you have installed jq, curl, sed, grep, and git.")),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"\nqovery demo up\n\n")),Object(o.b)("p",null,"A k3s Kubernetes cluster will be installed on your local machine and Qovery will be installed on top of it."),Object(o.b)("p",null,"Note that if you are on MacOS or Windows, you might be prompted for your admin password - which is necessary to properly route the traffic from your host to your k3s apps."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-shell"}),'...\n""""""""""""""""""""""""""""""""""""""""""""\nConfigure network\n""""""""""""""""""""""""""""""""""""""""""""\n+ sudo ifconfig lo0 alias 172.42.0.3/32 up\nPassword:\n...\n')),Object(o.b)("p",null,"At the end of the installation, you will see the following message:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-shell"}),'...\n\n""""""""""""""""""""""""""""""""""""""""""""\nQovery demo cluster is now installed !!!!\nThe kubeconfig is correctly set, so you can connect to it directly with kubectl or k9s from your local machine\nTo delete/stop/start your cluster, use k3d cluster xxxx\n\nGo to https://console.qovery.com to create your first environment on this cluster \'hello-local-cluster\'\n""""""""""""""""""""""""""""""""""""""""""""\n'))),Object(o.b)("li",null,Object(o.b)("p",null,"Access the Qovery dashboard by visiting ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://console.qovery.com"}),"console.qovery.com"),".")))),Object(o.b)("p",null,"Well done, you have successfully installed Qovery on your local machine. You can now start deploying your applications and experience the Qovery experience."),Object(o.b)("h2",{id:"cleanup-your-local-environment"},"Cleanup your local environment"),Object(o.b)("p",null,"To clean up your local environment, run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"\nqovery demo destroy\n\n")),Object(o.b)("p",null,"That's it! You have successfully removed the Qovery demo cluster from your local machine."))}m.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),l=a.n(n),o=a(463),r=a.n(o);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,o=e.icon,c=e.type,s=null;switch(c){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return l.a.createElement("div",{className:r()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==o}),role:"alert"},!1!==o&&l.a.createElement("i",{className:r()("feather","icon-"+(o||s))}),t)}},472:function(e,t,a){"use strict";var n=a(0),l=a.n(n),o=(a(463),a(471)),r=a.n(o);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,o=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},i="https://github.com/qovery/documentation/issues/new?"+r.a.stringify(s),u=Object(n.useState)(null),b=u[0],p=u[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!o&&!b&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:i,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==b&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,t,a){"use strict";var n=a(1),l=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),o=a.n(l),r=a(483),c=a(463),s=a.n(c),i=a(471),u=a.n(i),b=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,r=e.handleKeydown,c=e.style,i=e.values,u=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:a?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",l,{"tabs--block":t}),style:c},i.map((function(e){var t=e.value,a=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:s()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return r(b,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,c=e.values,s=c;if(s[0].group){var i=_.groupBy(s,"group");s=Object.keys(i).map((function(e){return{label:e,options:i[e]}}))}return o.a.createElement(r.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:s,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,r=e.groupId,c=e.label,s=e.placeholder,i=e.select,y=e.size,v=(e.style,e.values),O=e.urlKey,j=Object(b.a)(),g=j.tabGroupChoices,f=j.setTabGroupChoices,w=Object(l.useState)(a),N=w[0],T=w[1];if(null!=r){var k=g[r];null!=k&&k!==N&&T(k)}var x=function(e){T(e),null!=r&&f(r,e)},I=[],q=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=u.a.parse(window.location.search);e[O]&&T(e[O])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(y||"md")},c&&o.a.createElement("div",{className:"margin-vert--sm"},c),v.length>1&&(i?o.a.createElement(h,Object(n.a)({changeSelectedValue:x,handleKeydown:q,placeholder:s,selectedValue:N,size:y,tabRefs:I},e)):o.a.createElement(m,Object(n.a)({changeSelectedValue:x,handleKeydown:q,selectedValue:N,tabRefs:I},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},478:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/60296d59.65939d76.js b/60296d59.b615948e.js similarity index 98% rename from 60296d59.65939d76.js rename to 60296d59.b615948e.js index 88fba35393..54ad48157c 100644 --- a/60296d59.65939d76.js +++ b/60296d59.b615948e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[124],{275:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return u})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return d}));var n=a(1),o=a(9),r=(a(0),a(465)),l=a(477),c=a(479),i=a(464),s=a(469),b=(a(473),{last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0}),u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",permalink:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli",readingTime:"5 min read",source:"@site/guides/tutorial/import-your-environment-variables-with-the-qovery-cli.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Import your environment variables with the Qovery CLI",truncated:!1,prevItem:{title:"How to write a Dockerfile",permalink:"/guides/tutorial/how-to-write-a-dockerfile"},nextItem:{title:"Integrate your application logs to Cloudwatch",permalink:"/guides/tutorial/cloudwatch-integration"}},m=[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Set your context",id:"set-your-context",children:[]},{value:"Import",id:"import",children:[{value:"Environment Variables",id:"environment-variables",children:[]},{value:"Secrets",id:"secrets",children:[]}]},{value:"Check",id:"check",children:[]}],p={rightToc:m};function d(e){var t=e.components,a=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},p,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The Qovery Web Interface support ",Object(r.b)("inlineCode",{parentName:"p"},".env")," (dot env) file import now. ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#import-environment-variables"}),"Check out the documentation"))),Object(r.b)("p",null,"When dealing with dozens of environment variables, it can be tedious to import them one by one. This is where the Qovery CLI with the env vars import feature helps. In this tutorial, you will learn how to import your environment variables and secrets via the Qovery CLI."),Object(r.b)(s.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Your dotenv (",Object(r.b)("inlineCode",{parentName:"li"},".env"),") file is ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://smartmob-rfc.readthedocs.io/en/latest/2-dotenv.html"}),"compliant to the following specs")),Object(r.b)("li",{parentName:"ul"},"You have created your application in Qovery"))),Object(r.b)("h2",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(c.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),"."))),Object(r.b)("h2",{id:"set-your-context"},"Set your context"),Object(r.b)("p",null,"Once you are authenticated with ",Object(r.b)("inlineCode",{parentName:"p"},"qovery auth"),", you must choose the application where you want to set the environment variables with the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery context set"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="connect to qovery"',title:'"connect',to:!0,'qovery"':!0}),"$ qovery auth\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="set the context"',title:'"set',the:!0,'context"':!0}),"~/Desktop $ qovery context set\nQovery: Current context:\nOrganization | Qovery Community\nProject | posthog\nEnvironment | prod\nApplication | proxy\n\nQovery: Select new context\nOrganization:\n\u2714 Qovery Realm\nProject:\n\u2714 Posthog\nEnvironment:\n\u2714 prod\nApplication:\n\u2714 nginx-proxy\n\nQovery: New context:\nOrganization | Qovery Realm\nProject | Posthog\nEnvironment | prod\nApplication | nginx-proxy\n")),Object(r.b)("h2",{id:"import"},"Import"),Object(r.b)("p",null,"With Qovery, you make the distinction between Environment Variables and Secrets. Basically, the value of a Secret is encrypted and cannot be revealed."),Object(r.b)("p",null,"Let's say that we have the following dotenv file ",Object(r.b)("inlineCode",{parentName:"p"},".env.development")," that we want to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-text",metastring:"title=.env.development",title:".env.development"}),"STRAPI_API_KEY=x.xxyyyzzz\nCOLOR_BACKGROUND=fff\nAUTH0_API_KEY_SECRET=0xb33f\nAPI_URL=https://api.mytld.com\n")),Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"STRAPI_API_KEY")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AUTH0_API_KEY_SECRET")," are Secrets. ",Object(r.b)("inlineCode",{parentName:"p"},"COLOR_BACKGROUND")," and ",Object(r.b)("inlineCode",{parentName:"p"},"API_URL")," are Environment Variables."),Object(r.b)("h3",{id:"environment-variables"},"Environment Variables"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Environment Variables works.")),Object(r.b)("p",null,"To import the Environment Variables from this file we run the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and we select the environment variables to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] COLOR_BACKGROUND=fff\n [ ] AUTH0_API_KEY_SECRET=0xb33f\n> [x] API_URL=https://api.mytld.com\n [ ] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? COLOR_BACKGROUND=fff, API_URL=https://api.mytld.com\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)("p",null,"If during the import something goes wrong, you will see the errors and why it failed."),Object(r.b)("h3",{id:"secrets"},"Secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Secrets works.")),Object(r.b)("p",null,"To import the Secrets, you need to run the same command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and select the secrets to import."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Secrets\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [ ] COLOR_BACKGROUND=fff\n [x] AUTH0_API_KEY_SECRET=0xb33f\n [ ] API_URL=https://api.mytld.com\n> [x] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? STRAPI_API_KEY=x.xxyyyzzz, AUTH0_API_KEY_SECRET=0xb33\nQovery: \u2705 Secrets successfully imported!\n")),Object(r.b)("h2",{id:"check"},"Check"),Object(r.b)("p",null,"Open your environment variables console to check that everything has been set correctly."))}d.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),o=a.n(n),r=a(463),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,i=null;switch(c){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return o.a.createElement("div",{className:l()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:l()("feather","icon-"+(r||i))}),t)}},468:function(e,t,a){var n=a(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||a(10)&&n(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),o=a.n(n),r=a(464);t.a=function(e){var t=e.children,a=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),o=a(0),r=a.n(o),l=a(39),c=a(474),i=a(20),s=a.n(i);t.a=function(e){var t,a=e.to,i=e.href,b=a||i,u=Object(c.a)(b),m=Object(o.useRef)(!1),p=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!p&&u&&window.docusaurus.prefetch(b),function(){p&&t&&t.disconnect()}}),[b,p,u]),b&&u?r.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){m.current||(window.docusaurus.preload(b),m.current=!0)},innerRef:function(e){var a,n;p&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},473:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=a(470),l=a(463),c=a.n(l);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,i=e.rightIcon,s=e.size,b=e.target,u=e.to,m=c()("jump-to","jump-to--"+s,a),p=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},l&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+l})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(i||"chevron-right")+" arrow"}))));return b?o.a.createElement("a",{href:u,target:b,className:m},p):o.a.createElement(r.a,{to:u,className:m},p)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),o=(a(481),a(478),a(52),a(29),a(22),a(21),a(0)),r=a.n(o),l=a(483),c=a(463),i=a.n(c),s=a(471),b=a.n(s),u=a(482),m=37,p=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,o=e.className,l=e.handleKeydown,c=e.style,s=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",o,{"tabs--block":t}),style:c},s.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:i()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return l(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function v(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,o=e.size,c=e.values,i=c;if(i[0].group){var s=_.groupBy(i,"group");i=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:i,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,c=e.label,i=e.placeholder,s=e.select,h=e.size,y=(e.style,e.values),O=e.urlKey,f=Object(u.a)(),j=f.tabGroupChoices,g=f.setTabGroupChoices,w=Object(o.useState)(a),N=w[0],x=w[1];if(null!=l){var I=j[l];null!=I&&I!==N&&x(I)}var T=function(e){x(e),null!=l&&g(l,e)},C=[],E=function(e,t,a){switch(a.keyCode){case p:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&x(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),y.length>1&&(s?r.a.createElement(v,Object(n.a)({changeSelectedValue:T,handleKeydown:E,placeholder:i,selectedValue:N,size:h,tabRefs:C},e)):r.a.createElement(d,Object(n.a)({changeSelectedValue:T,handleKeydown:E,selectedValue:N,tabRefs:C},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},479:function(e,t,a){"use strict";var n=a(0),o=a.n(n);t.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[124],{275:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return u})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return d}));var n=a(1),o=a(9),r=(a(0),a(465)),l=a(477),c=a(478),i=a(464),s=a(469),b=(a(473),{last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0}),u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",permalink:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli",readingTime:"5 min read",source:"@site/guides/tutorial/import-your-environment-variables-with-the-qovery-cli.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Import your environment variables with the Qovery CLI",truncated:!1,prevItem:{title:"How to write a Dockerfile",permalink:"/guides/tutorial/how-to-write-a-dockerfile"},nextItem:{title:"Integrate your application logs to Cloudwatch",permalink:"/guides/tutorial/cloudwatch-integration"}},m=[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Set your context",id:"set-your-context",children:[]},{value:"Import",id:"import",children:[{value:"Environment Variables",id:"environment-variables",children:[]},{value:"Secrets",id:"secrets",children:[]}]},{value:"Check",id:"check",children:[]}],p={rightToc:m};function d(e){var t=e.components,a=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},p,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The Qovery Web Interface support ",Object(r.b)("inlineCode",{parentName:"p"},".env")," (dot env) file import now. ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#import-environment-variables"}),"Check out the documentation"))),Object(r.b)("p",null,"When dealing with dozens of environment variables, it can be tedious to import them one by one. This is where the Qovery CLI with the env vars import feature helps. In this tutorial, you will learn how to import your environment variables and secrets via the Qovery CLI."),Object(r.b)(s.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Your dotenv (",Object(r.b)("inlineCode",{parentName:"li"},".env"),") file is ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://smartmob-rfc.readthedocs.io/en/latest/2-dotenv.html"}),"compliant to the following specs")),Object(r.b)("li",{parentName:"ul"},"You have created your application in Qovery"))),Object(r.b)("h2",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(c.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),"."))),Object(r.b)("h2",{id:"set-your-context"},"Set your context"),Object(r.b)("p",null,"Once you are authenticated with ",Object(r.b)("inlineCode",{parentName:"p"},"qovery auth"),", you must choose the application where you want to set the environment variables with the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery context set"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="connect to qovery"',title:'"connect',to:!0,'qovery"':!0}),"$ qovery auth\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="set the context"',title:'"set',the:!0,'context"':!0}),"~/Desktop $ qovery context set\nQovery: Current context:\nOrganization | Qovery Community\nProject | posthog\nEnvironment | prod\nApplication | proxy\n\nQovery: Select new context\nOrganization:\n\u2714 Qovery Realm\nProject:\n\u2714 Posthog\nEnvironment:\n\u2714 prod\nApplication:\n\u2714 nginx-proxy\n\nQovery: New context:\nOrganization | Qovery Realm\nProject | Posthog\nEnvironment | prod\nApplication | nginx-proxy\n")),Object(r.b)("h2",{id:"import"},"Import"),Object(r.b)("p",null,"With Qovery, you make the distinction between Environment Variables and Secrets. Basically, the value of a Secret is encrypted and cannot be revealed."),Object(r.b)("p",null,"Let's say that we have the following dotenv file ",Object(r.b)("inlineCode",{parentName:"p"},".env.development")," that we want to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-text",metastring:"title=.env.development",title:".env.development"}),"STRAPI_API_KEY=x.xxyyyzzz\nCOLOR_BACKGROUND=fff\nAUTH0_API_KEY_SECRET=0xb33f\nAPI_URL=https://api.mytld.com\n")),Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"STRAPI_API_KEY")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AUTH0_API_KEY_SECRET")," are Secrets. ",Object(r.b)("inlineCode",{parentName:"p"},"COLOR_BACKGROUND")," and ",Object(r.b)("inlineCode",{parentName:"p"},"API_URL")," are Environment Variables."),Object(r.b)("h3",{id:"environment-variables"},"Environment Variables"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Environment Variables works.")),Object(r.b)("p",null,"To import the Environment Variables from this file we run the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and we select the environment variables to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] COLOR_BACKGROUND=fff\n [ ] AUTH0_API_KEY_SECRET=0xb33f\n> [x] API_URL=https://api.mytld.com\n [ ] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? COLOR_BACKGROUND=fff, API_URL=https://api.mytld.com\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)("p",null,"If during the import something goes wrong, you will see the errors and why it failed."),Object(r.b)("h3",{id:"secrets"},"Secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Secrets works.")),Object(r.b)("p",null,"To import the Secrets, you need to run the same command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and select the secrets to import."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Secrets\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [ ] COLOR_BACKGROUND=fff\n [x] AUTH0_API_KEY_SECRET=0xb33f\n [ ] API_URL=https://api.mytld.com\n> [x] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? STRAPI_API_KEY=x.xxyyyzzz, AUTH0_API_KEY_SECRET=0xb33\nQovery: \u2705 Secrets successfully imported!\n")),Object(r.b)("h2",{id:"check"},"Check"),Object(r.b)("p",null,"Open your environment variables console to check that everything has been set correctly."))}d.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),o=a.n(n),r=a(463),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,i=null;switch(c){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return o.a.createElement("div",{className:l()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:l()("feather","icon-"+(r||i))}),t)}},468:function(e,t,a){var n=a(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||a(10)&&n(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),o=a.n(n),r=a(464);t.a=function(e){var t=e.children,a=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),o=a(0),r=a.n(o),l=a(39),c=a(474),i=a(20),s=a.n(i);t.a=function(e){var t,a=e.to,i=e.href,b=a||i,u=Object(c.a)(b),m=Object(o.useRef)(!1),p=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!p&&u&&window.docusaurus.prefetch(b),function(){p&&t&&t.disconnect()}}),[b,p,u]),b&&u?r.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){m.current||(window.docusaurus.preload(b),m.current=!0)},innerRef:function(e){var a,n;p&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},473:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=a(470),l=a(463),c=a.n(l);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,i=e.rightIcon,s=e.size,b=e.target,u=e.to,m=c()("jump-to","jump-to--"+s,a),p=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},l&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+l})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(i||"chevron-right")+" arrow"}))));return b?o.a.createElement("a",{href:u,target:b,className:m},p):o.a.createElement(r.a,{to:u,className:m},p)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),o=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),r=a.n(o),l=a(483),c=a(463),i=a.n(c),s=a(471),b=a.n(s),u=a(482),m=37,p=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,o=e.className,l=e.handleKeydown,c=e.style,s=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",o,{"tabs--block":t}),style:c},s.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:i()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return l(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function v(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,o=e.size,c=e.values,i=c;if(i[0].group){var s=_.groupBy(i,"group");i=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:i,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,c=e.label,i=e.placeholder,s=e.select,h=e.size,y=(e.style,e.values),O=e.urlKey,f=Object(u.a)(),j=f.tabGroupChoices,g=f.setTabGroupChoices,w=Object(o.useState)(a),N=w[0],x=w[1];if(null!=l){var I=j[l];null!=I&&I!==N&&x(I)}var T=function(e){x(e),null!=l&&g(l,e)},C=[],E=function(e,t,a){switch(a.keyCode){case p:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&x(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),y.length>1&&(s?r.a.createElement(v,Object(n.a)({changeSelectedValue:T,handleKeydown:E,placeholder:i,selectedValue:N,size:h,tabRefs:C},e)):r.a.createElement(d,Object(n.a)({changeSelectedValue:T,handleKeydown:E,selectedValue:N,tabRefs:C},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},478:function(e,t,a){"use strict";var n=a(0),o=a.n(n);t.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/672ba3d6.ff04d85f.js b/672ba3d6.06e5ed37.js similarity index 99% rename from 672ba3d6.ff04d85f.js rename to 672ba3d6.06e5ed37.js index 84a2ed3628..056e7d4d4e 100644 --- a/672ba3d6.ff04d85f.js +++ b/672ba3d6.06e5ed37.js @@ -1,2 +1,2 @@ -/*! For license information please see 672ba3d6.ff04d85f.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[130],{281:function(e,t,a){"use strict";a.r(t);var n=a(0),r=a.n(n),o=a(490),i=a(487),c=a(602),l=a(476),s=Object(o.a)("h2");t.default=function(){var e=Object(l.a)().siteConfig;return(void 0===e?{}:e).customFields.metadata.team,r.a.createElement(i.a,{title:"Community",description:"Join the Qovery community. Connect with the core Qovery team and other Qovery users."},r.a.createElement("header",{className:"hero"},r.a.createElement("div",{className:"container container--fluid"},r.a.createElement("h1",null,"Qovery Community"),r.a.createElement(c.a,{buttonClass:"highlight",center:!0,size:"lg"}))),r.a.createElement("main",null,r.a.createElement("section",null,r.a.createElement("div",{className:"container"},r.a.createElement(s,{id:"connect"},"Connect"),r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://community.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-globe"})),r.a.createElement("div",{className:"panel--title"},"Forum"),r.a.createElement("div",{className:"panel--description"},"Join our community on Discourse"))))),r.a.createElement("div",{className:"container"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://twitter.com/Qovery_",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-twitter",title:"Twitter"})),r.a.createElement("div",{className:"panel--title"},"@Qovery"),r.a.createElement("div",{className:"panel--description"},"Follow us in real-time"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-github"})),r.a.createElement("div",{className:"panel--title"},"Github qovery"),r.a.createElement("div",{className:"panel--description"},"Issues, code, and development"))))))))}},463:function(e,t,a){var n;!function(){"use strict";var a={}.hasOwnProperty;function r(){for(var e=[],t=0;t0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(u.a,{className:"navbar__logo",src:f,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),l.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(z,e))}))):null)}))),(m||i)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:M.a.footerLogoLink},r.a.createElement(Q,{alt:m.alt,url:d})):r.a.createElement(Q,{alt:m.alt,url:d})),r.a.createElement("small",null,i),r.a.createElement("br",null))))},F=a(502),Z=a(503),J=a(3);a(138);t.a=function(e){var t=Object(h.a)().siteConfig,a=void 0===t?{}:t,n=a.title,c=a.themeConfig.image,l=a.url,s=e.children,m=e.title,u=e.noFooter,d=e.description,f=e.image,p=e.keywords,g=e.version,v=m?m+" | "+n:n,b=f||c,E=l+Object(_.a)(b),y=Object(J.h)(),w=y?"https://docs.qovery.com"+(y.pathname.endsWith("/")?y.pathname:y.pathname+"/"):null;return r.a.createElement(Z.a,null,r.a.createElement(F.a,null,r.a.createElement(i.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),v&&r.a.createElement("title",null,v),v&&r.a.createElement("meta",{property:"og:title",content:v}),r.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),r.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),r.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),r.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),r.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),r.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),d&&r.a.createElement("meta",{name:"description",content:d}),d&&r.a.createElement("meta",{property:"og:description",content:d}),g&&r.a.createElement("meta",{name:"docsearch:version",content:g}),p&&p.length&&r.a.createElement("meta",{name:"keywords",content:p.join(",")}),b&&r.a.createElement("meta",{property:"og:image",content:E}),b&&r.a.createElement("meta",{property:"twitter:image",content:E}),b&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+v}),w&&r.a.createElement("meta",{property:"og:url",content:w}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),w&&r.a.createElement("link",{rel:"canonical",href:w})),r.a.createElement(o.a,null),r.a.createElement(L,null),r.a.createElement("div",{className:"main-wrapper"},s),!u&&r.a.createElement(q,null)))}},490:function(e,t,a){"use strict";var n=a(9),r=a(0),o=a.n(r),i=a(463),c=a.n(i),l=a(476),s=(a(139),a(140)),m=a.n(s);t.a=function(e){return function(t){var a,r=t.id,i=Object(n.a)(t,["id"]),s=Object(l.a)().siteConfig,u=(s=void 0===s?{}:s).themeConfig,d=(u=void 0===u?{}:u).navbar,f=(d=void 0===d?{}:d).hideOnScroll,h=void 0!==f&&f;return r?o.a.createElement(e,i,o.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:c()("anchor",(a={},a[m.a.enhancedAnchor]=!h,a)),id:r}),o.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),i.children):o.a.createElement(e,i)}}},494:function(e,t,a){"use strict";var n=a(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=r},519:function(e,t){var a,n,r=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function c(e){if(a===setTimeout)return setTimeout(e,0);if((a===o||!a)&&setTimeout)return a=setTimeout,setTimeout(e,0);try{return a(e,0)}catch(t){try{return a.call(null,e,0)}catch(t){return a.call(this,e,0)}}}!function(){try{a="function"==typeof setTimeout?setTimeout:o}catch(e){a=o}try{n="function"==typeof clearTimeout?clearTimeout:i}catch(e){n=i}}();var l,s=[],m=!1,u=-1;function d(){m&&l&&(m=!1,l.length?s=l.concat(s):u=-1,s.length&&f())}function f(){if(!m){var e=c(d);m=!0;for(var t=s.length;t;){for(l=s,s=[];++u1)for(var a=1;a=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(e){}}(),t.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],t.formatters.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},t.enable(r())}).call(this,a(519))},596:function(e,t,a){var n;function r(e){function a(){if(a.enabled){var e=a,r=+new Date,o=r-(n||r);e.diff=o,e.prev=n,e.curr=r,n=r;for(var i=new Array(arguments.length),c=0;c0)return function(e){if((e=String(e)).length>100)return;var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(!t)return;var i=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*i;case"days":case"day":case"d":return i*o;case"hours":case"hour":case"hrs":case"hr":case"h":return i*r;case"minutes":case"minute":case"mins":case"min":case"m":return i*n;case"seconds":case"second":case"secs":case"sec":case"s":return i*a;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return i;default:return}}(e);if("number"===l&&!1===isNaN(e))return t.long?i(c=e,o,"day")||i(c,r,"hour")||i(c,n,"minute")||i(c,a,"second")||c+" ms":function(e){if(e>=o)return Math.round(e/o)+"d";if(e>=r)return Math.round(e/r)+"h";if(e>=n)return Math.round(e/n)+"m";if(e>=a)return Math.round(e/a)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},598:function(e,t,a){"use strict";var n=/^[-!#$%&'*+\/0-9=?A-Z^_a-z{|}~](\.?[-!#$%&'*+\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\.?[a-zA-Z0-9])*\.[a-zA-Z](-?[a-zA-Z0-9])+$/;t.validate=function(e){if(!e)return!1;if(e.length>254)return!1;if(!n.test(e))return!1;var t=e.split("@");return!(t[0].length>64)&&!t[1].split(".").some((function(e){return e.length>63}))}},602:function(e,t,a){"use strict";a(488),a(489);var n=a(0),r=a.n(n),o=a(463),i=a.n(o),c=(a(58),a(21),a(594)),l=a.n(c),s=a(598),m=function(e){return new Promise((function(t,a){return l()(e,{param:"c",timeout:3500},(function(e,n){e&&a(e),n&&t(n)}))}))},u=function(e){var t="";for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var n="group["===a.substring(0,6)?a:a.toUpperCase();t=t.concat("&"+n+"="+e[a])}return t},d=function(e,t,a){var n=Object(s.validate)(e),r=encodeURIComponent(e);if(!n)return Promise.resolve({result:"error",msg:"The email you entered is not valid."});var o="https://qovery.us4.list-manage.com/subscribe/post-json?u=3c76e7a2087d5bc4020348c46&id=63bd993879";arguments.length<3&&"string"==typeof t?o=t:"string"==typeof a&&(o=a);var i="&EMAIL="+r+u(t),c=""+o+i;return m(c)};a(152),t.a=function(e){var t,a=e.block,o=e.buttonClass,c=e.center,l=e.description,s=e.subscriptionEnabled,m=e.size,u=e.width,f=Object(n.useState)(""),h=f[0],p=f[1],g=Object(n.useState)(!1),v=g[0],b=g[1],E=Object(n.useState)(!1),y=E[0],w=E[1],N=Object(n.useState)("Could not subscribe :("),k=N[0],_=N[1];return r.a.createElement("div",{className:i()("mailing-list",(t={"mailing-list--block":a,"mailing-list--center":c},t["mailing-list--"+m]=m,t))},!1!==l&&r.a.createElement("div",{className:"mailing-list--description"},l),s&&!v&&r.a.createElement("form",{onSubmit:function(e){return function(e){e.preventDefault(),d(h).then((function(e){"success"===e.result?(b(!0),y&&w(!1)):(w(!0),e.msg.includes(h+" is already subscribed")?_("This email is already subscribed to the newsletter"):_("Could not subscribe :("))})).catch((function(e){w(!0)}))}(e)},className:i()("mailing-list--form")},r.a.createElement("input",{onChange:function(e){return p(e.target.value)},className:i()("input","input--"+m),name:"email",placeholder:"you@email.com",type:"email",style:{width:u}}),r.a.createElement("button",{className:i()("button","button--"+(o||"primary"),"button--"+m),type:"submit"},"Subscribe")),y&&r.a.createElement("span",{className:"badge badge--secondary"},k),r.a.createElement("div",{style:{textAlign:"center"}},s&&v&&r.a.createElement("span",{className:"badge badge--primary"},"Subscribed!")))}}}]); \ No newline at end of file +/*! For license information please see 672ba3d6.06e5ed37.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[130],{281:function(e,t,a){"use strict";a.r(t);var n=a(0),r=a.n(n),o=a(490),i=a(487),c=a(602),l=a(476),s=Object(o.a)("h2");t.default=function(){var e=Object(l.a)().siteConfig;return(void 0===e?{}:e).customFields.metadata.team,r.a.createElement(i.a,{title:"Community",description:"Join the Qovery community. Connect with the core Qovery team and other Qovery users."},r.a.createElement("header",{className:"hero"},r.a.createElement("div",{className:"container container--fluid"},r.a.createElement("h1",null,"Qovery Community"),r.a.createElement(c.a,{buttonClass:"highlight",center:!0,size:"lg"}))),r.a.createElement("main",null,r.a.createElement("section",null,r.a.createElement("div",{className:"container"},r.a.createElement(s,{id:"connect"},"Connect"),r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://community.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-globe"})),r.a.createElement("div",{className:"panel--title"},"Forum"),r.a.createElement("div",{className:"panel--description"},"Join our community on Discourse"))))),r.a.createElement("div",{className:"container"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://twitter.com/Qovery_",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-twitter",title:"Twitter"})),r.a.createElement("div",{className:"panel--title"},"@Qovery"),r.a.createElement("div",{className:"panel--description"},"Follow us in real-time"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-github"})),r.a.createElement("div",{className:"panel--title"},"Github qovery"),r.a.createElement("div",{className:"panel--description"},"Issues, code, and development"))))))))}},463:function(e,t,a){var n;!function(){"use strict";var a={}.hasOwnProperty;function r(){for(var e=[],t=0;t0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(u.a,{className:"navbar__logo",src:f,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),l.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(z,e))}))):null)}))),(m||i)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:M.a.footerLogoLink},r.a.createElement(Q,{alt:m.alt,url:d})):r.a.createElement(Q,{alt:m.alt,url:d})),r.a.createElement("small",null,i),r.a.createElement("br",null))))},F=a(502),Z=a(503),J=a(3);a(138);t.a=function(e){var t=Object(h.a)().siteConfig,a=void 0===t?{}:t,n=a.title,c=a.themeConfig.image,l=a.url,s=e.children,m=e.title,u=e.noFooter,d=e.description,f=e.image,p=e.keywords,g=e.version,v=m?m+" | "+n:n,b=f||c,E=l+Object(_.a)(b),y=Object(J.h)(),w=y?"https://docs.qovery.com"+(y.pathname.endsWith("/")?y.pathname:y.pathname+"/"):null;return r.a.createElement(Z.a,null,r.a.createElement(F.a,null,r.a.createElement(i.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),v&&r.a.createElement("title",null,v),v&&r.a.createElement("meta",{property:"og:title",content:v}),r.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),r.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),r.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),r.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),r.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),r.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),d&&r.a.createElement("meta",{name:"description",content:d}),d&&r.a.createElement("meta",{property:"og:description",content:d}),g&&r.a.createElement("meta",{name:"docsearch:version",content:g}),p&&p.length&&r.a.createElement("meta",{name:"keywords",content:p.join(",")}),b&&r.a.createElement("meta",{property:"og:image",content:E}),b&&r.a.createElement("meta",{property:"twitter:image",content:E}),b&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+v}),w&&r.a.createElement("meta",{property:"og:url",content:w}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),w&&r.a.createElement("link",{rel:"canonical",href:w})),r.a.createElement(o.a,null),r.a.createElement(L,null),r.a.createElement("div",{className:"main-wrapper"},s),!u&&r.a.createElement(q,null)))}},490:function(e,t,a){"use strict";var n=a(9),r=a(0),o=a.n(r),i=a(463),c=a.n(i),l=a(476),s=(a(139),a(140)),m=a.n(s);t.a=function(e){return function(t){var a,r=t.id,i=Object(n.a)(t,["id"]),s=Object(l.a)().siteConfig,u=(s=void 0===s?{}:s).themeConfig,d=(u=void 0===u?{}:u).navbar,f=(d=void 0===d?{}:d).hideOnScroll,h=void 0!==f&&f;return r?o.a.createElement(e,i,o.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:c()("anchor",(a={},a[m.a.enhancedAnchor]=!h,a)),id:r}),o.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),i.children):o.a.createElement(e,i)}}},494:function(e,t,a){"use strict";var n=a(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=r},519:function(e,t){var a,n,r=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function c(e){if(a===setTimeout)return setTimeout(e,0);if((a===o||!a)&&setTimeout)return a=setTimeout,setTimeout(e,0);try{return a(e,0)}catch(t){try{return a.call(null,e,0)}catch(t){return a.call(this,e,0)}}}!function(){try{a="function"==typeof setTimeout?setTimeout:o}catch(e){a=o}try{n="function"==typeof clearTimeout?clearTimeout:i}catch(e){n=i}}();var l,s=[],m=!1,u=-1;function d(){m&&l&&(m=!1,l.length?s=l.concat(s):u=-1,s.length&&f())}function f(){if(!m){var e=c(d);m=!0;for(var t=s.length;t;){for(l=s,s=[];++u1)for(var a=1;a=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(e){}}(),t.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],t.formatters.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},t.enable(r())}).call(this,a(519))},596:function(e,t,a){var n;function r(e){function a(){if(a.enabled){var e=a,r=+new Date,o=r-(n||r);e.diff=o,e.prev=n,e.curr=r,n=r;for(var i=new Array(arguments.length),c=0;c0)return function(e){if((e=String(e)).length>100)return;var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(!t)return;var i=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*i;case"days":case"day":case"d":return i*o;case"hours":case"hour":case"hrs":case"hr":case"h":return i*r;case"minutes":case"minute":case"mins":case"min":case"m":return i*n;case"seconds":case"second":case"secs":case"sec":case"s":return i*a;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return i;default:return}}(e);if("number"===l&&!1===isNaN(e))return t.long?i(c=e,o,"day")||i(c,r,"hour")||i(c,n,"minute")||i(c,a,"second")||c+" ms":function(e){if(e>=o)return Math.round(e/o)+"d";if(e>=r)return Math.round(e/r)+"h";if(e>=n)return Math.round(e/n)+"m";if(e>=a)return Math.round(e/a)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},598:function(e,t,a){"use strict";var n=/^[-!#$%&'*+\/0-9=?A-Z^_a-z{|}~](\.?[-!#$%&'*+\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\.?[a-zA-Z0-9])*\.[a-zA-Z](-?[a-zA-Z0-9])+$/;t.validate=function(e){if(!e)return!1;if(e.length>254)return!1;if(!n.test(e))return!1;var t=e.split("@");return!(t[0].length>64)&&!t[1].split(".").some((function(e){return e.length>63}))}},602:function(e,t,a){"use strict";a(488),a(489);var n=a(0),r=a.n(n),o=a(463),i=a.n(o),c=(a(58),a(21),a(594)),l=a.n(c),s=a(598),m=function(e){return new Promise((function(t,a){return l()(e,{param:"c",timeout:3500},(function(e,n){e&&a(e),n&&t(n)}))}))},u=function(e){var t="";for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var n="group["===a.substring(0,6)?a:a.toUpperCase();t=t.concat("&"+n+"="+e[a])}return t},d=function(e,t,a){var n=Object(s.validate)(e),r=encodeURIComponent(e);if(!n)return Promise.resolve({result:"error",msg:"The email you entered is not valid."});var o="https://qovery.us4.list-manage.com/subscribe/post-json?u=3c76e7a2087d5bc4020348c46&id=63bd993879";arguments.length<3&&"string"==typeof t?o=t:"string"==typeof a&&(o=a);var i="&EMAIL="+r+u(t),c=""+o+i;return m(c)};a(152),t.a=function(e){var t,a=e.block,o=e.buttonClass,c=e.center,l=e.description,s=e.subscriptionEnabled,m=e.size,u=e.width,f=Object(n.useState)(""),h=f[0],p=f[1],g=Object(n.useState)(!1),v=g[0],b=g[1],E=Object(n.useState)(!1),y=E[0],w=E[1],N=Object(n.useState)("Could not subscribe :("),k=N[0],_=N[1];return r.a.createElement("div",{className:i()("mailing-list",(t={"mailing-list--block":a,"mailing-list--center":c},t["mailing-list--"+m]=m,t))},!1!==l&&r.a.createElement("div",{className:"mailing-list--description"},l),s&&!v&&r.a.createElement("form",{onSubmit:function(e){return function(e){e.preventDefault(),d(h).then((function(e){"success"===e.result?(b(!0),y&&w(!1)):(w(!0),e.msg.includes(h+" is already subscribed")?_("This email is already subscribed to the newsletter"):_("Could not subscribe :("))})).catch((function(e){w(!0)}))}(e)},className:i()("mailing-list--form")},r.a.createElement("input",{onChange:function(e){return p(e.target.value)},className:i()("input","input--"+m),name:"email",placeholder:"you@email.com",type:"email",style:{width:u}}),r.a.createElement("button",{className:i()("button","button--"+(o||"primary"),"button--"+m),type:"submit"},"Subscribe")),y&&r.a.createElement("span",{className:"badge badge--secondary"},k),r.a.createElement("div",{style:{textAlign:"center"}},s&&v&&r.a.createElement("span",{className:"badge badge--primary"},"Subscribed!")))}}}]); \ No newline at end of file diff --git a/3ecdd190.64c8efaf.js.LICENSE.txt b/672ba3d6.06e5ed37.js.LICENSE.txt similarity index 100% rename from 3ecdd190.64c8efaf.js.LICENSE.txt rename to 672ba3d6.06e5ed37.js.LICENSE.txt diff --git a/6ce627d6.0cb473ff.js b/6ce627d6.e284d260.js similarity index 99% rename from 6ce627d6.0cb473ff.js rename to 6ce627d6.e284d260.js index ac0005d188..dcbb339171 100644 --- a/6ce627d6.0cb473ff.js +++ b/6ce627d6.e284d260.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[137],{288:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return s})),a.d(t,"metadata",(function(){return u})),a.d(t,"rightToc",(function(){return p})),a.d(t,"default",(function(){return m}));var o=a(1),n=a(9),r=(a(0),a(465)),l=a(464),i=a(479),c=a(477),b=a(469),s={last_modified_on:"2024-09-18",$schema:"/.meta/.schemas/guides.json",title:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","installation_guide: aws"],hide_pagination:!0},u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",permalink:"/guides/tutorial/migrate-your-application-from-heroku-to-aws",readingTime:"12 min read",source:"@site/guides/tutorial/migrate-your-application-from-heroku-to-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"installation_guide: aws",permalink:"/guides/tags/installation-guide-aws"}],title:"Migrate your application from Heroku to AWS",truncated:!1,prevItem:{title:"Microservices",permalink:"/guides/advanced/microservices"},nextItem:{title:"Migration",permalink:"/guides/advanced/migration"}},p=[{value:"Migration Steps",id:"migration-steps",children:[]},{value:"1. Create your Dockerfile",id:"1-create-your-dockerfile",children:[{value:"Test your Dockerfile",id:"test-your-dockerfile",children:[]},{value:"Environment variables at the build time",id:"environment-variables-at-the-build-time",children:[]},{value:"Add your Dockerfile to Git",id:"add-your-dockerfile-to-git",children:[]},{value:"Loop",id:"loop",children:[]}]},{value:"2. Create resources on Qovery",id:"2-create-resources-on-qovery",children:[{value:"Application",id:"application",children:[]},{value:"Database",id:"database",children:[]}]},{value:"3. Configure your Environment Variables and Secrets",id:"3-configure-your-environment-variables-and-secrets",children:[{value:"Connect your frontend app to your backend app",id:"connect-your-frontend-app-to-your-backend-app",children:[]},{value:"Connect your backend app to your database",id:"connect-your-backend-app-to-your-database",children:[]}]},{value:"4. Copy data from your Heroku databases to your AWS databases",id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases",children:[]},{value:"5. Deploy your apps!",id:"5-deploy-your-apps",children:[]},{value:"FAQ by Heroku users",id:"faq-by-heroku-users",children:[{value:"How to create a custom domain?",id:"how-to-create-a-custom-domain",children:[]},{value:"How to monitor my apps?",id:"how-to-monitor-my-apps",children:[]},{value:"Do you have Heroku "Review App" equivalent?",id:"do-you-have-heroku-review-app-equivalent",children:[]},{value:"How to rollback?",id:"how-to-rollback",children:[]},{value:"How auto-scaling works?",id:"how-auto-scaling-works",children:[]},{value:"How to manage database migration?",id:"how-to-manage-database-migration",children:[]},{value:"Is it possible to get a shell / connect to my app?",id:"is-it-possible-to-get-a-shell--connect-to-my-app",children:[]},{value:"Can I use Terraform and Infrastructure as Code?",id:"can-i-use-terraform-and-infrastructure-as-code",children:[]},{value:"How can I connect my app to MongoDB Atlas?",id:"how-can-i-connect-my-app-to-mongodb-atlas",children:[]},{value:"How can I connect my app to an AWS service not managed by Qovery?",id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],d={rightToc:p};function m(e){var t=e.components,a=Object(n.a)(e,["components"]);return Object(r.b)("wrapper",Object(o.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"This guide also work for migrating your application from Heroku to GCP, Azure, Scaleway and ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/"}),"all cloud provider")," supported by Qovery.")),Object(r.b)("p",null,"This guide describes how to migrate your application running on Heroku to AWS with Qovery. It covers all required steps you need to take to deploy your application on AWS and transfer your data from Heroku Postgres to the database managed by AWS via Qovery."),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"We have created a new AI agent capable of migrating from Heroku to AWS, GCP, Scaleway or Azure in a few clicks. Check our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://www.qovery.com/blog/open-source-devops-ai-agent--effortless-migration-from-heroku-to-aws/?utm_campaign=migration-ai-agent-email"}),"announcement here"),".")),Object(r.b)(b.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You are familiar with Heroku basics, have a Heroku account and access to Heroku CLI"),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/guides/installation-guide/guide-amazon-web-services/"}),"set up your AWS account")," with Qovery"))),Object(r.b)("h2",{id:"migration-steps"},"Migration Steps"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#1-create-your-dockerfile"}),"Create your Dockerfile")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#2-create-resources-on-qovery"}),"Create resources on Qovery")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#3-configure-your-environment-variables-and-secrets"}),"Configure Environment Variables and Secrets")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#4-copy-data-from-your-heroku-databases-to-your-aws-databases"}),"Copy data from your Heroku databases to your AWS databases")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#5-deploy-your-apps-"}),"Deploy your apps")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#faq-by-heroku-users"}),"FAQ by Heroku users"))),Object(r.b)("h2",{id:"1-create-your-dockerfile"},"1. Create your Dockerfile"),Object(r.b)("p",null,"Qovery supports two ways to build and run your application coming from Heroku:"),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Are you familiar with Dockerfile? If not, I do recommend reading ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),".")),Object(r.b)("p",null,"Here we will create our Dockerfiles to build and run our applications. Qovery will handle the build and the run of your applications, but need to have at least a Dockerfile to do it."),Object(r.b)("h4",{id:"find-dockerfile-template"},"Find Dockerfile template"),Object(r.b)("p",null,"Pick one Dockerfile template according to the programming language or framework you are using for your app:"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Your framework or language is missing? Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum"),", and we will provide you one.")),Object(r.b)(c.a,{centered:!1,className:"square",defaultValue:"rails",select:!1,size:null,values:[{group:"Files",label:"Rails",value:"rails"},{group:"Files",label:"NodeJS",value:"nodejs"},{group:"Files",label:"React",value:"react"},{group:"Files",label:"VueJS",value:"vuejs"},{group:"Files",label:"NextJS",value:"nextjs"},{group:"Files",label:"Golang",value:"golang"},{group:"Files",label:"Flask",value:"flask"},{group:"Files",label:"Django",value:"django"},{group:"Files",label:"Laravel",value:"laravel"},{group:"Files",label:"Symfony",value:"symfony"},{group:"Files",label:"Spring",value:"spring"},{group:"Files",label:"Rust",value:"rust"}],mdxType:"Tabs"},Object(r.b)(i.a,{value:"rails",mdxType:"TabItem"},Object(r.b)("p",null,"Here is the Dockerfile for your Rails application listening on the PORT 3000"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nEXPOSE 3000\n\n# Configure the main process to run when running the image\nCMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"]\n')),Object(r.b)("details",null,Object(r.b)("summary",null,"Dockerfile for Sidekiq"),Object(r.b)("p",null,"Here is the Dockerfile for your Rails app running as a worker mode with Sidekiq."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"There is no listening port since it is consuming resources from a queuing system (E.g. Redis)")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile for Sidekiq"',title:'"Dockerfile',for:!0,'Sidekiq"':!0}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client # add mysql client if you need to\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nCMD ["bundle", "exec", "sidekiq"]\n')))),Object(r.b)(i.a,{value:"nodejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"react",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"vuejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"nextjs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"golang",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"flask",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"django",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"laravel",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"symfony",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"spring",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"rust",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n")))),Object(r.b)("h4",{id:"copy-template"},"Copy template"),Object(r.b)("p",null,"Copy your Dockerfile at the root of your project. By convention, you can name your file ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile"),". If you already have a Dockerfile, feel free to name it ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery"),". If you are using multiple Dockerfile for Qovery, feel free to give a name like ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Read ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/904"}),"this forum post")," to know how to use the same Dockerfile with different CMD parameters.")),Object(r.b)("p",null,"For our example of migrating a Rails app and a Rails Sidekiq app, I will have at the root of my project a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery")," and a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)("h3",{id:"test-your-dockerfile"},"Test your Dockerfile"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("p",null,"You need to ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://docs.docker.com/get-docker/"}),"install Docker")," to test your Dockerfile")),Object(r.b)("p",null,"To test your Dockerfile we will locally our container. You just need to run the following commands:"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Don't forget the ",Object(r.b)("inlineCode",{parentName:"p"},".")," (dot) at the end of the ",Object(r.b)("inlineCode",{parentName:"p"},"docker build")," command.")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker build -f Dockerfile.qovery .\n")),Object(r.b)("p",null,"If everything goes well you should get the finale image ID at the end of the output."),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"[+] Building 19.0s (16/16) FINISHED\n => [internal] load build definition from Dockerfile 0.0s\n => => transferring dockerfile: 37B 0.0s\n => [internal] load .dockerignore 0.0s\n ...\n => [7/7] COPY . . 0.2s\n => exporting to image 0.0s\n => exporting layers 0.4s\n => writing image sha256:a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055 0.0s\n")),Object(r.b)("p",null,"To run your image you can run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker run a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055\n")),Object(r.b)("p",null,"If your app required a database to starts, then it can be normal that it fails to start. Otherwise, if your app is supposed to start and does not, then you will need to fix the issue and rebuild your app with ",Object(r.b)("inlineCode",{parentName:"p"},"docker build -f Dockerfile.qovery .")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"This step is one of the most complex, but once you successfully build your application with Docker, your app will run anywhere (not only on AWS with Qovery).")),Object(r.b)("p",null,"Any error while building your container image? 2 solutions:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Read the error message and try to understand from where the problem is coming from. You can "Google" the error if it is not related to your code.'),Object(r.b)("li",{parentName:"ol"},"Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://discuss.qovery.com/"}),"our forum")," if you don't find the answer there, we will be happy to assist you.")),Object(r.b)("h3",{id:"environment-variables-at-the-build-time"},"Environment variables at the build time"),Object(r.b)("p",null,"Does your app use some environment variables at the build time? Then you will need to modify your Dockerfile to includes the environment variables. Let's imagine your app uses the environment variable ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY"),", then you will need to add the following instructions in your Dockerfile:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile with environment variables"',title:'"Dockerfile',with:!0,environment:!0,'variables"':!0}),"...\nARG CONTENT_API_KEY\nENV CONTENT_API_KEY $CONTENT_API_KEY\n...\n")),Object(r.b)("p",null,"The value of the ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY")," environment variable will be taken from the specified environment variables in Qovery."),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery injects Environment Variables and Secrets at the build and run time of your app.")),Object(r.b)("h3",{id:"add-your-dockerfile-to-git"},"Add your Dockerfile to Git"),Object(r.b)("p",null,"Now, add your new Dockerfile to git with the following commands:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),'git add Dockerfile.qovery\ngit commit -m "Add Qovery Dockerfile"\ngit push origin\n')),Object(r.b)("h3",{id:"loop"},"Loop"),Object(r.b)("p",null,"If you have multiple applications to deploy, create a Dockerfile for each of them."),Object(r.b)("h2",{id:"2-create-resources-on-qovery"},"2. Create resources on Qovery"),Object(r.b)("h3",{id:"application"},"Application"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/deploy-your-first-application/"}),"this tutorial")," to learn how to deploy your first app.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/9246ae68c68f42debc3d5183d2b4f7f8",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to the ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"Qovery console"),"."),Object(r.b)("li",{parentName:"ol"},"Create your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/organization/"}),"Organization")," and your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/project/"}),"Project"),"."),Object(r.b)("li",{parentName:"ol"},"Create an environment with the name ",Object(r.b)("inlineCode",{parentName:"li"},"production")," (it can be changed after)."),Object(r.b)("li",{parentName:"ol"},"Create an application and give it a name (you can give the name of your repo if you have no idea)"),Object(r.b)("li",{parentName:"ol"},"Select your app repository from your GitHub, GitLab or Bitbucket."),Object(r.b)("li",{parentName:"ol"},"Select the branch you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Specify the local listening port of your application."),Object(r.b)("li",{parentName:"ol"},'Click on "create"')),Object(r.b)("p",null,"Congrats! Your application is created \ud83c\udf89"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,'Your application is created but not deployed yet! You can configure the vCPU, Memory, Environment Variables... before deploying it. If you want to deploy it before finishing the configuration you can click on "Actions" > "Deploy".')),Object(r.b)("p",null,"If you deploy an app from a mono-repository, we have a must-read guide for you ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/advanced/monorepository/"}),"here"),"."),Object(r.b)("h3",{id:"database"},"Database"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"this tutorial")," to learn how to deploy your database.")),Object(r.b)("p",null,"Here are the steps to deploy your database:"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have created an application before"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/d7e10be0e5964f6799b158dc631bbbd1",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your ",Object(r.b)("inlineCode",{parentName:"li"},"production")," environment."),Object(r.b)("li",{parentName:"ol"},'Add your database by clicking on "Add" > "Database".'),Object(r.b)("li",{parentName:"ol"},"Select the database (PostgreSQL, MySQL, MongoDB, Redis..) and the version you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/database/#general"}),"Managed or Container mode")," for your database."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("inlineCode",{parentName:"li"},"Public")," accessibility (set ",Object(r.b)("inlineCode",{parentName:"li"},"Private")," if you don't want to restore your data from an existing Heroku database).")),Object(r.b)("p",null,"Congrats! Your database is created as well \ud83c\udf89"),Object(r.b)("p",null,"If you use MongoDB Atlas, or an existing database on AWS that you want to connect to your application deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing database."),Object(r.b)("h2",{id:"3-configure-your-environment-variables-and-secrets"},"3. Configure your Environment Variables and Secrets"),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery supports Doppler integration - it's the easiest way to migrate your Environment Variables and Secrets from Heroku to Qovery. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/secret-manager/doppler/"}),"More info here"),".")),Object(r.b)("p",null,"Qovery makes the difference between an environment variable and a secret. Basically, a Secret is similar to an Environment Variable but the value is encrypted and can't be revealed. Both are injected as environment variables during the build and the run of your applications. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"More info here")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"I recommend reading our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"Getting Started with Environment Variables")," guide.")),Object(r.b)("p",null,"To extract your environment variables from Heroku, we recommend using the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/heroku-cli"}),"Heroku CLI")," and exporting all the environment variables and secrets in an .env (dot env) file. Qovery supports the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/"}),"import of a dot env file")," via the Qovery web interface and the Qovery CLI."),Object(r.b)("p",null,Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/config-vars#view-current-config-var-values"}),"Export your environment variable via the Heroku CLI")," with the command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"# To install Heroku CLI: https://devcenter.heroku.com/articles/heroku-cli\nheroku config\n\nGREETINGS: hello world\nSTRIPE_API_KEY: xxx-yyy-zzz\nIS_PRODUCTION: true\n")),Object(r.b)("p",null,"Then you can create your environment variables via the web interface (watch the video below)"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/50899d7fa3d84a418f0db69f54f970d3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Or via the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Import Heroku environment variables with the Qovery CLI"',title:'"Import',Heroku:!0,environment:!0,variables:!0,with:!0,the:!0,Qovery:!0,'CLI"':!0}),"# auth yourself\nqovery auth\n\n# selection the app where you want to import your environment variables\nqovery context set\n\n# import your Heroku environment variables\nheroku config --app --json | \\\n qovery env parse --heroku-json > heroku.env && \\\n qovery env import heroku.env && \\\n rm heroku.env\n\nQovery: dot env file to import: 'heroku.env'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] GREETINGS=hello world\n [ ] STRIPE_API_KEY=xxx-yyy-zzz\n> [x] IS_PRODUCTION=true\n\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Import sensitive data (E.g. API keys, credentials...) as ",Object(r.b)("inlineCode",{parentName:"p"},"Secret")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"Environment Variable"),".")),Object(r.b)("h3",{id:"connect-your-frontend-app-to-your-backend-app"},"Connect your frontend app to your backend app"),Object(r.b)("p",null,"To connect your frontend app your backend app we will create an ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#alias-environment-variable"}),"environment variable alias"),"."),Object(r.b)("p",null,"Here is how to create a frontend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/bafbbda93bd64d04afb3189bf4a1a201",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"And now how to connect your frontend app with your backend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/f820925f2175465f9271b97ef414bb42",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"You can also take a look at ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/918"}),"this forum reply")," to learn how to do it."),Object(r.b)("h3",{id:"connect-your-backend-app-to-your-database"},"Connect your backend app to your database"),Object(r.b)("p",null,"Same as connecting your frontend app to your backend app, you can create an environment variable alias ",Object(r.b)("inlineCode",{parentName:"p"},"DATABASE_URL")," for the ",Object(r.b)("em",{parentName:"p"},"built-in")," secret finishing with ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL"),"."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Create an alias on ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/59f8368eb3c14796a807c7e39e9c0ab0",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases"},"4. Copy data from your Heroku databases to your AWS databases"),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"Coming soon with ",Object(r.b)("a",Object(o.a)({parentName:"em"},{href:"https://www.replibyte.com"}),"Replibyte"))),Object(r.b)("h2",{id:"5-deploy-your-apps"},"5. Deploy your apps!"),Object(r.b)("p",null,"We are finally ready to deploy my applications on AWS!"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/0589d2f2aa4149edb605dc23f4efd23d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Watch the final result \ud83d\ude0e"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/da31c21f9c104eae9270e4c4db59055e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"faq-by-heroku-users"},"FAQ by Heroku users"),Object(r.b)("h3",{id:"how-to-create-a-custom-domain"},"How to create a custom domain?"),Object(r.b)("p",null,"Check out the documentation on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"how to configure your custom domain"),"."),Object(r.b)("h3",{id:"how-to-monitor-my-apps"},"How to monitor my apps?"),Object(r.b)("p",null,"We do recommend using ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://www.datadoghq.com"}),"Datadog")," or any other monitoring products for monitoring your apps deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/"}),"our tutorial on how to install Datadog"),"."),Object(r.b)("h3",{id:"do-you-have-heroku-review-app-equivalent"},'Do you have Heroku "Review App" equivalent?'),Object(r.b)("p",null,"Yes, it's what we call ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#preview-environment"}),"Preview Environment")),Object(r.b)("h3",{id:"how-to-rollback"},"How to rollback?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/deployment-actions/#deploy-other-version"}),"app rollback documentation")),Object(r.b)("h3",{id:"how-auto-scaling-works"},"How auto-scaling works?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application/#auto-scaling"}),"app auto-scaling documentation")),Object(r.b)("h3",{id:"how-to-manage-database-migration"},"How to manage database migration?"),Object(r.b)("p",null,"Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/951"}),"our forum reply")),Object(r.b)("h3",{id:"is-it-possible-to-get-a-shell--connect-to-my-app"},"Is it possible to get a shell / connect to my app?"),Object(r.b)("p",null,"Absolutely, you can connect directly to your application with a shell by clicking on the Qovery cloud shell button (1):"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/qovery_cloud_shell.png",alt:"Qovery Cloud Shell"})),Object(r.b)("p",null,"Then you just have to select the pod (2) and the container (3)."),Object(r.b)("p",null,"You can also check out our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/#shell"}),"CLI")," and the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery shell")," command."),Object(r.b)("h3",{id:"can-i-use-terraform-and-infrastructure-as-code"},"Can I use Terraform and Infrastructure as Code?"),Object(r.b)("p",null,"Absolutely, we have a ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/terraform-provider/"}),"Qovery Terraform provider")," available."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-mongodb-atlas"},"How can I connect my app to MongoDB Atlas?"),Object(r.b)("p",null,"If you use MongoDB Atlas check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing MongoDB Atlas database."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery"},"How can I connect my app to an AWS service not managed by Qovery?"),Object(r.b)("p",null,"If you want to connect your app to an AWS service not managed by Qovery, check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to this AWS service."),Object(r.b)("hr",null),Object(r.b)("p",null,"If you have a common question about Qovery, we have a more general ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/useful-resources/faq/"}),"FAQ section")," available."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congrats! You have migrated from Heroku to AWS. Feel free to check out our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question."))}m.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var o=a(0),n=a.n(o),r=a(463),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,o=e.fill,r=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return n.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":o,"alert--icon":!1!==r}),role:"alert"},!1!==r&&n.a.createElement("i",{className:l()("feather","icon-"+(r||c))}),t)}},468:function(e,t,a){var o=a(28).f,n=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in n||a(10)&&o(n,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var o=a(0),n=a.n(o),r=a(464);t.a=function(e){var t=e.children,a=e.name;return n.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},n.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},477:function(e,t,a){"use strict";var o=a(1),n=(a(481),a(478),a(52),a(29),a(22),a(21),a(0)),r=a.n(n),l=a(483),i=a(463),c=a.n(i),b=a(471),s=a.n(b),u=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,o=e.changeSelectedValue,n=e.className,l=e.handleKeydown,i=e.style,b=e.values,s=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",n,{"tabs--block":t}),style:i},b.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return l(u,e.target,e)},onFocus:function(){return o(t)},onClick:function(){return o(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,o=e.changeSelectedValue,n=e.size,i=e.values,c=i;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+n,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return o(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,b=e.select,y=e.size,f=(e.style,e.values),O=e.urlKey,j=Object(u.a)(),g=j.tabGroupChoices,v=j.setTabGroupChoices,w=Object(n.useState)(a),k=w[0],N=w[1];if(null!=l){var C=g[l];null!=C&&C!==k&&N(C)}var T=function(e){N(e),null!=l&&v(l,e)},A=[],D=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(n.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=s.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&r.a.createElement("div",{className:"margin-vert--sm"},i),f.length>1&&(b?r.a.createElement(h,Object(o.a)({changeSelectedValue:T,handleKeydown:D,placeholder:c,selectedValue:k,size:y,tabRefs:A},e)):r.a.createElement(m,Object(o.a)({changeSelectedValue:T,handleKeydown:D,selectedValue:k,tabRefs:A},e)))),n.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},479:function(e,t,a){"use strict";var o=a(0),n=a.n(o);t.a=function(e){return n.a.createElement(n.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[137],{288:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return s})),a.d(t,"metadata",(function(){return u})),a.d(t,"rightToc",(function(){return p})),a.d(t,"default",(function(){return m}));var o=a(1),n=a(9),r=(a(0),a(465)),l=a(464),i=a(478),c=a(477),b=a(469),s={last_modified_on:"2024-09-18",$schema:"/.meta/.schemas/guides.json",title:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","installation_guide: aws"],hide_pagination:!0},u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",permalink:"/guides/tutorial/migrate-your-application-from-heroku-to-aws",readingTime:"12 min read",source:"@site/guides/tutorial/migrate-your-application-from-heroku-to-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"installation_guide: aws",permalink:"/guides/tags/installation-guide-aws"}],title:"Migrate your application from Heroku to AWS",truncated:!1,prevItem:{title:"Microservices",permalink:"/guides/advanced/microservices"},nextItem:{title:"Migration",permalink:"/guides/advanced/migration"}},p=[{value:"Migration Steps",id:"migration-steps",children:[]},{value:"1. Create your Dockerfile",id:"1-create-your-dockerfile",children:[{value:"Test your Dockerfile",id:"test-your-dockerfile",children:[]},{value:"Environment variables at the build time",id:"environment-variables-at-the-build-time",children:[]},{value:"Add your Dockerfile to Git",id:"add-your-dockerfile-to-git",children:[]},{value:"Loop",id:"loop",children:[]}]},{value:"2. Create resources on Qovery",id:"2-create-resources-on-qovery",children:[{value:"Application",id:"application",children:[]},{value:"Database",id:"database",children:[]}]},{value:"3. Configure your Environment Variables and Secrets",id:"3-configure-your-environment-variables-and-secrets",children:[{value:"Connect your frontend app to your backend app",id:"connect-your-frontend-app-to-your-backend-app",children:[]},{value:"Connect your backend app to your database",id:"connect-your-backend-app-to-your-database",children:[]}]},{value:"4. Copy data from your Heroku databases to your AWS databases",id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases",children:[]},{value:"5. Deploy your apps!",id:"5-deploy-your-apps",children:[]},{value:"FAQ by Heroku users",id:"faq-by-heroku-users",children:[{value:"How to create a custom domain?",id:"how-to-create-a-custom-domain",children:[]},{value:"How to monitor my apps?",id:"how-to-monitor-my-apps",children:[]},{value:"Do you have Heroku "Review App" equivalent?",id:"do-you-have-heroku-review-app-equivalent",children:[]},{value:"How to rollback?",id:"how-to-rollback",children:[]},{value:"How auto-scaling works?",id:"how-auto-scaling-works",children:[]},{value:"How to manage database migration?",id:"how-to-manage-database-migration",children:[]},{value:"Is it possible to get a shell / connect to my app?",id:"is-it-possible-to-get-a-shell--connect-to-my-app",children:[]},{value:"Can I use Terraform and Infrastructure as Code?",id:"can-i-use-terraform-and-infrastructure-as-code",children:[]},{value:"How can I connect my app to MongoDB Atlas?",id:"how-can-i-connect-my-app-to-mongodb-atlas",children:[]},{value:"How can I connect my app to an AWS service not managed by Qovery?",id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],d={rightToc:p};function m(e){var t=e.components,a=Object(n.a)(e,["components"]);return Object(r.b)("wrapper",Object(o.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"This guide also work for migrating your application from Heroku to GCP, Azure, Scaleway and ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/"}),"all cloud provider")," supported by Qovery.")),Object(r.b)("p",null,"This guide describes how to migrate your application running on Heroku to AWS with Qovery. It covers all required steps you need to take to deploy your application on AWS and transfer your data from Heroku Postgres to the database managed by AWS via Qovery."),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"We have created a new AI agent capable of migrating from Heroku to AWS, GCP, Scaleway or Azure in a few clicks. Check our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://www.qovery.com/blog/open-source-devops-ai-agent--effortless-migration-from-heroku-to-aws/?utm_campaign=migration-ai-agent-email"}),"announcement here"),".")),Object(r.b)(b.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You are familiar with Heroku basics, have a Heroku account and access to Heroku CLI"),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/guides/installation-guide/guide-amazon-web-services/"}),"set up your AWS account")," with Qovery"))),Object(r.b)("h2",{id:"migration-steps"},"Migration Steps"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#1-create-your-dockerfile"}),"Create your Dockerfile")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#2-create-resources-on-qovery"}),"Create resources on Qovery")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#3-configure-your-environment-variables-and-secrets"}),"Configure Environment Variables and Secrets")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#4-copy-data-from-your-heroku-databases-to-your-aws-databases"}),"Copy data from your Heroku databases to your AWS databases")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#5-deploy-your-apps-"}),"Deploy your apps")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#faq-by-heroku-users"}),"FAQ by Heroku users"))),Object(r.b)("h2",{id:"1-create-your-dockerfile"},"1. Create your Dockerfile"),Object(r.b)("p",null,"Qovery supports two ways to build and run your application coming from Heroku:"),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Are you familiar with Dockerfile? If not, I do recommend reading ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),".")),Object(r.b)("p",null,"Here we will create our Dockerfiles to build and run our applications. Qovery will handle the build and the run of your applications, but need to have at least a Dockerfile to do it."),Object(r.b)("h4",{id:"find-dockerfile-template"},"Find Dockerfile template"),Object(r.b)("p",null,"Pick one Dockerfile template according to the programming language or framework you are using for your app:"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Your framework or language is missing? Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum"),", and we will provide you one.")),Object(r.b)(c.a,{centered:!1,className:"square",defaultValue:"rails",select:!1,size:null,values:[{group:"Files",label:"Rails",value:"rails"},{group:"Files",label:"NodeJS",value:"nodejs"},{group:"Files",label:"React",value:"react"},{group:"Files",label:"VueJS",value:"vuejs"},{group:"Files",label:"NextJS",value:"nextjs"},{group:"Files",label:"Golang",value:"golang"},{group:"Files",label:"Flask",value:"flask"},{group:"Files",label:"Django",value:"django"},{group:"Files",label:"Laravel",value:"laravel"},{group:"Files",label:"Symfony",value:"symfony"},{group:"Files",label:"Spring",value:"spring"},{group:"Files",label:"Rust",value:"rust"}],mdxType:"Tabs"},Object(r.b)(i.a,{value:"rails",mdxType:"TabItem"},Object(r.b)("p",null,"Here is the Dockerfile for your Rails application listening on the PORT 3000"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nEXPOSE 3000\n\n# Configure the main process to run when running the image\nCMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"]\n')),Object(r.b)("details",null,Object(r.b)("summary",null,"Dockerfile for Sidekiq"),Object(r.b)("p",null,"Here is the Dockerfile for your Rails app running as a worker mode with Sidekiq."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"There is no listening port since it is consuming resources from a queuing system (E.g. Redis)")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile for Sidekiq"',title:'"Dockerfile',for:!0,'Sidekiq"':!0}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client # add mysql client if you need to\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nCMD ["bundle", "exec", "sidekiq"]\n')))),Object(r.b)(i.a,{value:"nodejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"react",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"vuejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"nextjs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"golang",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"flask",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"django",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"laravel",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"symfony",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"spring",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"rust",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n")))),Object(r.b)("h4",{id:"copy-template"},"Copy template"),Object(r.b)("p",null,"Copy your Dockerfile at the root of your project. By convention, you can name your file ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile"),". If you already have a Dockerfile, feel free to name it ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery"),". If you are using multiple Dockerfile for Qovery, feel free to give a name like ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Read ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/904"}),"this forum post")," to know how to use the same Dockerfile with different CMD parameters.")),Object(r.b)("p",null,"For our example of migrating a Rails app and a Rails Sidekiq app, I will have at the root of my project a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery")," and a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)("h3",{id:"test-your-dockerfile"},"Test your Dockerfile"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("p",null,"You need to ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://docs.docker.com/get-docker/"}),"install Docker")," to test your Dockerfile")),Object(r.b)("p",null,"To test your Dockerfile we will locally our container. You just need to run the following commands:"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Don't forget the ",Object(r.b)("inlineCode",{parentName:"p"},".")," (dot) at the end of the ",Object(r.b)("inlineCode",{parentName:"p"},"docker build")," command.")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker build -f Dockerfile.qovery .\n")),Object(r.b)("p",null,"If everything goes well you should get the finale image ID at the end of the output."),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"[+] Building 19.0s (16/16) FINISHED\n => [internal] load build definition from Dockerfile 0.0s\n => => transferring dockerfile: 37B 0.0s\n => [internal] load .dockerignore 0.0s\n ...\n => [7/7] COPY . . 0.2s\n => exporting to image 0.0s\n => exporting layers 0.4s\n => writing image sha256:a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055 0.0s\n")),Object(r.b)("p",null,"To run your image you can run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker run a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055\n")),Object(r.b)("p",null,"If your app required a database to starts, then it can be normal that it fails to start. Otherwise, if your app is supposed to start and does not, then you will need to fix the issue and rebuild your app with ",Object(r.b)("inlineCode",{parentName:"p"},"docker build -f Dockerfile.qovery .")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"This step is one of the most complex, but once you successfully build your application with Docker, your app will run anywhere (not only on AWS with Qovery).")),Object(r.b)("p",null,"Any error while building your container image? 2 solutions:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Read the error message and try to understand from where the problem is coming from. You can "Google" the error if it is not related to your code.'),Object(r.b)("li",{parentName:"ol"},"Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://discuss.qovery.com/"}),"our forum")," if you don't find the answer there, we will be happy to assist you.")),Object(r.b)("h3",{id:"environment-variables-at-the-build-time"},"Environment variables at the build time"),Object(r.b)("p",null,"Does your app use some environment variables at the build time? Then you will need to modify your Dockerfile to includes the environment variables. Let's imagine your app uses the environment variable ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY"),", then you will need to add the following instructions in your Dockerfile:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile with environment variables"',title:'"Dockerfile',with:!0,environment:!0,'variables"':!0}),"...\nARG CONTENT_API_KEY\nENV CONTENT_API_KEY $CONTENT_API_KEY\n...\n")),Object(r.b)("p",null,"The value of the ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY")," environment variable will be taken from the specified environment variables in Qovery."),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery injects Environment Variables and Secrets at the build and run time of your app.")),Object(r.b)("h3",{id:"add-your-dockerfile-to-git"},"Add your Dockerfile to Git"),Object(r.b)("p",null,"Now, add your new Dockerfile to git with the following commands:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),'git add Dockerfile.qovery\ngit commit -m "Add Qovery Dockerfile"\ngit push origin\n')),Object(r.b)("h3",{id:"loop"},"Loop"),Object(r.b)("p",null,"If you have multiple applications to deploy, create a Dockerfile for each of them."),Object(r.b)("h2",{id:"2-create-resources-on-qovery"},"2. Create resources on Qovery"),Object(r.b)("h3",{id:"application"},"Application"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/deploy-your-first-application/"}),"this tutorial")," to learn how to deploy your first app.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/9246ae68c68f42debc3d5183d2b4f7f8",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to the ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"Qovery console"),"."),Object(r.b)("li",{parentName:"ol"},"Create your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/organization/"}),"Organization")," and your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/project/"}),"Project"),"."),Object(r.b)("li",{parentName:"ol"},"Create an environment with the name ",Object(r.b)("inlineCode",{parentName:"li"},"production")," (it can be changed after)."),Object(r.b)("li",{parentName:"ol"},"Create an application and give it a name (you can give the name of your repo if you have no idea)"),Object(r.b)("li",{parentName:"ol"},"Select your app repository from your GitHub, GitLab or Bitbucket."),Object(r.b)("li",{parentName:"ol"},"Select the branch you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Specify the local listening port of your application."),Object(r.b)("li",{parentName:"ol"},'Click on "create"')),Object(r.b)("p",null,"Congrats! Your application is created \ud83c\udf89"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,'Your application is created but not deployed yet! You can configure the vCPU, Memory, Environment Variables... before deploying it. If you want to deploy it before finishing the configuration you can click on "Actions" > "Deploy".')),Object(r.b)("p",null,"If you deploy an app from a mono-repository, we have a must-read guide for you ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/advanced/monorepository/"}),"here"),"."),Object(r.b)("h3",{id:"database"},"Database"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"this tutorial")," to learn how to deploy your database.")),Object(r.b)("p",null,"Here are the steps to deploy your database:"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have created an application before"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/d7e10be0e5964f6799b158dc631bbbd1",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your ",Object(r.b)("inlineCode",{parentName:"li"},"production")," environment."),Object(r.b)("li",{parentName:"ol"},'Add your database by clicking on "Add" > "Database".'),Object(r.b)("li",{parentName:"ol"},"Select the database (PostgreSQL, MySQL, MongoDB, Redis..) and the version you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/database/#general"}),"Managed or Container mode")," for your database."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("inlineCode",{parentName:"li"},"Public")," accessibility (set ",Object(r.b)("inlineCode",{parentName:"li"},"Private")," if you don't want to restore your data from an existing Heroku database).")),Object(r.b)("p",null,"Congrats! Your database is created as well \ud83c\udf89"),Object(r.b)("p",null,"If you use MongoDB Atlas, or an existing database on AWS that you want to connect to your application deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing database."),Object(r.b)("h2",{id:"3-configure-your-environment-variables-and-secrets"},"3. Configure your Environment Variables and Secrets"),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery supports Doppler integration - it's the easiest way to migrate your Environment Variables and Secrets from Heroku to Qovery. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/secret-manager/doppler/"}),"More info here"),".")),Object(r.b)("p",null,"Qovery makes the difference between an environment variable and a secret. Basically, a Secret is similar to an Environment Variable but the value is encrypted and can't be revealed. Both are injected as environment variables during the build and the run of your applications. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"More info here")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"I recommend reading our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"Getting Started with Environment Variables")," guide.")),Object(r.b)("p",null,"To extract your environment variables from Heroku, we recommend using the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/heroku-cli"}),"Heroku CLI")," and exporting all the environment variables and secrets in an .env (dot env) file. Qovery supports the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/"}),"import of a dot env file")," via the Qovery web interface and the Qovery CLI."),Object(r.b)("p",null,Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/config-vars#view-current-config-var-values"}),"Export your environment variable via the Heroku CLI")," with the command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"# To install Heroku CLI: https://devcenter.heroku.com/articles/heroku-cli\nheroku config\n\nGREETINGS: hello world\nSTRIPE_API_KEY: xxx-yyy-zzz\nIS_PRODUCTION: true\n")),Object(r.b)("p",null,"Then you can create your environment variables via the web interface (watch the video below)"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/50899d7fa3d84a418f0db69f54f970d3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Or via the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Import Heroku environment variables with the Qovery CLI"',title:'"Import',Heroku:!0,environment:!0,variables:!0,with:!0,the:!0,Qovery:!0,'CLI"':!0}),"# auth yourself\nqovery auth\n\n# selection the app where you want to import your environment variables\nqovery context set\n\n# import your Heroku environment variables\nheroku config --app --json | \\\n qovery env parse --heroku-json > heroku.env && \\\n qovery env import heroku.env && \\\n rm heroku.env\n\nQovery: dot env file to import: 'heroku.env'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] GREETINGS=hello world\n [ ] STRIPE_API_KEY=xxx-yyy-zzz\n> [x] IS_PRODUCTION=true\n\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Import sensitive data (E.g. API keys, credentials...) as ",Object(r.b)("inlineCode",{parentName:"p"},"Secret")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"Environment Variable"),".")),Object(r.b)("h3",{id:"connect-your-frontend-app-to-your-backend-app"},"Connect your frontend app to your backend app"),Object(r.b)("p",null,"To connect your frontend app your backend app we will create an ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#alias-environment-variable"}),"environment variable alias"),"."),Object(r.b)("p",null,"Here is how to create a frontend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/bafbbda93bd64d04afb3189bf4a1a201",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"And now how to connect your frontend app with your backend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/f820925f2175465f9271b97ef414bb42",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"You can also take a look at ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/918"}),"this forum reply")," to learn how to do it."),Object(r.b)("h3",{id:"connect-your-backend-app-to-your-database"},"Connect your backend app to your database"),Object(r.b)("p",null,"Same as connecting your frontend app to your backend app, you can create an environment variable alias ",Object(r.b)("inlineCode",{parentName:"p"},"DATABASE_URL")," for the ",Object(r.b)("em",{parentName:"p"},"built-in")," secret finishing with ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL"),"."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Create an alias on ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/59f8368eb3c14796a807c7e39e9c0ab0",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases"},"4. Copy data from your Heroku databases to your AWS databases"),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"Coming soon with ",Object(r.b)("a",Object(o.a)({parentName:"em"},{href:"https://www.replibyte.com"}),"Replibyte"))),Object(r.b)("h2",{id:"5-deploy-your-apps"},"5. Deploy your apps!"),Object(r.b)("p",null,"We are finally ready to deploy my applications on AWS!"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/0589d2f2aa4149edb605dc23f4efd23d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Watch the final result \ud83d\ude0e"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/da31c21f9c104eae9270e4c4db59055e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"faq-by-heroku-users"},"FAQ by Heroku users"),Object(r.b)("h3",{id:"how-to-create-a-custom-domain"},"How to create a custom domain?"),Object(r.b)("p",null,"Check out the documentation on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"how to configure your custom domain"),"."),Object(r.b)("h3",{id:"how-to-monitor-my-apps"},"How to monitor my apps?"),Object(r.b)("p",null,"We do recommend using ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://www.datadoghq.com"}),"Datadog")," or any other monitoring products for monitoring your apps deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/"}),"our tutorial on how to install Datadog"),"."),Object(r.b)("h3",{id:"do-you-have-heroku-review-app-equivalent"},'Do you have Heroku "Review App" equivalent?'),Object(r.b)("p",null,"Yes, it's what we call ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#preview-environment"}),"Preview Environment")),Object(r.b)("h3",{id:"how-to-rollback"},"How to rollback?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/deployment-actions/#deploy-other-version"}),"app rollback documentation")),Object(r.b)("h3",{id:"how-auto-scaling-works"},"How auto-scaling works?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application/#auto-scaling"}),"app auto-scaling documentation")),Object(r.b)("h3",{id:"how-to-manage-database-migration"},"How to manage database migration?"),Object(r.b)("p",null,"Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/951"}),"our forum reply")),Object(r.b)("h3",{id:"is-it-possible-to-get-a-shell--connect-to-my-app"},"Is it possible to get a shell / connect to my app?"),Object(r.b)("p",null,"Absolutely, you can connect directly to your application with a shell by clicking on the Qovery cloud shell button (1):"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/qovery_cloud_shell.png",alt:"Qovery Cloud Shell"})),Object(r.b)("p",null,"Then you just have to select the pod (2) and the container (3)."),Object(r.b)("p",null,"You can also check out our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/#shell"}),"CLI")," and the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery shell")," command."),Object(r.b)("h3",{id:"can-i-use-terraform-and-infrastructure-as-code"},"Can I use Terraform and Infrastructure as Code?"),Object(r.b)("p",null,"Absolutely, we have a ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/terraform-provider/"}),"Qovery Terraform provider")," available."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-mongodb-atlas"},"How can I connect my app to MongoDB Atlas?"),Object(r.b)("p",null,"If you use MongoDB Atlas check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing MongoDB Atlas database."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery"},"How can I connect my app to an AWS service not managed by Qovery?"),Object(r.b)("p",null,"If you want to connect your app to an AWS service not managed by Qovery, check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to this AWS service."),Object(r.b)("hr",null),Object(r.b)("p",null,"If you have a common question about Qovery, we have a more general ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/useful-resources/faq/"}),"FAQ section")," available."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congrats! You have migrated from Heroku to AWS. Feel free to check out our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question."))}m.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var o=a(0),n=a.n(o),r=a(463),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,o=e.fill,r=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return n.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":o,"alert--icon":!1!==r}),role:"alert"},!1!==r&&n.a.createElement("i",{className:l()("feather","icon-"+(r||c))}),t)}},468:function(e,t,a){var o=a(28).f,n=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in n||a(10)&&o(n,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var o=a(0),n=a.n(o),r=a(464);t.a=function(e){var t=e.children,a=e.name;return n.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},n.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},477:function(e,t,a){"use strict";var o=a(1),n=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),r=a.n(n),l=a(483),i=a(463),c=a.n(i),b=a(471),s=a.n(b),u=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,o=e.changeSelectedValue,n=e.className,l=e.handleKeydown,i=e.style,b=e.values,s=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",n,{"tabs--block":t}),style:i},b.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return l(u,e.target,e)},onFocus:function(){return o(t)},onClick:function(){return o(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,o=e.changeSelectedValue,n=e.size,i=e.values,c=i;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+n,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return o(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,b=e.select,y=e.size,f=(e.style,e.values),O=e.urlKey,j=Object(u.a)(),g=j.tabGroupChoices,v=j.setTabGroupChoices,w=Object(n.useState)(a),k=w[0],N=w[1];if(null!=l){var C=g[l];null!=C&&C!==k&&N(C)}var T=function(e){N(e),null!=l&&v(l,e)},A=[],D=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(n.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=s.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&r.a.createElement("div",{className:"margin-vert--sm"},i),f.length>1&&(b?r.a.createElement(h,Object(o.a)({changeSelectedValue:T,handleKeydown:D,placeholder:c,selectedValue:k,size:y,tabRefs:A},e)):r.a.createElement(m,Object(o.a)({changeSelectedValue:T,handleKeydown:D,selectedValue:k,tabRefs:A},e)))),n.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},478:function(e,t,a){"use strict";var o=a(0),n=a.n(o);t.a=function(e){return n.a.createElement(n.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/83e9e333.3e8358e1.js b/83e9e333.aa90c231.js similarity index 98% rename from 83e9e333.3e8358e1.js rename to 83e9e333.aa90c231.js index 9419e328d0..d5fdfd9cd5 100644 --- a/83e9e333.3e8358e1.js +++ b/83e9e333.aa90c231.js @@ -1,2 +1,2 @@ -/*! For license information please see 83e9e333.3e8358e1.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[152],{303:function(e,a,t){"use strict";t.r(a);var n=t(0),r=t.n(n),l=t(487),c=(t(304),t(476));a.default=function(){var e=Object(c.a)().siteConfig;return(void 0===e?{}:e).customFields.metadata.team,r.a.createElement(l.a,{title:"Contact",description:"Contact the Qovery and Timber.io team"},r.a.createElement("header",{className:"hero"},r.a.createElement("div",{className:"container container--fluid"},r.a.createElement("h1",null,"Contact"),r.a.createElement("div",{className:"hero--subtitle"},"Qovery is a ",r.a.createElement("a",{href:"https://timber.io"},"Timber.io")," open-source product. You can contact the Qovery & Timber team using any of the options below."))),r.a.createElement("main",null,r.a.createElement("section",null,r.a.createElement("div",{className:"container"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"mailto:hi@timber.io",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-mail"})),r.a.createElement("div",{className:"panel--title"},"hi@timber.io"),r.a.createElement("div",{className:"panel--description"},"Shoot us an email"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://twitter.com/qoverydotdev",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-twitter"})),r.a.createElement("div",{className:"panel--title"},"@qoverydotdev"),r.a.createElement("div",{className:"panel--description"},"Tweet at us"))))))))}},463:function(e,a,t){var n;!function(){"use strict";var t={}.hasOwnProperty;function r(){for(var e=[],a=0;a0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(d.a,{className:"navbar__logo",src:v,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),o.map((function(e,a){return r.a.createElement("div",{key:a,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,a){return e.html?r.a.createElement("li",{key:a,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(Q,e))}))):null)}))),(m||c)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:A.a.footerLogoLink},r.a.createElement(q,{alt:m.alt,url:u})):r.a.createElement(q,{alt:m.alt,url:u})),r.a.createElement("small",null,c),r.a.createElement("br",null))))},H=t(502),z=t(503),V=t(3);t(138);a.a=function(e){var a=Object(b.a)().siteConfig,t=void 0===a?{}:a,n=t.title,i=t.themeConfig.image,o=t.url,s=e.children,m=e.title,d=e.noFooter,u=e.description,v=e.image,h=e.keywords,f=e.version,g=m?m+" | "+n:n,E=v||i,p=o+Object(y.a)(E),_=Object(V.h)(),k=_?"https://docs.qovery.com"+(_.pathname.endsWith("/")?_.pathname:_.pathname+"/"):null;return r.a.createElement(z.a,null,r.a.createElement(H.a,null,r.a.createElement(c.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),g&&r.a.createElement("title",null,g),g&&r.a.createElement("meta",{property:"og:title",content:g}),r.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),r.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),r.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),r.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),r.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),r.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),u&&r.a.createElement("meta",{name:"description",content:u}),u&&r.a.createElement("meta",{property:"og:description",content:u}),f&&r.a.createElement("meta",{name:"docsearch:version",content:f}),h&&h.length&&r.a.createElement("meta",{name:"keywords",content:h.join(",")}),E&&r.a.createElement("meta",{property:"og:image",content:p}),E&&r.a.createElement("meta",{property:"twitter:image",content:p}),E&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+g}),k&&r.a.createElement("meta",{property:"og:url",content:k}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),k&&r.a.createElement("link",{rel:"canonical",href:k})),r.a.createElement(l.a,null),r.a.createElement(L,null),r.a.createElement("div",{className:"main-wrapper"},s),!d&&r.a.createElement(F,null)))}},494:function(e,a,t){"use strict";var n=t(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});a.a=r}}]); \ No newline at end of file +/*! For license information please see 83e9e333.aa90c231.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[152],{303:function(e,a,t){"use strict";t.r(a);var n=t(0),r=t.n(n),l=t(487),c=(t(304),t(476));a.default=function(){var e=Object(c.a)().siteConfig;return(void 0===e?{}:e).customFields.metadata.team,r.a.createElement(l.a,{title:"Contact",description:"Contact the Qovery and Timber.io team"},r.a.createElement("header",{className:"hero"},r.a.createElement("div",{className:"container container--fluid"},r.a.createElement("h1",null,"Contact"),r.a.createElement("div",{className:"hero--subtitle"},"Qovery is a ",r.a.createElement("a",{href:"https://timber.io"},"Timber.io")," open-source product. You can contact the Qovery & Timber team using any of the options below."))),r.a.createElement("main",null,r.a.createElement("section",null,r.a.createElement("div",{className:"container"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"mailto:hi@timber.io",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-mail"})),r.a.createElement("div",{className:"panel--title"},"hi@timber.io"),r.a.createElement("div",{className:"panel--description"},"Shoot us an email"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://twitter.com/qoverydotdev",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-twitter"})),r.a.createElement("div",{className:"panel--title"},"@qoverydotdev"),r.a.createElement("div",{className:"panel--description"},"Tweet at us"))))))))}},463:function(e,a,t){var n;!function(){"use strict";var t={}.hasOwnProperty;function r(){for(var e=[],a=0;a0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(d.a,{className:"navbar__logo",src:v,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),o.map((function(e,a){return r.a.createElement("div",{key:a,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,a){return e.html?r.a.createElement("li",{key:a,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(Q,e))}))):null)}))),(m||c)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:A.a.footerLogoLink},r.a.createElement(q,{alt:m.alt,url:u})):r.a.createElement(q,{alt:m.alt,url:u})),r.a.createElement("small",null,c),r.a.createElement("br",null))))},H=t(502),z=t(503),V=t(3);t(138);a.a=function(e){var a=Object(b.a)().siteConfig,t=void 0===a?{}:a,n=t.title,i=t.themeConfig.image,o=t.url,s=e.children,m=e.title,d=e.noFooter,u=e.description,v=e.image,h=e.keywords,f=e.version,g=m?m+" | "+n:n,E=v||i,p=o+Object(y.a)(E),_=Object(V.h)(),k=_?"https://docs.qovery.com"+(_.pathname.endsWith("/")?_.pathname:_.pathname+"/"):null;return r.a.createElement(z.a,null,r.a.createElement(H.a,null,r.a.createElement(c.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),g&&r.a.createElement("title",null,g),g&&r.a.createElement("meta",{property:"og:title",content:g}),r.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),r.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),r.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),r.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),r.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),r.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),u&&r.a.createElement("meta",{name:"description",content:u}),u&&r.a.createElement("meta",{property:"og:description",content:u}),f&&r.a.createElement("meta",{name:"docsearch:version",content:f}),h&&h.length&&r.a.createElement("meta",{name:"keywords",content:h.join(",")}),E&&r.a.createElement("meta",{property:"og:image",content:p}),E&&r.a.createElement("meta",{property:"twitter:image",content:p}),E&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+g}),k&&r.a.createElement("meta",{property:"og:url",content:k}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),k&&r.a.createElement("link",{rel:"canonical",href:k})),r.a.createElement(l.a,null),r.a.createElement(L,null),r.a.createElement("div",{className:"main-wrapper"},s),!d&&r.a.createElement(F,null)))}},494:function(e,a,t){"use strict";var n=t(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});a.a=r}}]); \ No newline at end of file diff --git a/672ba3d6.ff04d85f.js.LICENSE.txt b/83e9e333.aa90c231.js.LICENSE.txt similarity index 100% rename from 672ba3d6.ff04d85f.js.LICENSE.txt rename to 83e9e333.aa90c231.js.LICENSE.txt diff --git a/89caf623.f96b2586.js b/89caf623.9960d1a5.js similarity index 99% rename from 89caf623.f96b2586.js rename to 89caf623.9960d1a5.js index 905b2b36cd..e18379d619 100644 --- a/89caf623.f96b2586.js +++ b/89caf623.9960d1a5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[156],{308:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return p})),a.d(t,"metadata",(function(){return d})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),l=a(9),r=(a(0),a(465)),i=a(472),s=a(477),o=a(479),c=a(464),b=a(469),u=a(473),p={last_modified_on:"2024-05-03",$schema:"/.meta/.schemas/guides.json",title:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1",readingTime:"13 min read",source:"@site/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"Create a blazingly fast REST API in Rust (Part 1/2)",truncated:!1,prevItem:{title:"Costs Control",permalink:"/guides/advanced/costs-control"},nextItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"}},m=[{value:"Twitter clone",id:"twitter-clone",children:[{value:"API design",id:"api-design",children:[]}]},{value:"Implementation",id:"implementation",children:[{value:"Actix Web",id:"actix-web",children:[]},{value:"Let's code",id:"lets-code",children:[]},{value:"Validation",id:"validation",children:[]}]},{value:"PostgreSQL",id:"postgresql",children:[{value:"Diesel",id:"diesel",children:[]}]},{value:"Deployment",id:"deployment",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Deploying the app",id:"deploying-the-app",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Configure the connection to the database",id:"configure-the-connection-to-the-database",children:[]}]},{value:"Deploy your application",id:"deploy-your-application",children:[]},{value:"Live test",id:"live-test",children:[]},{value:"What's next",id:"whats-next",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],h={rightToc:m};function g(e){var t=e.components,a=Object(l.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},h,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(r.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety. Coupled with Actix, I should be able to build a fast REST API elegantly."),Object(r.b)("p",null,"The idea behind this article is to see how performant a Rust API can be. I am going to create an API that saves and reads data from/to a PostgreSQL database."),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,'Most of the Rust REST API tests across the web are "',Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://medium.com/sean3z/rest-api-node-vs-rust-c75aa8c96343"}),"Hello World"),"\" applications. They bench direct API I/O with no payload. It's very far from reality. In the part 2 of this article, I will bench our Rust application with an intensive payload.")),Object(r.b)("p",null,"This article is separate in two parts, in this first part you will learn how to:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Create a blazingly fast REST API in Rust"),Object(r.b)("li",{parentName:"ul"},"Connect it to a PostgreSQL database")),Object(r.b)("p",null,"In the second part, we will compare the performance of our application to a Go application."),Object(r.b)("h2",{id:"twitter-clone"},"Twitter clone"),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.twitter.com"}),"Twitter"),' is a "microblogging" system that allows people to send and receive short posts called tweets.')),Object(r.b)("p",null,"Let's create a small part of the Twitter API to be able to post, read, and like tweets. The goal is to be able to use our Twitter clone with a massive number of simultaneous fake users."),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have installed ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/rust-lang/cargo"}),"Cargo")," (Rust package manager)"))),Object(r.b)("h3",{id:"api-design"},"API design"),Object(r.b)("p",null,"Our REST API needs to have three endpoints :"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list last 50 tweets"),Object(r.b)("li",{parentName:"ul"},"POST: create a new tweet"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: find a tweet by its ID"),Object(r.b)("li",{parentName:"ul"},"DELETE: delete a tweet by its ID"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id/likes"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list all likes attached to a tweet"),Object(r.b)("li",{parentName:"ul"},"POST: add +1 like to a tweet"),Object(r.b)("li",{parentName:"ul"},"DELETE: add -1 like to a tweet")))),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"For the sake of simplicity, I will not set up a user management service.")),Object(r.b)("h2",{id:"implementation"},"Implementation"),Object(r.b)("p",null,"Even though implementing an HTTP server could be fun, I choose to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://actix.rs/"}),"Actix"),", which is ranked as ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=fortune"}),"the most performant framework")," ever by ",Object(r.b)("em",{parentName:"p"},"Techempower"),"."),Object(r.b)("h3",{id:"actix-web"},"Actix Web"),Object(r.b)("p",null,"Actix is an actor framework prevalent in the Rust ecosystem. I am using it as an HTTP server to build our REST API."),Object(r.b)("h3",{id:"lets-code"},"Let's code"),Object(r.b)("p",null,"Three files structured our application."),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"main.rs")," to route HTTP requests to the right endpoint"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"tweet.rs")," to handle requests on /tweets"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"like.rs")," to handle requests on /tweets/:id/likes")),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs"',title:'"main.rs"'}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n HttpServer::new(|| {\n App::new()\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),'pub type Tweets = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Tweet {\n pub id: String,\n pub created_at: DateTime,\n pub message: String,\n pub likes: Vec,\n}\n\nimpl Tweet {\n pub fn new(message: String) -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n message,\n likes: vec![],\n }\n }\n}\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct TweetRequest {\n pub message: Option,\n}\n\nimpl TweetRequest {\n pub fn to_tweet(&self) -> Option {\n match &self.message {\n Some(message) => Some(Tweet::new(message.to_string())),\n None => None,\n }\n }\n}\n\n/// list 50 last tweets `/tweets`\n#[get("/tweets")]\npub async fn list() -> HttpResponse {\n // TODO find the last 50 tweets and return them\n\n let tweets = Tweets { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweets)\n}\n\n/// create a tweet `/tweets`\n#[post("/tweets")]\npub async fn create(tweet_req: Json) -> HttpResponse {\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(tweet_req.to_tweet())\n}\n\n/// find a tweet by its id `/tweets/{id}`\n#[get("/tweets/{id}")]\npub async fn get(path: Path<(String,)>) -> HttpResponse {\n // TODO find tweet a tweet by ID and return it\n let found_tweet: Option = None;\n\n match found_tweet {\n Some(tweet) => HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweet),\n None => HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap(),\n }\n}\n\n/// delete a tweet by its id `/tweets/{id}`\n#[delete("/tweets/{id}")]\npub async fn delete(path: Path<(String,)>) -> HttpResponse {\n // TODO delete tweet by ID\n // in any case return status 204\n\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),'pub type Likes = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Like {\n pub id: String,\n pub created_at: DateTime,\n}\n\nimpl Like {\n pub fn new() -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n }\n }\n}\n\n/// list last 50 likes from a tweet `/tweets/{id}/likes`\n#[get("/tweets/{id}/likes")]\npub async fn list(path: Path<(String,)>) -> HttpResponse {\n // TODO find likes by tweet ID and return them\n let likes = Likes { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(likes)\n}\n\n/// add one like to a tweet `/tweets/{id}/likes`\n#[post("/tweets/{id}/likes")]\npub async fn plus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO add one like to a tweet\n let like = Like::new();\n\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(like)\n}\n\n/// remove one like from a tweet `/tweets/{id}/likes`\n#[delete("/tweets/{id}/likes")]\npub async fn minus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO remove one like to a tweet\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/like.rs"}),"like.rs source code")))),Object(r.b)("p",null,"With only these three files, our application is ready to receive HTTP requests. In a couple of lines, we have a fully operational application. Actix takes care of the low level boilerplate for us."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="Annotation"',title:'"Annotation"'}),'#[get("/tweets")]\n')),Object(r.b)("p",null,"Annotation is a very convenient way to bind a route to the right path."),Object(r.b)("h3",{id:"validation"},"Validation"),Object(r.b)("p",null,"Let's run our application:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Run our application"',title:'"Run',our:!0,'application"':!0}),"# Go inside the root project directory\n$ cd twitter-clone-rust\n\n# Run the application\n$ cargo run\n")),Object(r.b)("p",null,"And validate that each endpoint with no errors:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,'API"':!0}),'# list tweets\ncurl http://localhost:9090/tweets\n\n# get a tweet (return status code: 204 because there is no tweet)\ncurl http://localhost:9090/tweets/abc\n\n# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" http://localhost:9090/tweets\n\n# delete a tweet (return status code: 204 in any case)\ncurl -X DELETE http://localhost:9090/tweets/abc\n\n# list likes from a tweet\ncurl http://localhost:9090/tweets/abc/likes\n\n# add one like to a tweet\ncurl -X POST http://localhost:9090/tweets/abc/likes\n\n# remove one like to a tweet\ncurl -X DELETE http://localhost:9090/tweets/abc/likes\n')),Object(r.b)("p",null,"At this stage, our application works without any database. Let's go more in-depth and connect it to PostgreSQL."),Object(r.b)("h2",{id:"postgresql"},"PostgreSQL"),Object(r.b)("h3",{id:"diesel"},"Diesel"),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://diesel.rs/"}),"Diesel")," is the most popular ORM in Rust to connect to a ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.postgresql.org"}),"PostgreSQL")," database. Combined with Actix, it's a perfect fit to persist in our data. Let's see how we can make that happen. However, Diesel does not support ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/tokio-rs/tokio"}),"tokio")," (the asynchronous engine behind Actix), so we have to run it in separate threads using the web::block function, which offloads blocking code (like Diesel's) to do not block the server's thread."),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Read the Diesel ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"http://diesel.rs/guides/getting-started/"}),"Getting started")," to generate tables configurations.")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="schema.rs"',title:'"schema.rs"'}),"table! {\n likes (id) {\n id -> Uuid,\n created_at -> Timestamp,\n tweet_id -> Uuid,\n }\n}\n\ntable! {\n tweets (id) {\n id -> Uuid,\n created_at -> Timestamp,\n message -> Text,\n }\n}\n\njoinable!(likes -> tweets (tweet_id));\n\nallow_tables_to_appear_in_same_query!(\n likes,\n tweets,\n);\n")),Object(r.b)("p",null,"Diesel uses a macro ",Object(r.b)("inlineCode",{parentName:"p"},"table!...")," and an internal DSL to declare the structure of our tables. There is no magic here. The code is compiled and statically linked at the compilation."),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs" {6-11,15-16}',title:'"main.rs"',"{6-11,15-16}":!0}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n // set up database connection pool\n let database_url = env::var("DATABASE_URL").expect("DATABASE_URL");\n let manager = ConnectionManager::::new(database_url);\n let pool = r2d2::Pool::builder()\n .build(manager)\n .expect("Failed to create pool");\n\n HttpServer::new(move || {\n App::new()\n // Set up DB pool to be used with web::Data extractor\n .data(pool.clone())\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),"//...\nfn list_tweets(total_tweets: i64, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let _tweets = match tweets\n .order(created_at.desc())\n .limit(total_tweets)\n .load::(conn)\n {\n Ok(tws) => tws,\n Err(_) => vec![],\n };\n\n Ok(Tweets {\n results: _tweets\n .into_iter()\n .map(|t| t.to_tweet())\n .collect::>(),\n })\n}\n\nfn find_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let res = tweets.filter(id.eq(_id)).load::(conn);\n match res {\n Ok(tweets_db) => match tweets_db.first() {\n Some(tweet_db) => Ok(tweet_db.to_tweet()),\n _ => Err(Error::NotFound),\n },\n Err(err) => Err(err),\n }\n}\n\nfn create_tweet(tweet: Tweet, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let tweet_db = tweet.to_tweet_db();\n let _ = diesel::insert_into(tweets).values(&tweet_db).execute(conn);\n\n Ok(tweet_db.to_tweet())\n}\n\nfn delete_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::tweets::dsl::*;\n\n let res = diesel::delete(tweets.filter(id.eq(_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),"//...\npub fn list_likes(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let _likes: Vec = match likes\n .filter(tweet_id.eq(_tweet_id))\n .order(created_at.desc())\n .load::(conn)\n {\n Ok(lks) => lks,\n Err(_) => vec![],\n };\n\n Ok(Likes {\n results: _likes\n .into_iter()\n .map(|l| l.to_like())\n .collect::>(),\n })\n}\n\npub fn create_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let like = Like::new();\n let _ = diesel::insert_into(likes)\n .values(like.to_like_db(_tweet_id))\n .execute(conn);\n\n Ok(like)\n}\n\npub fn delete_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::likes::dsl::*;\n\n let _likes = list_likes(_tweet_id, conn);\n\n let like = match &_likes {\n Ok(_likes) if !_likes.results.is_empty() => _likes.results.first(),\n _ => None,\n };\n\n if like.is_none() {\n return Ok(());\n }\n\n let like_id = Uuid::from_str(like.unwrap().id.as_str()).unwrap();\n\n let res = diesel::delete(likes.filter(id.eq(like_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/like.rs"}),"like.rs source code")))),Object(r.b)("h2",{id:"deployment"},"Deployment"),Object(r.b)("p",null,"Qovery is going to help you to deploy your application in a few seconds. Let's deploy our Twitter Clone now."),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"web",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("p",null,"Sign in to the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(r.b)("p",{align:"center"},Object(r.b)("a",{href:"https://console.qovery.com/"},Object(r.b)("img",{src:"/img/Qovery_Sign_Up_Page.png",alt:"Qovery Sign-up page"}))))),Object(r.b)(o.a,{value:"cli",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(o.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(o.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(r.b)("li",null,Object(r.b)("h3",{id:"sign-up"},"Sign up"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(r.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")))),Object(r.b)("h3",{id:"deploying-the-app"},"Deploying the app"),Object(r.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(r.b)("ol",null,Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(r.b)("p",null,"To follow the guide, ",Object(r.b)("a",{href:"https://github.com/evoxmusic/twitter-clone-rust"},"you can fork and use our repository")),Object(r.b)("p",null,"Use the forked repository (and branch ",Object(r.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("p",null,"After the application is created: "),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Navigate application settings"),Object(r.b)("li",{parentName:"ul"},"Select ",Object(r.b)("strong",{parentName:"li"},"Port")),Object(r.b)("li",{parentName:"ul"},"Add port ",Object(r.b)("strong",{parentName:"li"},"9090"))),Object(r.b)("p",{align:"left"},Object(r.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(r.b)("p",null,"Create and deploy a new database"),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Name the database ",Object(r.b)("strong",{parentName:"p"},"my-pql-db")," to follow the guide flawlessly")),Object(r.b)("p",null,"To learn how to do it, you can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"))),Object(r.b)("li",null,Object(r.b)("h3",{id:"configure-the-connection-to-the-database"},"Configure the connection to the database"),Object(r.b)("p",null,"In application overview, open the ",Object(r.b)("strong",{parentName:"p"},"Variables")," tab"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/open-env-var.png",alt:"Open Variable"})),Object(r.b)("p",null,"Configure the alias for each built_in environment variable to match the one required within your code"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/alias.png",alt:"Env Var Alias"})),Object(r.b)("p",null,"Have a look at ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),"this section")," to know more on how to connect to a database.")),Object(r.b)("h2",{id:"deploy-your-application"},"Deploy your application"),Object(r.b)("p",null,"All you have to do now is to navigate to your application and click ",Object(r.b)("strong",{parentName:"p"},"Deploy")," button"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-1.png",alt:"Deploy App"})),Object(r.b)("p",null,"That's it. Watch the status and wait till the app is deployed."))),Object(r.b)("p",null,"Congratulations, you have deployed your application!"),Object(r.b)("h2",{id:"live-test"},"Live test"),Object(r.b)("p",null,"To open the application in your browser, click on ",Object(r.b)("strong",{parentName:"p"},"Action")," and ",Object(r.b)("strong",{parentName:"p"},"Open")," buttons in your application overview:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/deploy-env-1.png",alt:"Open App"})),Object(r.b)("p",null,"Then, we can test it with the following CURL commands (replace the app URL with your own):"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our deployed API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,deployed:!0,'API"':!0}),'# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# list tweets\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# get a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n\n# list likes from a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# add one like to a tweet\ncurl -X POST https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# remove one like to a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# delete a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n')),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"add your custom domain"))),Object(r.b)("h2",{id:"whats-next"},"What's next"),Object(r.b)("p",null,"In this first part we saw how to create a Rust API with Actix and Diesel. In the second part we will compare its performance with a Go application to see which one is the most performant."),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Special thanks to ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/imjasonmiller"}),"Jason")," and ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/doctor_code"}),"Kokou")," for your reviews")),Object(r.b)("h2",{id:"useful-resources"},"Useful resources"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/twitter-clone-rust"}),"Source code"))),Object(r.b)("p",null,"Do you want to know more about Rust?"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://blog.rust-lang.org/inside-rust/"}),"A great blog to follow along with Rust development")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/channel/UC_iD0xppBwwsrM9DegC5cQQ"}),"Jon Gjengset")," - PhD student at MIT in distributed systems and Rust live-coder"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/watch?v=j_4sadjjWh8"}),"My first service in Rust")," (French video - Fran\xe7ois T.)")),Object(r.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),l=a.n(n),r=a(463),i=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,s=e.type,o=null;switch(s){case"danger":o="alert-triangle";break;case"success":o="check-circle";break;case"warning":o="alert-triangle";break;default:o="info"}return l.a.createElement("div",{className:i()(a,"alert","alert--"+s,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:i()("feather","icon-"+(r||o))}),t)}},468:function(e,t,a){var n=a(28).f,l=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in l||a(10)&&n(l,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),l=a.n(n),r=a(464);t.a=function(e){var t=e.children,a=e.name;return l.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},l.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),l=a(0),r=a.n(l),i=a(39),s=a(474),o=a(20),c=a.n(o);t.a=function(e){var t,a=e.to,o=e.href,b=a||o,u=Object(s.a)(b),p=Object(l.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(l.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?r.a.createElement(i.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var a,n;d&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},472:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(463),a(471)),i=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,s="undefined"!=typeof window?window.location:null,o={title:"Tutorial on "+s+" failed",body:"The tutorial on:\n\n"+s+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(o),b=Object(n.useState)(null),u=b[0],p=b[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!u&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=a(470),i=a(463),s=a.n(i);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,i=e.leftIcon,o=e.rightIcon,c=e.size,b=e.target,u=e.to,p=s()("jump-to","jump-to--"+c,a),d=l.a.createElement("div",{className:"jump-to--inner"},l.a.createElement("div",{className:"jump-to--inner-2"},i&&l.a.createElement("div",{className:"jump-to--left"},l.a.createElement("i",{className:"feather icon-"+i})),l.a.createElement("div",{className:"jump-to--main"},n?l.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),l.a.createElement("div",{className:"jump-to--right"},l.a.createElement("i",{className:"feather icon-"+(o||"chevron-right")+" arrow"}))));return b?l.a.createElement("a",{href:u,target:b,className:p},d):l.a.createElement(r.a,{to:u,className:p},d)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),l=(a(481),a(478),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),i=a(483),s=a(463),o=a.n(s),c=a(471),b=a.n(c),u=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,i=e.handleKeydown,s=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:o()("tabs",l,{"tabs--block":t}),style:s},c.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:o()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,s=e.values,o=s;if(o[0].group){var c=_.groupBy(o,"group");o=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:o,isClearable:a,placeholder:t,value:s.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,i=e.groupId,s=e.label,o=e.placeholder,c=e.select,g=e.size,w=(e.style,e.values),O=e.urlKey,j=Object(u.a)(),v=j.tabGroupChoices,f=j.setTabGroupChoices,y=Object(l.useState)(a),k=y[0],N=y[1];if(null!=i){var T=v[i];null!=T&&T!==k&&N(T)}var _=function(e){N(e),null!=i&&f(i,e)},I=[],x=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(g||"md")},s&&r.a.createElement("div",{className:"margin-vert--sm"},s),w.length>1&&(c?r.a.createElement(h,Object(n.a)({changeSelectedValue:_,handleKeydown:x,placeholder:o,selectedValue:k,size:g,tabRefs:I},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:_,handleKeydown:x,selectedValue:k,tabRefs:I},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},479:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[156],{308:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return p})),a.d(t,"metadata",(function(){return d})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),l=a(9),r=(a(0),a(465)),i=a(472),s=a(477),o=a(478),c=a(464),b=a(469),u=a(473),p={last_modified_on:"2024-05-03",$schema:"/.meta/.schemas/guides.json",title:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1",readingTime:"13 min read",source:"@site/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"Create a blazingly fast REST API in Rust (Part 1/2)",truncated:!1,prevItem:{title:"Costs Control",permalink:"/guides/advanced/costs-control"},nextItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"}},m=[{value:"Twitter clone",id:"twitter-clone",children:[{value:"API design",id:"api-design",children:[]}]},{value:"Implementation",id:"implementation",children:[{value:"Actix Web",id:"actix-web",children:[]},{value:"Let's code",id:"lets-code",children:[]},{value:"Validation",id:"validation",children:[]}]},{value:"PostgreSQL",id:"postgresql",children:[{value:"Diesel",id:"diesel",children:[]}]},{value:"Deployment",id:"deployment",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Deploying the app",id:"deploying-the-app",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Configure the connection to the database",id:"configure-the-connection-to-the-database",children:[]}]},{value:"Deploy your application",id:"deploy-your-application",children:[]},{value:"Live test",id:"live-test",children:[]},{value:"What's next",id:"whats-next",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],h={rightToc:m};function g(e){var t=e.components,a=Object(l.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},h,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(r.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety. Coupled with Actix, I should be able to build a fast REST API elegantly."),Object(r.b)("p",null,"The idea behind this article is to see how performant a Rust API can be. I am going to create an API that saves and reads data from/to a PostgreSQL database."),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,'Most of the Rust REST API tests across the web are "',Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://medium.com/sean3z/rest-api-node-vs-rust-c75aa8c96343"}),"Hello World"),"\" applications. They bench direct API I/O with no payload. It's very far from reality. In the part 2 of this article, I will bench our Rust application with an intensive payload.")),Object(r.b)("p",null,"This article is separate in two parts, in this first part you will learn how to:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Create a blazingly fast REST API in Rust"),Object(r.b)("li",{parentName:"ul"},"Connect it to a PostgreSQL database")),Object(r.b)("p",null,"In the second part, we will compare the performance of our application to a Go application."),Object(r.b)("h2",{id:"twitter-clone"},"Twitter clone"),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.twitter.com"}),"Twitter"),' is a "microblogging" system that allows people to send and receive short posts called tweets.')),Object(r.b)("p",null,"Let's create a small part of the Twitter API to be able to post, read, and like tweets. The goal is to be able to use our Twitter clone with a massive number of simultaneous fake users."),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have installed ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/rust-lang/cargo"}),"Cargo")," (Rust package manager)"))),Object(r.b)("h3",{id:"api-design"},"API design"),Object(r.b)("p",null,"Our REST API needs to have three endpoints :"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list last 50 tweets"),Object(r.b)("li",{parentName:"ul"},"POST: create a new tweet"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: find a tweet by its ID"),Object(r.b)("li",{parentName:"ul"},"DELETE: delete a tweet by its ID"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id/likes"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list all likes attached to a tweet"),Object(r.b)("li",{parentName:"ul"},"POST: add +1 like to a tweet"),Object(r.b)("li",{parentName:"ul"},"DELETE: add -1 like to a tweet")))),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"For the sake of simplicity, I will not set up a user management service.")),Object(r.b)("h2",{id:"implementation"},"Implementation"),Object(r.b)("p",null,"Even though implementing an HTTP server could be fun, I choose to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://actix.rs/"}),"Actix"),", which is ranked as ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=fortune"}),"the most performant framework")," ever by ",Object(r.b)("em",{parentName:"p"},"Techempower"),"."),Object(r.b)("h3",{id:"actix-web"},"Actix Web"),Object(r.b)("p",null,"Actix is an actor framework prevalent in the Rust ecosystem. I am using it as an HTTP server to build our REST API."),Object(r.b)("h3",{id:"lets-code"},"Let's code"),Object(r.b)("p",null,"Three files structured our application."),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"main.rs")," to route HTTP requests to the right endpoint"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"tweet.rs")," to handle requests on /tweets"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"like.rs")," to handle requests on /tweets/:id/likes")),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs"',title:'"main.rs"'}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n HttpServer::new(|| {\n App::new()\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),'pub type Tweets = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Tweet {\n pub id: String,\n pub created_at: DateTime,\n pub message: String,\n pub likes: Vec,\n}\n\nimpl Tweet {\n pub fn new(message: String) -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n message,\n likes: vec![],\n }\n }\n}\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct TweetRequest {\n pub message: Option,\n}\n\nimpl TweetRequest {\n pub fn to_tweet(&self) -> Option {\n match &self.message {\n Some(message) => Some(Tweet::new(message.to_string())),\n None => None,\n }\n }\n}\n\n/// list 50 last tweets `/tweets`\n#[get("/tweets")]\npub async fn list() -> HttpResponse {\n // TODO find the last 50 tweets and return them\n\n let tweets = Tweets { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweets)\n}\n\n/// create a tweet `/tweets`\n#[post("/tweets")]\npub async fn create(tweet_req: Json) -> HttpResponse {\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(tweet_req.to_tweet())\n}\n\n/// find a tweet by its id `/tweets/{id}`\n#[get("/tweets/{id}")]\npub async fn get(path: Path<(String,)>) -> HttpResponse {\n // TODO find tweet a tweet by ID and return it\n let found_tweet: Option = None;\n\n match found_tweet {\n Some(tweet) => HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweet),\n None => HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap(),\n }\n}\n\n/// delete a tweet by its id `/tweets/{id}`\n#[delete("/tweets/{id}")]\npub async fn delete(path: Path<(String,)>) -> HttpResponse {\n // TODO delete tweet by ID\n // in any case return status 204\n\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),'pub type Likes = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Like {\n pub id: String,\n pub created_at: DateTime,\n}\n\nimpl Like {\n pub fn new() -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n }\n }\n}\n\n/// list last 50 likes from a tweet `/tweets/{id}/likes`\n#[get("/tweets/{id}/likes")]\npub async fn list(path: Path<(String,)>) -> HttpResponse {\n // TODO find likes by tweet ID and return them\n let likes = Likes { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(likes)\n}\n\n/// add one like to a tweet `/tweets/{id}/likes`\n#[post("/tweets/{id}/likes")]\npub async fn plus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO add one like to a tweet\n let like = Like::new();\n\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(like)\n}\n\n/// remove one like from a tweet `/tweets/{id}/likes`\n#[delete("/tweets/{id}/likes")]\npub async fn minus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO remove one like to a tweet\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/like.rs"}),"like.rs source code")))),Object(r.b)("p",null,"With only these three files, our application is ready to receive HTTP requests. In a couple of lines, we have a fully operational application. Actix takes care of the low level boilerplate for us."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="Annotation"',title:'"Annotation"'}),'#[get("/tweets")]\n')),Object(r.b)("p",null,"Annotation is a very convenient way to bind a route to the right path."),Object(r.b)("h3",{id:"validation"},"Validation"),Object(r.b)("p",null,"Let's run our application:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Run our application"',title:'"Run',our:!0,'application"':!0}),"# Go inside the root project directory\n$ cd twitter-clone-rust\n\n# Run the application\n$ cargo run\n")),Object(r.b)("p",null,"And validate that each endpoint with no errors:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,'API"':!0}),'# list tweets\ncurl http://localhost:9090/tweets\n\n# get a tweet (return status code: 204 because there is no tweet)\ncurl http://localhost:9090/tweets/abc\n\n# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" http://localhost:9090/tweets\n\n# delete a tweet (return status code: 204 in any case)\ncurl -X DELETE http://localhost:9090/tweets/abc\n\n# list likes from a tweet\ncurl http://localhost:9090/tweets/abc/likes\n\n# add one like to a tweet\ncurl -X POST http://localhost:9090/tweets/abc/likes\n\n# remove one like to a tweet\ncurl -X DELETE http://localhost:9090/tweets/abc/likes\n')),Object(r.b)("p",null,"At this stage, our application works without any database. Let's go more in-depth and connect it to PostgreSQL."),Object(r.b)("h2",{id:"postgresql"},"PostgreSQL"),Object(r.b)("h3",{id:"diesel"},"Diesel"),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://diesel.rs/"}),"Diesel")," is the most popular ORM in Rust to connect to a ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.postgresql.org"}),"PostgreSQL")," database. Combined with Actix, it's a perfect fit to persist in our data. Let's see how we can make that happen. However, Diesel does not support ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/tokio-rs/tokio"}),"tokio")," (the asynchronous engine behind Actix), so we have to run it in separate threads using the web::block function, which offloads blocking code (like Diesel's) to do not block the server's thread."),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Read the Diesel ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"http://diesel.rs/guides/getting-started/"}),"Getting started")," to generate tables configurations.")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="schema.rs"',title:'"schema.rs"'}),"table! {\n likes (id) {\n id -> Uuid,\n created_at -> Timestamp,\n tweet_id -> Uuid,\n }\n}\n\ntable! {\n tweets (id) {\n id -> Uuid,\n created_at -> Timestamp,\n message -> Text,\n }\n}\n\njoinable!(likes -> tweets (tweet_id));\n\nallow_tables_to_appear_in_same_query!(\n likes,\n tweets,\n);\n")),Object(r.b)("p",null,"Diesel uses a macro ",Object(r.b)("inlineCode",{parentName:"p"},"table!...")," and an internal DSL to declare the structure of our tables. There is no magic here. The code is compiled and statically linked at the compilation."),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs" {6-11,15-16}',title:'"main.rs"',"{6-11,15-16}":!0}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n // set up database connection pool\n let database_url = env::var("DATABASE_URL").expect("DATABASE_URL");\n let manager = ConnectionManager::::new(database_url);\n let pool = r2d2::Pool::builder()\n .build(manager)\n .expect("Failed to create pool");\n\n HttpServer::new(move || {\n App::new()\n // Set up DB pool to be used with web::Data extractor\n .data(pool.clone())\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),"//...\nfn list_tweets(total_tweets: i64, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let _tweets = match tweets\n .order(created_at.desc())\n .limit(total_tweets)\n .load::(conn)\n {\n Ok(tws) => tws,\n Err(_) => vec![],\n };\n\n Ok(Tweets {\n results: _tweets\n .into_iter()\n .map(|t| t.to_tweet())\n .collect::>(),\n })\n}\n\nfn find_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let res = tweets.filter(id.eq(_id)).load::(conn);\n match res {\n Ok(tweets_db) => match tweets_db.first() {\n Some(tweet_db) => Ok(tweet_db.to_tweet()),\n _ => Err(Error::NotFound),\n },\n Err(err) => Err(err),\n }\n}\n\nfn create_tweet(tweet: Tweet, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let tweet_db = tweet.to_tweet_db();\n let _ = diesel::insert_into(tweets).values(&tweet_db).execute(conn);\n\n Ok(tweet_db.to_tweet())\n}\n\nfn delete_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::tweets::dsl::*;\n\n let res = diesel::delete(tweets.filter(id.eq(_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),"//...\npub fn list_likes(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let _likes: Vec = match likes\n .filter(tweet_id.eq(_tweet_id))\n .order(created_at.desc())\n .load::(conn)\n {\n Ok(lks) => lks,\n Err(_) => vec![],\n };\n\n Ok(Likes {\n results: _likes\n .into_iter()\n .map(|l| l.to_like())\n .collect::>(),\n })\n}\n\npub fn create_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let like = Like::new();\n let _ = diesel::insert_into(likes)\n .values(like.to_like_db(_tweet_id))\n .execute(conn);\n\n Ok(like)\n}\n\npub fn delete_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::likes::dsl::*;\n\n let _likes = list_likes(_tweet_id, conn);\n\n let like = match &_likes {\n Ok(_likes) if !_likes.results.is_empty() => _likes.results.first(),\n _ => None,\n };\n\n if like.is_none() {\n return Ok(());\n }\n\n let like_id = Uuid::from_str(like.unwrap().id.as_str()).unwrap();\n\n let res = diesel::delete(likes.filter(id.eq(like_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/like.rs"}),"like.rs source code")))),Object(r.b)("h2",{id:"deployment"},"Deployment"),Object(r.b)("p",null,"Qovery is going to help you to deploy your application in a few seconds. Let's deploy our Twitter Clone now."),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"web",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("p",null,"Sign in to the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(r.b)("p",{align:"center"},Object(r.b)("a",{href:"https://console.qovery.com/"},Object(r.b)("img",{src:"/img/Qovery_Sign_Up_Page.png",alt:"Qovery Sign-up page"}))))),Object(r.b)(o.a,{value:"cli",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(o.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(o.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(r.b)("li",null,Object(r.b)("h3",{id:"sign-up"},"Sign up"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(r.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")))),Object(r.b)("h3",{id:"deploying-the-app"},"Deploying the app"),Object(r.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(r.b)("ol",null,Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(r.b)("p",null,"To follow the guide, ",Object(r.b)("a",{href:"https://github.com/evoxmusic/twitter-clone-rust"},"you can fork and use our repository")),Object(r.b)("p",null,"Use the forked repository (and branch ",Object(r.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("p",null,"After the application is created: "),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Navigate application settings"),Object(r.b)("li",{parentName:"ul"},"Select ",Object(r.b)("strong",{parentName:"li"},"Port")),Object(r.b)("li",{parentName:"ul"},"Add port ",Object(r.b)("strong",{parentName:"li"},"9090"))),Object(r.b)("p",{align:"left"},Object(r.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(r.b)("p",null,"Create and deploy a new database"),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Name the database ",Object(r.b)("strong",{parentName:"p"},"my-pql-db")," to follow the guide flawlessly")),Object(r.b)("p",null,"To learn how to do it, you can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"))),Object(r.b)("li",null,Object(r.b)("h3",{id:"configure-the-connection-to-the-database"},"Configure the connection to the database"),Object(r.b)("p",null,"In application overview, open the ",Object(r.b)("strong",{parentName:"p"},"Variables")," tab"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/open-env-var.png",alt:"Open Variable"})),Object(r.b)("p",null,"Configure the alias for each built_in environment variable to match the one required within your code"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/alias.png",alt:"Env Var Alias"})),Object(r.b)("p",null,"Have a look at ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),"this section")," to know more on how to connect to a database.")),Object(r.b)("h2",{id:"deploy-your-application"},"Deploy your application"),Object(r.b)("p",null,"All you have to do now is to navigate to your application and click ",Object(r.b)("strong",{parentName:"p"},"Deploy")," button"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-1.png",alt:"Deploy App"})),Object(r.b)("p",null,"That's it. Watch the status and wait till the app is deployed."))),Object(r.b)("p",null,"Congratulations, you have deployed your application!"),Object(r.b)("h2",{id:"live-test"},"Live test"),Object(r.b)("p",null,"To open the application in your browser, click on ",Object(r.b)("strong",{parentName:"p"},"Action")," and ",Object(r.b)("strong",{parentName:"p"},"Open")," buttons in your application overview:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/deploy-env-1.png",alt:"Open App"})),Object(r.b)("p",null,"Then, we can test it with the following CURL commands (replace the app URL with your own):"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our deployed API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,deployed:!0,'API"':!0}),'# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# list tweets\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# get a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n\n# list likes from a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# add one like to a tweet\ncurl -X POST https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# remove one like to a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# delete a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n')),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"add your custom domain"))),Object(r.b)("h2",{id:"whats-next"},"What's next"),Object(r.b)("p",null,"In this first part we saw how to create a Rust API with Actix and Diesel. In the second part we will compare its performance with a Go application to see which one is the most performant."),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Special thanks to ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/imjasonmiller"}),"Jason")," and ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/doctor_code"}),"Kokou")," for your reviews")),Object(r.b)("h2",{id:"useful-resources"},"Useful resources"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/twitter-clone-rust"}),"Source code"))),Object(r.b)("p",null,"Do you want to know more about Rust?"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://blog.rust-lang.org/inside-rust/"}),"A great blog to follow along with Rust development")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/channel/UC_iD0xppBwwsrM9DegC5cQQ"}),"Jon Gjengset")," - PhD student at MIT in distributed systems and Rust live-coder"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/watch?v=j_4sadjjWh8"}),"My first service in Rust")," (French video - Fran\xe7ois T.)")),Object(r.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),l=a.n(n),r=a(463),i=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,s=e.type,o=null;switch(s){case"danger":o="alert-triangle";break;case"success":o="check-circle";break;case"warning":o="alert-triangle";break;default:o="info"}return l.a.createElement("div",{className:i()(a,"alert","alert--"+s,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:i()("feather","icon-"+(r||o))}),t)}},468:function(e,t,a){var n=a(28).f,l=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in l||a(10)&&n(l,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),l=a.n(n),r=a(464);t.a=function(e){var t=e.children,a=e.name;return l.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},l.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),l=a(0),r=a.n(l),i=a(39),s=a(474),o=a(20),c=a.n(o);t.a=function(e){var t,a=e.to,o=e.href,b=a||o,u=Object(s.a)(b),p=Object(l.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(l.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?r.a.createElement(i.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var a,n;d&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},472:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(463),a(471)),i=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,s="undefined"!=typeof window?window.location:null,o={title:"Tutorial on "+s+" failed",body:"The tutorial on:\n\n"+s+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(o),b=Object(n.useState)(null),u=b[0],p=b[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!u&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=a(470),i=a(463),s=a.n(i);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,i=e.leftIcon,o=e.rightIcon,c=e.size,b=e.target,u=e.to,p=s()("jump-to","jump-to--"+c,a),d=l.a.createElement("div",{className:"jump-to--inner"},l.a.createElement("div",{className:"jump-to--inner-2"},i&&l.a.createElement("div",{className:"jump-to--left"},l.a.createElement("i",{className:"feather icon-"+i})),l.a.createElement("div",{className:"jump-to--main"},n?l.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),l.a.createElement("div",{className:"jump-to--right"},l.a.createElement("i",{className:"feather icon-"+(o||"chevron-right")+" arrow"}))));return b?l.a.createElement("a",{href:u,target:b,className:p},d):l.a.createElement(r.a,{to:u,className:p},d)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),l=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),i=a(483),s=a(463),o=a.n(s),c=a(471),b=a.n(c),u=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,i=e.handleKeydown,s=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:o()("tabs",l,{"tabs--block":t}),style:s},c.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:o()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,s=e.values,o=s;if(o[0].group){var c=_.groupBy(o,"group");o=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:o,isClearable:a,placeholder:t,value:s.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,i=e.groupId,s=e.label,o=e.placeholder,c=e.select,g=e.size,w=(e.style,e.values),O=e.urlKey,j=Object(u.a)(),v=j.tabGroupChoices,f=j.setTabGroupChoices,y=Object(l.useState)(a),k=y[0],N=y[1];if(null!=i){var T=v[i];null!=T&&T!==k&&N(T)}var _=function(e){N(e),null!=i&&f(i,e)},I=[],x=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(g||"md")},s&&r.a.createElement("div",{className:"margin-vert--sm"},s),w.length>1&&(c?r.a.createElement(h,Object(n.a)({changeSelectedValue:_,handleKeydown:x,placeholder:o,selectedValue:k,size:g,tabRefs:I},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:_,handleKeydown:x,selectedValue:k,tabRefs:I},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},478:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/952063ba.db96a479.js b/952063ba.d951120a.js similarity index 99% rename from 952063ba.db96a479.js rename to 952063ba.d951120a.js index 813debff18..a825998c9f 100644 --- a/952063ba.db96a479.js +++ b/952063ba.d951120a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[174],{326:function(e,a,t){"use strict";t.r(a),t.d(a,"frontMatter",(function(){return i})),t.d(a,"metadata",(function(){return p})),t.d(a,"rightToc",(function(){return d})),t.d(a,"default",(function(){return h}));var n,l=t(1),r=t(9),o=(t(0),t(465)),c=t(479),s=t(472),u=t(464),b=t(477),i={last_modified_on:"2024-07-12",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your Scaleway Kubernetes Service (Kapsule) cluster"},p={id:"getting-started/install-qovery/scaleway/self-managed-cluster",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your Scaleway Kubernetes Service (Kapsule) cluster",source:"@site/docs/getting-started/install-qovery/scaleway/self-managed-cluster.md",permalink:"/docs/getting-started/install-qovery/scaleway/self-managed-cluster",sidebar:"docs",previous:{title:"FAQ",permalink:"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/faq"},next:{title:"Azure",permalink:"/docs/getting-started/install-qovery/azure"}},d=[{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Install Qovery on your Scaleway Kapsule cluster",id:"install-qovery-on-your-scaleway-kapsule-cluster",children:[]},{value:"What's Next?",id:"whats-next",children:[]}],m=(n="Assumption",function(e){return console.warn("Component "+n+" was not imported, exported, or provided by MDXProvider as global scope"),Object(o.b)("div",e)}),y={rightToc:d};function h(e){var a=e.components,t=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(l.a)({},y,t,{components:a,mdxType:"MDXLayout"}),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are not familiar with Kubernetes, we recommend you to use Qovery on a Managed Kubernetes cluster on ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/"}),"AWS"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/"}),"GCP"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/quickstart/"}),"Scaleway"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart/"}),"Azure"),", or contact us.")),Object(o.b)("p",null,"Qovery Self-Managed (or BYOK: Bring Your Own Kubernetes) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster.\nRead ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/blog/kubernetes-managed-by-qovery-vs-self-managed-byok"}),"this article")," to better understand the difference with the Managed Kubernetes by Qovery. In a nutshell, Qovery BYOK is for Kubernetes experts who want to manage their own Kubernetes cluster. In this version, Qovery does not manage the Kubernetes cluster for you."),Object(o.b)(u.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery automatically updates ",Object(o.b)("strong",{parentName:"p"},"ONLY")," the Qovery applications (agent, shell-agent etc..) via the Qovery Helm chart. With the self-managed offer it will be up to you to manage any dependency components (ingress, dns, logging...), making sure they run with the right version over time."),Object(o.b)("p",null,"The dependencies provided with the Qovery Helm chart are here to help you with the bootstrap, and are not maintained by Qovery. If you want to simplify the maintenance of your cluster, please look at ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/pricing/"}),"Qovery managed Kubernetes offer"),".")),Object(o.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(o.b)(m,{mdxType:"Assumption"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have a Scaleway Kapsule Kubernetes cluster up and running."),Object(o.b)("li",{parentName:"ul"},"You have a Scaleway Kapsule Kubernetes cluster with at least 4 CPUs and 8GB of RAM."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"kubectl")," installed and configured to access your Scaleway Kapsule Kubernetes cluster."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"helm")," installed."),Object(o.b)("li",{parentName:"ul"},"You have a Qovery account. If you don't have one, please sign up at ",Object(o.b)("a",Object(l.a)({parentName:"li"},{href:"https://start.qovery.com"}),"https://start.qovery.com")))),Object(o.b)("h2",{id:"install-qovery-on-your-scaleway-kapsule-cluster"},"Install Qovery on your Scaleway Kapsule cluster"),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Follow ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/local/"}),"this guide")," to try Qovery on your local machine.")),Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"automatic",placeholder:"Install Qovery",select:!1,size:null,values:[{group:"Install",label:"Automatic",value:"automatic"},{group:"Install",label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"automatic",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery CLI by running the following command:"),Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(c.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("p",null,"Authenticate with Qovery by running the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Scaleway Kapsule cluster:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"qovery cluster install\n")),Object(o.b)("p",null,"Respond to the prompts to install Qovery on your Scaleway Kapsule Kubernetes cluster."))))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://helm.sh"}),"Helm")," command line tool.")),Object(o.b)("li",null,Object(o.b)("p",null,"Add Qovery Helm repository."),Object(o.b)(u.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery Helm Chart is only available for users who have access to Qovery BYOK. ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/bring-your-own-kubernetes"}),"Request your access here"),".")),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm repo add qovery https://helm.qovery.com\nhelm repo update\n"))),Object(o.b)("li",null,Object(o.b)("p",null,"Login to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console"),", create a cluster of type ",Object(o.b)("inlineCode",{parentName:"p"},"Self-Managed"),". At the end of the flow you will be able to download the ",Object(o.b)("inlineCode",{parentName:"p"},"values.yaml")," file associated with this cluster.")),Object(o.b)("li",null,Object(o.b)("p",null,"Now you can customize your values.yaml file based on your need. Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),"."),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Make sure that all fields having value ",Object(o.b)("inlineCode",{parentName:"p"},"set-by-customer")," are filled.")),Object(o.b)("p",null,"Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Kubernetes cluster."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --wait --atomic --create-namespace -n qovery -f \\\n --set services.certificates.cert-manager-configs.enabled=false \\\n --set services.certificates.qovery-cert-manager-webhook.enabled=false \\\n --set services.qovery.qovery-cluster-agent.enabled=false \\\n --set services.qovery.qovery-engine.enabled=false \\\n qovery qovery/qovery\n")),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-n qovery"),": the namespace where Qovery and its dependencies will be installed"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"--set..."),": override (only for the first deployment time, if you want to use Cert-Manager) to let cert-manager install its CRDs"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-f your-values-file.yaml"),": the values file you've downloaded, overrided with the Qovery config and your custom config"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery/qovery"),": name of the chart to deploy"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery"),": name of the release")),Object(o.b)("p",null,"If you want to use Cert-Manager, you can remove the ",Object(o.b)("inlineCode",{parentName:"p"},"--set...")," for the future updates (or if already installed):"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --create-namespace -n qovery -f --wait --atomic qovery qovery/qovery\n"))))))),Object(o.b)("p",null,"That's it, you can now use Qovery on your Scaleway Kapsule cluster."),Object(o.b)("p",null,"Connect to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console")," to validate that Qovery is properly installed and start deploying your applications."),Object(o.b)("h2",{id:"whats-next"},"What's Next?"),Object(o.b)("p",null,"Now that you have Qovery installed on your Kubernetes cluster, you can check that Qovery is properly installed by following the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/validate-installation/"}),"Validate Installation")," guide."))}h.isMDXComponent=!0},464:function(e,a,t){"use strict";t(466);var n=t(0),l=t.n(n),r=t(463),o=t.n(r);t(132);a.a=function(e){var a=e.children,t=e.classNames,n=e.fill,r=e.icon,c=e.type,s=null;switch(c){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return l.a.createElement("div",{className:o()(t,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:o()("feather","icon-"+(r||s))}),a)}},472:function(e,a,t){"use strict";var n=t(0),l=t.n(n),r=(t(463),t(471)),o=t.n(r);t(133);a.a=function(e){var a=e.children,t=e.headingDepth,r=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},u="https://github.com/qovery/documentation/issues/new?"+o.a.stringify(s),b=Object(n.useState)(null),i=b[0],p=b[1];return l.a.createElement("div",{className:"steps steps--h"+t},a,!r&&!i&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:u,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==i&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,a,t){"use strict";var n=t(1),l=(t(481),t(478),t(52),t(29),t(22),t(21),t(0)),r=t.n(l),o=t(483),c=t(463),s=t.n(c),u=t(471),b=t.n(u),i=t(482),p=37,d=39;function m(e){var a=e.block,t=e.centered,n=e.changeSelectedValue,l=e.className,o=e.handleKeydown,c=e.style,u=e.values,b=e.selectedValue,i=e.tabRefs;return r.a.createElement("div",{className:t?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",l,{"tabs--block":a}),style:c},u.map((function(e){var a=e.value,t=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===a,className:s()("tab-item",{"tab-item--active":b===a}),key:a,ref:function(e){return i.push(e)},onKeyDown:function(e){return o(i,e.target,e)},onFocus:function(){return n(a)},onClick:function(){return n(a)}},t)}))))}function y(e){var a=e.placeholder,t=e.selectedValue,n=e.changeSelectedValue,l=e.size,c=e.values,s=c;if(s[0].group){var u=_.groupBy(s,"group");s=Object.keys(u).map((function(e){return{label:e,options:u[e]}}))}return r.a.createElement(o.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:s,isClearable:t,placeholder:a,value:c.find((function(e){return e.value==t})),onChange:function(e){return n(e?e.value:null)}})}a.a=function(e){e.block,e.centered;var a=e.children,t=e.defaultValue,o=e.groupId,c=e.label,s=e.placeholder,u=e.select,h=e.size,v=(e.style,e.values),O=e.urlKey,j=Object(i.a)(),g=j.tabGroupChoices,f=j.setTabGroupChoices,w=Object(l.useState)(t),N=w[0],q=w[1];if(null!=o){var T=g[o];null!=T&&T!==N&&q(T)}var k=function(e){q(e),null!=o&&f(o,e)},Q=[],x=function(e,a,t){switch(t.keyCode){case d:!function(e,a){var t=e.indexOf(a)+1;e[t]?e[t].focus():e[0].focus()}(e,a);break;case p:!function(e,a){var t=e.indexOf(a)-1;e[t]?e[t].focus():e[e.length-1].focus()}(e,a)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&q(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),v.length>1&&(u?r.a.createElement(y,Object(n.a)({changeSelectedValue:k,handleKeydown:x,placeholder:s,selectedValue:N,size:h,tabRefs:Q},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:k,handleKeydown:x,selectedValue:N,tabRefs:Q},e)))),l.Children.toArray(a).filter((function(e){return e.props.value===N}))[0])}},479:function(e,a,t){"use strict";var n=t(0),l=t.n(n);a.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[174],{326:function(e,a,t){"use strict";t.r(a),t.d(a,"frontMatter",(function(){return i})),t.d(a,"metadata",(function(){return p})),t.d(a,"rightToc",(function(){return d})),t.d(a,"default",(function(){return h}));var n,l=t(1),r=t(9),o=(t(0),t(465)),c=t(478),s=t(472),u=t(464),b=t(477),i={last_modified_on:"2024-07-12",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your Scaleway Kubernetes Service (Kapsule) cluster"},p={id:"getting-started/install-qovery/scaleway/self-managed-cluster",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your Scaleway Kubernetes Service (Kapsule) cluster",source:"@site/docs/getting-started/install-qovery/scaleway/self-managed-cluster.md",permalink:"/docs/getting-started/install-qovery/scaleway/self-managed-cluster",sidebar:"docs",previous:{title:"FAQ",permalink:"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/faq"},next:{title:"Azure",permalink:"/docs/getting-started/install-qovery/azure"}},d=[{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Install Qovery on your Scaleway Kapsule cluster",id:"install-qovery-on-your-scaleway-kapsule-cluster",children:[]},{value:"What's Next?",id:"whats-next",children:[]}],m=(n="Assumption",function(e){return console.warn("Component "+n+" was not imported, exported, or provided by MDXProvider as global scope"),Object(o.b)("div",e)}),y={rightToc:d};function h(e){var a=e.components,t=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(l.a)({},y,t,{components:a,mdxType:"MDXLayout"}),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are not familiar with Kubernetes, we recommend you to use Qovery on a Managed Kubernetes cluster on ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/"}),"AWS"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/"}),"GCP"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/quickstart/"}),"Scaleway"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart/"}),"Azure"),", or contact us.")),Object(o.b)("p",null,"Qovery Self-Managed (or BYOK: Bring Your Own Kubernetes) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster.\nRead ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/blog/kubernetes-managed-by-qovery-vs-self-managed-byok"}),"this article")," to better understand the difference with the Managed Kubernetes by Qovery. In a nutshell, Qovery BYOK is for Kubernetes experts who want to manage their own Kubernetes cluster. In this version, Qovery does not manage the Kubernetes cluster for you."),Object(o.b)(u.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery automatically updates ",Object(o.b)("strong",{parentName:"p"},"ONLY")," the Qovery applications (agent, shell-agent etc..) via the Qovery Helm chart. With the self-managed offer it will be up to you to manage any dependency components (ingress, dns, logging...), making sure they run with the right version over time."),Object(o.b)("p",null,"The dependencies provided with the Qovery Helm chart are here to help you with the bootstrap, and are not maintained by Qovery. If you want to simplify the maintenance of your cluster, please look at ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/pricing/"}),"Qovery managed Kubernetes offer"),".")),Object(o.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(o.b)(m,{mdxType:"Assumption"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have a Scaleway Kapsule Kubernetes cluster up and running."),Object(o.b)("li",{parentName:"ul"},"You have a Scaleway Kapsule Kubernetes cluster with at least 4 CPUs and 8GB of RAM."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"kubectl")," installed and configured to access your Scaleway Kapsule Kubernetes cluster."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"helm")," installed."),Object(o.b)("li",{parentName:"ul"},"You have a Qovery account. If you don't have one, please sign up at ",Object(o.b)("a",Object(l.a)({parentName:"li"},{href:"https://start.qovery.com"}),"https://start.qovery.com")))),Object(o.b)("h2",{id:"install-qovery-on-your-scaleway-kapsule-cluster"},"Install Qovery on your Scaleway Kapsule cluster"),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Follow ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/local/"}),"this guide")," to try Qovery on your local machine.")),Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"automatic",placeholder:"Install Qovery",select:!1,size:null,values:[{group:"Install",label:"Automatic",value:"automatic"},{group:"Install",label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"automatic",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery CLI by running the following command:"),Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(c.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("p",null,"Authenticate with Qovery by running the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Scaleway Kapsule cluster:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"qovery cluster install\n")),Object(o.b)("p",null,"Respond to the prompts to install Qovery on your Scaleway Kapsule Kubernetes cluster."))))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://helm.sh"}),"Helm")," command line tool.")),Object(o.b)("li",null,Object(o.b)("p",null,"Add Qovery Helm repository."),Object(o.b)(u.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery Helm Chart is only available for users who have access to Qovery BYOK. ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/bring-your-own-kubernetes"}),"Request your access here"),".")),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm repo add qovery https://helm.qovery.com\nhelm repo update\n"))),Object(o.b)("li",null,Object(o.b)("p",null,"Login to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console"),", create a cluster of type ",Object(o.b)("inlineCode",{parentName:"p"},"Self-Managed"),". At the end of the flow you will be able to download the ",Object(o.b)("inlineCode",{parentName:"p"},"values.yaml")," file associated with this cluster.")),Object(o.b)("li",null,Object(o.b)("p",null,"Now you can customize your values.yaml file based on your need. Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),"."),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Make sure that all fields having value ",Object(o.b)("inlineCode",{parentName:"p"},"set-by-customer")," are filled.")),Object(o.b)("p",null,"Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Kubernetes cluster."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --wait --atomic --create-namespace -n qovery -f \\\n --set services.certificates.cert-manager-configs.enabled=false \\\n --set services.certificates.qovery-cert-manager-webhook.enabled=false \\\n --set services.qovery.qovery-cluster-agent.enabled=false \\\n --set services.qovery.qovery-engine.enabled=false \\\n qovery qovery/qovery\n")),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-n qovery"),": the namespace where Qovery and its dependencies will be installed"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"--set..."),": override (only for the first deployment time, if you want to use Cert-Manager) to let cert-manager install its CRDs"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-f your-values-file.yaml"),": the values file you've downloaded, overrided with the Qovery config and your custom config"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery/qovery"),": name of the chart to deploy"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery"),": name of the release")),Object(o.b)("p",null,"If you want to use Cert-Manager, you can remove the ",Object(o.b)("inlineCode",{parentName:"p"},"--set...")," for the future updates (or if already installed):"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --create-namespace -n qovery -f --wait --atomic qovery qovery/qovery\n"))))))),Object(o.b)("p",null,"That's it, you can now use Qovery on your Scaleway Kapsule cluster."),Object(o.b)("p",null,"Connect to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console")," to validate that Qovery is properly installed and start deploying your applications."),Object(o.b)("h2",{id:"whats-next"},"What's Next?"),Object(o.b)("p",null,"Now that you have Qovery installed on your Kubernetes cluster, you can check that Qovery is properly installed by following the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/validate-installation/"}),"Validate Installation")," guide."))}h.isMDXComponent=!0},464:function(e,a,t){"use strict";t(466);var n=t(0),l=t.n(n),r=t(463),o=t.n(r);t(132);a.a=function(e){var a=e.children,t=e.classNames,n=e.fill,r=e.icon,c=e.type,s=null;switch(c){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return l.a.createElement("div",{className:o()(t,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:o()("feather","icon-"+(r||s))}),a)}},472:function(e,a,t){"use strict";var n=t(0),l=t.n(n),r=(t(463),t(471)),o=t.n(r);t(133);a.a=function(e){var a=e.children,t=e.headingDepth,r=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},u="https://github.com/qovery/documentation/issues/new?"+o.a.stringify(s),b=Object(n.useState)(null),i=b[0],p=b[1];return l.a.createElement("div",{className:"steps steps--h"+t},a,!r&&!i&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:u,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==i&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,a,t){"use strict";var n=t(1),l=(t(480),t(479),t(52),t(29),t(22),t(21),t(0)),r=t.n(l),o=t(483),c=t(463),s=t.n(c),u=t(471),b=t.n(u),i=t(482),p=37,d=39;function m(e){var a=e.block,t=e.centered,n=e.changeSelectedValue,l=e.className,o=e.handleKeydown,c=e.style,u=e.values,b=e.selectedValue,i=e.tabRefs;return r.a.createElement("div",{className:t?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",l,{"tabs--block":a}),style:c},u.map((function(e){var a=e.value,t=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===a,className:s()("tab-item",{"tab-item--active":b===a}),key:a,ref:function(e){return i.push(e)},onKeyDown:function(e){return o(i,e.target,e)},onFocus:function(){return n(a)},onClick:function(){return n(a)}},t)}))))}function y(e){var a=e.placeholder,t=e.selectedValue,n=e.changeSelectedValue,l=e.size,c=e.values,s=c;if(s[0].group){var u=_.groupBy(s,"group");s=Object.keys(u).map((function(e){return{label:e,options:u[e]}}))}return r.a.createElement(o.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:s,isClearable:t,placeholder:a,value:c.find((function(e){return e.value==t})),onChange:function(e){return n(e?e.value:null)}})}a.a=function(e){e.block,e.centered;var a=e.children,t=e.defaultValue,o=e.groupId,c=e.label,s=e.placeholder,u=e.select,h=e.size,v=(e.style,e.values),O=e.urlKey,j=Object(i.a)(),g=j.tabGroupChoices,f=j.setTabGroupChoices,w=Object(l.useState)(t),N=w[0],q=w[1];if(null!=o){var T=g[o];null!=T&&T!==N&&q(T)}var k=function(e){q(e),null!=o&&f(o,e)},Q=[],x=function(e,a,t){switch(t.keyCode){case d:!function(e,a){var t=e.indexOf(a)+1;e[t]?e[t].focus():e[0].focus()}(e,a);break;case p:!function(e,a){var t=e.indexOf(a)-1;e[t]?e[t].focus():e[e.length-1].focus()}(e,a)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&q(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),v.length>1&&(u?r.a.createElement(y,Object(n.a)({changeSelectedValue:k,handleKeydown:x,placeholder:s,selectedValue:N,size:h,tabRefs:Q},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:k,handleKeydown:x,selectedValue:N,tabRefs:Q},e)))),l.Children.toArray(a).filter((function(e){return e.props.value===N}))[0])}},478:function(e,a,t){"use strict";var n=t(0),l=t.n(n);a.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/967beaa8.cdb4573b.js b/967beaa8.ff2272a1.js similarity index 99% rename from 967beaa8.cdb4573b.js rename to 967beaa8.ff2272a1.js index 1fea6c7c6f..5bcca5be8a 100644 --- a/967beaa8.cdb4573b.js +++ b/967beaa8.ff2272a1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[176],{328:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return u})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return d}));var a=n(1),r=n(9),o=(n(0),n(465)),l=n(464),i=(n(477),n(469)),c={last_modified_on:"2023-07-29",$schema:"/.meta/.schemas/guides.json",title:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws",readingTime:"3 min read",source:"@site/guides/tutorial/create-a-playground-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create a Playground Environment on AWS",truncated:!1,prevItem:{title:"Create a blazingly fast REST API in Rust (Part 1/2)",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1"},nextItem:{title:"Create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws"}},s=[{value:"Create your Playground Environment",id:"create-your-playground-environment",children:[]},{value:"Delete your Playground Environment",id:"delete-your-playground-environment",children:[]},{value:"Optional: Create a Playground Cluster",id:"optional-create-a-playground-cluster",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:s};function d(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"The Qovery Playground is another concept than creating a Playground Environment. ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/discover-learn-and-experience-the-qovery-playground-is-now-open"}),"Read more about the Qovery Playground"),".")),Object(o.b)("p",null,"A Playground Environment is an environment where you can do all your testing without impacting an existing environment."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments.jpg",alt:"Playground environments"})),Object(o.b)("p",null,"Here are some use cases where a playground environment is helpful for:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Experimenting"),": Test your code without the fear to break anything from your original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Benchmarking"),": You want to stress your application without affecting the original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Debugging"),": You have a bug in production that you want to reproduce but without impacting the production environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Product Demo"),": Your Sales or Product Manager needs to make an important demo and want to be sure it will work.")),Object(o.b)(i.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(o.b)("p",null,"In this guide, we will create a playground environment on AWS."),Object(o.b)(l.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Quick Tip: Creating a playground environment results in using the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature to duplicate it! Nothing more.")),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/90cc74349adb42bc9630fb546886b586",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"create-your-playground-environment"},"Create your Playground Environment"),Object(o.b)("p",null,"To create your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the base environment that you want to clone"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Clone")," button"),Object(o.b)("li",{parentName:"ol"},"Enter a name for your playground environment"),Object(o.b)("li",{parentName:"ol"},"Select the cluster where you want to deploy it"),Object(o.b)("li",{parentName:"ol"},"Set the Environment mode to ",Object(o.b)("inlineCode",{parentName:"li"},"Development")),Object(o.b)("li",{parentName:"ol"},"Click on the Create button"),Object(o.b)("li",{parentName:"ol"},"Deploy your Playground Environment")),Object(o.b)("p",null,"Once deployed, your applications within this environment will have dedicated URLs to get access to. You can use these URLs to test your application."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/48290a88f2294b6f9c371879c2d25cdc",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Then you can check that your playground environment is working by visiting the temporary URL."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/3531b538f4ed47b49a1078303210da83",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"delete-your-playground-environment"},"Delete your Playground Environment"),Object(o.b)("p",null,"To delete your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the playground environment"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Delete")," button"),Object(o.b)("li",{parentName:"ol"},"Confirm and Delete the environment")),Object(o.b)("p",null,"All the resources will be freed."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/951d93f22bbb45aba4a2162104fcdcd9",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"optional-create-a-playground-cluster"},"Optional: Create a Playground Cluster"),Object(o.b)("p",null,"To prevent your playground environment from impacting your production environment, you can create a dedicated cluster. So every playground environments will be on the same cluster and will not disturb your production."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments_with_2_clusters.jpg",alt:"Playground environments with 2 clusters"})),Object(o.b)("p",null,"Here is how to create a playground cluster."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7cea821edfb7447a928dd707a7d428b5",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"And how to create a playground environment on our ",Object(o.b)("inlineCode",{parentName:"p"},"playground cluster"),"."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/82ccf107e3374c08a9f6b629451ef736",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),o=n(463),l=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(n,"alert","alert--"+i,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),o=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),r=(n(481),n(478),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),l=n(483),i=n(463),c=n.n(i),u=n(471),s=n.n(u),b=n(482),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,u=e.values,s=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},u.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var u=_.groupBy(c,"group");c=Object.keys(u).map((function(e){return{label:e,options:u[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:i.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,u=e.select,y=e.size,h=(e.style,e.values),f=e.urlKey,v=Object(b.a)(),w=v.tabGroupChoices,O=v.setTabGroupChoices,j=Object(r.useState)(n),N=j[0],k=j[1];if(null!=l){var C=w[l];null!=C&&C!==N&&k(C)}var E=function(e){k(e),null!=l&&O(l,e)},P=[],S=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=s.a.parse(window.location.search);e[f]&&k(e[f])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),h.length>1&&(u?o.a.createElement(g,Object(a.a)({changeSelectedValue:E,handleKeydown:S,placeholder:c,selectedValue:N,size:y,tabRefs:P},e)):o.a.createElement(p,Object(a.a)({changeSelectedValue:E,handleKeydown:S,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[176],{328:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return u})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return d}));var a=n(1),r=n(9),o=(n(0),n(465)),l=n(464),i=(n(477),n(469)),c={last_modified_on:"2023-07-29",$schema:"/.meta/.schemas/guides.json",title:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws",readingTime:"3 min read",source:"@site/guides/tutorial/create-a-playground-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create a Playground Environment on AWS",truncated:!1,prevItem:{title:"Create a blazingly fast REST API in Rust (Part 1/2)",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1"},nextItem:{title:"Create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws"}},s=[{value:"Create your Playground Environment",id:"create-your-playground-environment",children:[]},{value:"Delete your Playground Environment",id:"delete-your-playground-environment",children:[]},{value:"Optional: Create a Playground Cluster",id:"optional-create-a-playground-cluster",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:s};function d(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"The Qovery Playground is another concept than creating a Playground Environment. ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/discover-learn-and-experience-the-qovery-playground-is-now-open"}),"Read more about the Qovery Playground"),".")),Object(o.b)("p",null,"A Playground Environment is an environment where you can do all your testing without impacting an existing environment."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments.jpg",alt:"Playground environments"})),Object(o.b)("p",null,"Here are some use cases where a playground environment is helpful for:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Experimenting"),": Test your code without the fear to break anything from your original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Benchmarking"),": You want to stress your application without affecting the original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Debugging"),": You have a bug in production that you want to reproduce but without impacting the production environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Product Demo"),": Your Sales or Product Manager needs to make an important demo and want to be sure it will work.")),Object(o.b)(i.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(o.b)("p",null,"In this guide, we will create a playground environment on AWS."),Object(o.b)(l.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Quick Tip: Creating a playground environment results in using the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature to duplicate it! Nothing more.")),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/90cc74349adb42bc9630fb546886b586",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"create-your-playground-environment"},"Create your Playground Environment"),Object(o.b)("p",null,"To create your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the base environment that you want to clone"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Clone")," button"),Object(o.b)("li",{parentName:"ol"},"Enter a name for your playground environment"),Object(o.b)("li",{parentName:"ol"},"Select the cluster where you want to deploy it"),Object(o.b)("li",{parentName:"ol"},"Set the Environment mode to ",Object(o.b)("inlineCode",{parentName:"li"},"Development")),Object(o.b)("li",{parentName:"ol"},"Click on the Create button"),Object(o.b)("li",{parentName:"ol"},"Deploy your Playground Environment")),Object(o.b)("p",null,"Once deployed, your applications within this environment will have dedicated URLs to get access to. You can use these URLs to test your application."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/48290a88f2294b6f9c371879c2d25cdc",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Then you can check that your playground environment is working by visiting the temporary URL."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/3531b538f4ed47b49a1078303210da83",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"delete-your-playground-environment"},"Delete your Playground Environment"),Object(o.b)("p",null,"To delete your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the playground environment"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Delete")," button"),Object(o.b)("li",{parentName:"ol"},"Confirm and Delete the environment")),Object(o.b)("p",null,"All the resources will be freed."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/951d93f22bbb45aba4a2162104fcdcd9",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"optional-create-a-playground-cluster"},"Optional: Create a Playground Cluster"),Object(o.b)("p",null,"To prevent your playground environment from impacting your production environment, you can create a dedicated cluster. So every playground environments will be on the same cluster and will not disturb your production."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments_with_2_clusters.jpg",alt:"Playground environments with 2 clusters"})),Object(o.b)("p",null,"Here is how to create a playground cluster."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7cea821edfb7447a928dd707a7d428b5",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"And how to create a playground environment on our ",Object(o.b)("inlineCode",{parentName:"p"},"playground cluster"),"."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/82ccf107e3374c08a9f6b629451ef736",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),o=n(463),l=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(n,"alert","alert--"+i,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),o=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},477:function(e,t,n){"use strict";var a=n(1),r=(n(480),n(479),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),l=n(483),i=n(463),c=n.n(i),u=n(471),s=n.n(u),b=n(482),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,u=e.values,s=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},u.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var u=_.groupBy(c,"group");c=Object.keys(u).map((function(e){return{label:e,options:u[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:i.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,u=e.select,y=e.size,h=(e.style,e.values),f=e.urlKey,v=Object(b.a)(),w=v.tabGroupChoices,O=v.setTabGroupChoices,j=Object(r.useState)(n),N=j[0],k=j[1];if(null!=l){var C=w[l];null!=C&&C!==N&&k(C)}var E=function(e){k(e),null!=l&&O(l,e)},P=[],S=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=s.a.parse(window.location.search);e[f]&&k(e[f])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),h.length>1&&(u?o.a.createElement(g,Object(a.a)({changeSelectedValue:E,handleKeydown:S,placeholder:c,selectedValue:N,size:y,tabRefs:P},e)):o.a.createElement(p,Object(a.a)({changeSelectedValue:E,handleKeydown:S,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file diff --git a/9d099993.927f0447.js b/9d099993.5ae5fb89.js similarity index 99% rename from 9d099993.927f0447.js rename to 9d099993.5ae5fb89.js index 0b1e2fe46a..103508dbb4 100644 --- a/9d099993.927f0447.js +++ b/9d099993.5ae5fb89.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[181],{333:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return i})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return d})),a.d(t,"default",(function(){return h}));var n,l=a(1),r=a(9),o=(a(0),a(465)),c=a(479),s=a(472),b=a(464),u=a(477),i={last_modified_on:"2024-07-12",title:"Quickstart",description:"Learn how to install and configure Qovery on your own Kubernetes cluster (BYOK) / Self-managed Kubernetes cluster"},p={id:"getting-started/install-qovery/kubernetes/quickstart",title:"Quickstart",description:"Learn how to install and configure Qovery on your own Kubernetes cluster (BYOK) / Self-managed Kubernetes cluster",source:"@site/docs/getting-started/install-qovery/kubernetes/quickstart.md",permalink:"/docs/getting-started/install-qovery/kubernetes/quickstart",sidebar:"docs",previous:{title:"Kubernetes",permalink:"/docs/getting-started/install-qovery/kubernetes"},next:{title:"Configuration",permalink:"/docs/getting-started/install-qovery/kubernetes/byok-config"}},d=[{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Install Qovery on your Kubernetes cluster",id:"install-qovery-on-your-kubernetes-cluster",children:[]},{value:"What's Next?",id:"whats-next",children:[]}],m=(n="Assumption",function(e){return console.warn("Component "+n+" was not imported, exported, or provided by MDXProvider as global scope"),Object(o.b)("div",e)}),y={rightToc:d};function h(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(l.a)({},y,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are not familiar with Kubernetes, we recommend you to use Qovery on a Managed Kubernetes cluster on ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/"}),"AWS"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/"}),"GCP"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/quickstart/"}),"Scaleway"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart/"}),"Azure"),", or contact us.")),Object(o.b)("p",null,"Qovery Self-Managed (or BYOK: Bring Your Own Kubernetes) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster.\nRead ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/blog/kubernetes-managed-by-qovery-vs-self-managed-byok"}),"this article")," to better understand the difference with the Managed Kubernetes by Qovery. In a nutshell, Qovery BYOK is for Kubernetes experts who want to manage their own Kubernetes cluster. In this version, Qovery does not manage the Kubernetes cluster for you."),Object(o.b)(b.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery automatically updates ",Object(o.b)("strong",{parentName:"p"},"ONLY")," the Qovery applications (agent, shell-agent etc..) via the Qovery Helm chart. With the self-managed offer it will be up to you to manage any dependency components (ingress, dns, logging...), making sure they run with the right version over time."),Object(o.b)("p",null,"The dependencies provided with the Qovery Helm chart are here to help you with the bootstrap, and are not maintained by Qovery. If you want to simplify the maintenance of your cluster, please look at ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/pricing/"}),"Qovery managed Kubernetes offer"),".")),Object(o.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(o.b)(m,{mdxType:"Assumption"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have a Kubernetes Kubernetes cluster up and running."),Object(o.b)("li",{parentName:"ul"},"You have a Kubernetes Kubernetes cluster with at least 4 CPUs and 8GB of RAM."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"kubectl")," installed and configured to access your Kubernetes Kubernetes cluster."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"helm")," installed."),Object(o.b)("li",{parentName:"ul"},"You have a Qovery account. If you don't have one, please sign up at ",Object(o.b)("a",Object(l.a)({parentName:"li"},{href:"https://start.qovery.com"}),"https://start.qovery.com")))),Object(o.b)("h2",{id:"install-qovery-on-your-kubernetes-cluster"},"Install Qovery on your Kubernetes cluster"),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Follow ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/local/"}),"this guide")," to try Qovery on your local machine.")),Object(o.b)(u.a,{centered:!0,className:"rounded",defaultValue:"automatic",placeholder:"Install Qovery",select:!1,size:null,values:[{group:"Install",label:"Automatic",value:"automatic"},{group:"Install",label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"automatic",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery CLI by running the following command:"),Object(o.b)(u.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(u.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(u.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(c.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(u.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("p",null,"Authenticate with Qovery by running the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Kubernetes cluster:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"qovery cluster install\n")),Object(o.b)("p",null,"Respond to the prompts to install Qovery on your Kubernetes Kubernetes cluster."))))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://helm.sh"}),"Helm")," command line tool.")),Object(o.b)("li",null,Object(o.b)("p",null,"Add Qovery Helm repository."),Object(o.b)(b.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery Helm Chart is only available for users who have access to Qovery BYOK. ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/bring-your-own-kubernetes"}),"Request your access here"),".")),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm repo add qovery https://helm.qovery.com\nhelm repo update\n"))),Object(o.b)("li",null,Object(o.b)("p",null,"Login to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console"),", create a cluster of type ",Object(o.b)("inlineCode",{parentName:"p"},"Self-Managed"),". At the end of the flow you will be able to download the ",Object(o.b)("inlineCode",{parentName:"p"},"values.yaml")," file associated with this cluster.")),Object(o.b)("li",null,Object(o.b)("p",null,"Now you can customize your values.yaml file based on your need. Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),"."),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Make sure that all fields having value ",Object(o.b)("inlineCode",{parentName:"p"},"set-by-customer")," are filled.")),Object(o.b)("p",null,"Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Kubernetes cluster."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --wait --atomic --create-namespace -n qovery -f \\\n --set services.certificates.cert-manager-configs.enabled=false \\\n --set services.certificates.qovery-cert-manager-webhook.enabled=false \\\n --set services.qovery.qovery-cluster-agent.enabled=false \\\n --set services.qovery.qovery-engine.enabled=false \\\n qovery qovery/qovery\n")),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-n qovery"),": the namespace where Qovery and its dependencies will be installed"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"--set..."),": override (only for the first deployment time, if you want to use Cert-Manager) to let cert-manager install its CRDs"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-f your-values-file.yaml"),": the values file you've downloaded, overrided with the Qovery config and your custom config"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery/qovery"),": name of the chart to deploy"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery"),": name of the release")),Object(o.b)("p",null,"If you want to use Cert-Manager, you can remove the ",Object(o.b)("inlineCode",{parentName:"p"},"--set...")," for the future updates (or if already installed):"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --create-namespace -n qovery -f --wait --atomic qovery qovery/qovery\n"))))))),Object(o.b)("p",null,"That's it, you can now use Qovery on your Kubernetes cluster."),Object(o.b)("p",null,"Connect to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console")," to validate that Qovery is properly installed and start deploying your applications."),Object(o.b)("h2",{id:"whats-next"},"What's Next?"),Object(o.b)("p",null,"Now that you have Qovery installed on your Kubernetes cluster, you can check that Qovery is properly installed by following the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/validate-installation/"}),"Validate Installation")," guide."))}h.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),l=a.n(n),r=a(463),o=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,s=null;switch(c){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return l.a.createElement("div",{className:o()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:o()("feather","icon-"+(r||s))}),t)}},472:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(463),a(471)),o=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},b="https://github.com/qovery/documentation/issues/new?"+o.a.stringify(s),u=Object(n.useState)(null),i=u[0],p=u[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!i&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:b,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==i&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,t,a){"use strict";var n=a(1),l=(a(481),a(478),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),o=a(483),c=a(463),s=a.n(c),b=a(471),u=a.n(b),i=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,o=e.handleKeydown,c=e.style,b=e.values,u=e.selectedValue,i=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",l,{"tabs--block":t}),style:c},b.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:s()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return i.push(e)},onKeyDown:function(e){return o(i,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function y(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,c=e.values,s=c;if(s[0].group){var b=_.groupBy(s,"group");s=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return r.a.createElement(o.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:s,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,o=e.groupId,c=e.label,s=e.placeholder,b=e.select,h=e.size,v=(e.style,e.values),O=e.urlKey,j=Object(i.a)(),g=j.tabGroupChoices,f=j.setTabGroupChoices,w=Object(l.useState)(a),N=w[0],q=w[1];if(null!=o){var k=g[o];null!=k&&k!==N&&q(k)}var T=function(e){q(e),null!=o&&f(o,e)},Q=[],x=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=u.a.parse(window.location.search);e[O]&&q(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),v.length>1&&(b?r.a.createElement(y,Object(n.a)({changeSelectedValue:T,handleKeydown:x,placeholder:s,selectedValue:N,size:h,tabRefs:Q},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:T,handleKeydown:x,selectedValue:N,tabRefs:Q},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},479:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[181],{333:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return i})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return d})),a.d(t,"default",(function(){return h}));var n,l=a(1),r=a(9),o=(a(0),a(465)),c=a(478),s=a(472),b=a(464),u=a(477),i={last_modified_on:"2024-07-12",title:"Quickstart",description:"Learn how to install and configure Qovery on your own Kubernetes cluster (BYOK) / Self-managed Kubernetes cluster"},p={id:"getting-started/install-qovery/kubernetes/quickstart",title:"Quickstart",description:"Learn how to install and configure Qovery on your own Kubernetes cluster (BYOK) / Self-managed Kubernetes cluster",source:"@site/docs/getting-started/install-qovery/kubernetes/quickstart.md",permalink:"/docs/getting-started/install-qovery/kubernetes/quickstart",sidebar:"docs",previous:{title:"Kubernetes",permalink:"/docs/getting-started/install-qovery/kubernetes"},next:{title:"Configuration",permalink:"/docs/getting-started/install-qovery/kubernetes/byok-config"}},d=[{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Install Qovery on your Kubernetes cluster",id:"install-qovery-on-your-kubernetes-cluster",children:[]},{value:"What's Next?",id:"whats-next",children:[]}],m=(n="Assumption",function(e){return console.warn("Component "+n+" was not imported, exported, or provided by MDXProvider as global scope"),Object(o.b)("div",e)}),y={rightToc:d};function h(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(l.a)({},y,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are not familiar with Kubernetes, we recommend you to use Qovery on a Managed Kubernetes cluster on ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/"}),"AWS"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/"}),"GCP"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/quickstart/"}),"Scaleway"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart/"}),"Azure"),", or contact us.")),Object(o.b)("p",null,"Qovery Self-Managed (or BYOK: Bring Your Own Kubernetes) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster.\nRead ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/blog/kubernetes-managed-by-qovery-vs-self-managed-byok"}),"this article")," to better understand the difference with the Managed Kubernetes by Qovery. In a nutshell, Qovery BYOK is for Kubernetes experts who want to manage their own Kubernetes cluster. In this version, Qovery does not manage the Kubernetes cluster for you."),Object(o.b)(b.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery automatically updates ",Object(o.b)("strong",{parentName:"p"},"ONLY")," the Qovery applications (agent, shell-agent etc..) via the Qovery Helm chart. With the self-managed offer it will be up to you to manage any dependency components (ingress, dns, logging...), making sure they run with the right version over time."),Object(o.b)("p",null,"The dependencies provided with the Qovery Helm chart are here to help you with the bootstrap, and are not maintained by Qovery. If you want to simplify the maintenance of your cluster, please look at ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/pricing/"}),"Qovery managed Kubernetes offer"),".")),Object(o.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(o.b)(m,{mdxType:"Assumption"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have a Kubernetes Kubernetes cluster up and running."),Object(o.b)("li",{parentName:"ul"},"You have a Kubernetes Kubernetes cluster with at least 4 CPUs and 8GB of RAM."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"kubectl")," installed and configured to access your Kubernetes Kubernetes cluster."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"helm")," installed."),Object(o.b)("li",{parentName:"ul"},"You have a Qovery account. If you don't have one, please sign up at ",Object(o.b)("a",Object(l.a)({parentName:"li"},{href:"https://start.qovery.com"}),"https://start.qovery.com")))),Object(o.b)("h2",{id:"install-qovery-on-your-kubernetes-cluster"},"Install Qovery on your Kubernetes cluster"),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Follow ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/local/"}),"this guide")," to try Qovery on your local machine.")),Object(o.b)(u.a,{centered:!0,className:"rounded",defaultValue:"automatic",placeholder:"Install Qovery",select:!1,size:null,values:[{group:"Install",label:"Automatic",value:"automatic"},{group:"Install",label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"automatic",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery CLI by running the following command:"),Object(o.b)(u.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(u.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(u.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(c.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(u.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("p",null,"Authenticate with Qovery by running the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Kubernetes cluster:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"qovery cluster install\n")),Object(o.b)("p",null,"Respond to the prompts to install Qovery on your Kubernetes Kubernetes cluster."))))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://helm.sh"}),"Helm")," command line tool.")),Object(o.b)("li",null,Object(o.b)("p",null,"Add Qovery Helm repository."),Object(o.b)(b.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery Helm Chart is only available for users who have access to Qovery BYOK. ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/bring-your-own-kubernetes"}),"Request your access here"),".")),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm repo add qovery https://helm.qovery.com\nhelm repo update\n"))),Object(o.b)("li",null,Object(o.b)("p",null,"Login to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console"),", create a cluster of type ",Object(o.b)("inlineCode",{parentName:"p"},"Self-Managed"),". At the end of the flow you will be able to download the ",Object(o.b)("inlineCode",{parentName:"p"},"values.yaml")," file associated with this cluster.")),Object(o.b)("li",null,Object(o.b)("p",null,"Now you can customize your values.yaml file based on your need. Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),"."),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Make sure that all fields having value ",Object(o.b)("inlineCode",{parentName:"p"},"set-by-customer")," are filled.")),Object(o.b)("p",null,"Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Kubernetes cluster."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --wait --atomic --create-namespace -n qovery -f \\\n --set services.certificates.cert-manager-configs.enabled=false \\\n --set services.certificates.qovery-cert-manager-webhook.enabled=false \\\n --set services.qovery.qovery-cluster-agent.enabled=false \\\n --set services.qovery.qovery-engine.enabled=false \\\n qovery qovery/qovery\n")),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-n qovery"),": the namespace where Qovery and its dependencies will be installed"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"--set..."),": override (only for the first deployment time, if you want to use Cert-Manager) to let cert-manager install its CRDs"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-f your-values-file.yaml"),": the values file you've downloaded, overrided with the Qovery config and your custom config"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery/qovery"),": name of the chart to deploy"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery"),": name of the release")),Object(o.b)("p",null,"If you want to use Cert-Manager, you can remove the ",Object(o.b)("inlineCode",{parentName:"p"},"--set...")," for the future updates (or if already installed):"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --create-namespace -n qovery -f --wait --atomic qovery qovery/qovery\n"))))))),Object(o.b)("p",null,"That's it, you can now use Qovery on your Kubernetes cluster."),Object(o.b)("p",null,"Connect to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console")," to validate that Qovery is properly installed and start deploying your applications."),Object(o.b)("h2",{id:"whats-next"},"What's Next?"),Object(o.b)("p",null,"Now that you have Qovery installed on your Kubernetes cluster, you can check that Qovery is properly installed by following the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/validate-installation/"}),"Validate Installation")," guide."))}h.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),l=a.n(n),r=a(463),o=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,s=null;switch(c){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return l.a.createElement("div",{className:o()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:o()("feather","icon-"+(r||s))}),t)}},472:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(463),a(471)),o=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},b="https://github.com/qovery/documentation/issues/new?"+o.a.stringify(s),u=Object(n.useState)(null),i=u[0],p=u[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!i&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:b,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==i&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,t,a){"use strict";var n=a(1),l=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),o=a(483),c=a(463),s=a.n(c),b=a(471),u=a.n(b),i=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,o=e.handleKeydown,c=e.style,b=e.values,u=e.selectedValue,i=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",l,{"tabs--block":t}),style:c},b.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:s()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return i.push(e)},onKeyDown:function(e){return o(i,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function y(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,c=e.values,s=c;if(s[0].group){var b=_.groupBy(s,"group");s=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return r.a.createElement(o.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:s,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,o=e.groupId,c=e.label,s=e.placeholder,b=e.select,h=e.size,v=(e.style,e.values),O=e.urlKey,j=Object(i.a)(),g=j.tabGroupChoices,f=j.setTabGroupChoices,w=Object(l.useState)(a),N=w[0],q=w[1];if(null!=o){var k=g[o];null!=k&&k!==N&&q(k)}var T=function(e){q(e),null!=o&&f(o,e)},Q=[],x=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=u.a.parse(window.location.search);e[O]&&q(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),v.length>1&&(b?r.a.createElement(y,Object(n.a)({changeSelectedValue:T,handleKeydown:x,placeholder:s,selectedValue:N,size:h,tabRefs:Q},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:T,handleKeydown:x,selectedValue:N,tabRefs:Q},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},478:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/ab1ec509.d0ff3814.js b/ab1ec509.282b41c5.js similarity index 99% rename from ab1ec509.d0ff3814.js rename to ab1ec509.282b41c5.js index b365da6c0f..e4d798cd2a 100644 --- a/ab1ec509.d0ff3814.js +++ b/ab1ec509.282b41c5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[199],{351:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return u})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return d})),a.d(t,"default",(function(){return h}));var n,l=a(1),r=a(9),o=(a(0),a(465)),c=a(479),s=a(472),b=a(464),i=a(477),u={last_modified_on:"2024-07-12",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your AWS Kubernetes Service (EKS) cluster"},p={id:"getting-started/install-qovery/aws/self-managed-cluster",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your AWS Kubernetes Service (EKS) cluster",source:"@site/docs/getting-started/install-qovery/aws/self-managed-cluster.md",permalink:"/docs/getting-started/install-qovery/aws/self-managed-cluster",sidebar:"docs",previous:{title:"FAQ",permalink:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/faq"},next:{title:"GCP",permalink:"/docs/getting-started/install-qovery/gcp"}},d=[{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Install Qovery on your AWS EKS cluster",id:"install-qovery-on-your-aws-eks-cluster",children:[]},{value:"What's Next?",id:"whats-next",children:[]}],m=(n="Assumption",function(e){return console.warn("Component "+n+" was not imported, exported, or provided by MDXProvider as global scope"),Object(o.b)("div",e)}),y={rightToc:d};function h(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(l.a)({},y,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are not familiar with Kubernetes, we recommend you to use Qovery on a Managed Kubernetes cluster on ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/"}),"AWS"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/"}),"GCP"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/quickstart/"}),"Scaleway"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart/"}),"Azure"),", or contact us.")),Object(o.b)("p",null,"Qovery Self-Managed (or BYOK: Bring Your Own Kubernetes) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster.\nRead ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/blog/kubernetes-managed-by-qovery-vs-self-managed-byok"}),"this article")," to better understand the difference with the Managed Kubernetes by Qovery. In a nutshell, Qovery BYOK is for Kubernetes experts who want to manage their own Kubernetes cluster. In this version, Qovery does not manage the Kubernetes cluster for you."),Object(o.b)(b.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery automatically updates ",Object(o.b)("strong",{parentName:"p"},"ONLY")," the Qovery applications (agent, shell-agent etc..) via the Qovery Helm chart. With the self-managed offer it will be up to you to manage any dependency components (ingress, dns, logging...), making sure they run with the right version over time."),Object(o.b)("p",null,"The dependencies provided with the Qovery Helm chart are here to help you with the bootstrap, and are not maintained by Qovery. If you want to simplify the maintenance of your cluster, please look at ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/pricing/"}),"Qovery managed Kubernetes offer"),".")),Object(o.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(o.b)(m,{mdxType:"Assumption"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have a AWS EKS Kubernetes cluster up and running."),Object(o.b)("li",{parentName:"ul"},"You have a AWS EKS Kubernetes cluster with at least 4 CPUs and 8GB of RAM."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"kubectl")," installed and configured to access your AWS EKS Kubernetes cluster."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"helm")," installed."),Object(o.b)("li",{parentName:"ul"},"You have a Qovery account. If you don't have one, please sign up at ",Object(o.b)("a",Object(l.a)({parentName:"li"},{href:"https://start.qovery.com"}),"https://start.qovery.com")))),Object(o.b)("h2",{id:"install-qovery-on-your-aws-eks-cluster"},"Install Qovery on your AWS EKS cluster"),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Follow ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/local/"}),"this guide")," to try Qovery on your local machine.")),Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"automatic",placeholder:"Install Qovery",select:!1,size:null,values:[{group:"Install",label:"Automatic",value:"automatic"},{group:"Install",label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"automatic",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery CLI by running the following command:"),Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(c.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("p",null,"Authenticate with Qovery by running the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your AWS EKS cluster:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"qovery cluster install\n")),Object(o.b)("p",null,"Respond to the prompts to install Qovery on your AWS EKS Kubernetes cluster."))))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://helm.sh"}),"Helm")," command line tool.")),Object(o.b)("li",null,Object(o.b)("p",null,"Add Qovery Helm repository."),Object(o.b)(b.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery Helm Chart is only available for users who have access to Qovery BYOK. ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/bring-your-own-kubernetes"}),"Request your access here"),".")),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm repo add qovery https://helm.qovery.com\nhelm repo update\n"))),Object(o.b)("li",null,Object(o.b)("p",null,"Login to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console"),", create a cluster of type ",Object(o.b)("inlineCode",{parentName:"p"},"Self-Managed"),". At the end of the flow you will be able to download the ",Object(o.b)("inlineCode",{parentName:"p"},"values.yaml")," file associated with this cluster.")),Object(o.b)("li",null,Object(o.b)("p",null,"Now you can customize your values.yaml file based on your need. Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),"."),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Make sure that all fields having value ",Object(o.b)("inlineCode",{parentName:"p"},"set-by-customer")," are filled.")),Object(o.b)("p",null,"Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Kubernetes cluster."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --wait --atomic --create-namespace -n qovery -f \\\n --set services.certificates.cert-manager-configs.enabled=false \\\n --set services.certificates.qovery-cert-manager-webhook.enabled=false \\\n --set services.qovery.qovery-cluster-agent.enabled=false \\\n --set services.qovery.qovery-engine.enabled=false \\\n qovery qovery/qovery\n")),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-n qovery"),": the namespace where Qovery and its dependencies will be installed"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"--set..."),": override (only for the first deployment time, if you want to use Cert-Manager) to let cert-manager install its CRDs"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-f your-values-file.yaml"),": the values file you've downloaded, overrided with the Qovery config and your custom config"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery/qovery"),": name of the chart to deploy"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery"),": name of the release")),Object(o.b)("p",null,"If you want to use Cert-Manager, you can remove the ",Object(o.b)("inlineCode",{parentName:"p"},"--set...")," for the future updates (or if already installed):"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --create-namespace -n qovery -f --wait --atomic qovery qovery/qovery\n"))))))),Object(o.b)("p",null,"That's it, you can now use Qovery on your AWS EKS cluster."),Object(o.b)("p",null,"Connect to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console")," to validate that Qovery is properly installed and start deploying your applications."),Object(o.b)("h2",{id:"whats-next"},"What's Next?"),Object(o.b)("p",null,"Now that you have Qovery installed on your Kubernetes cluster, you can check that Qovery is properly installed by following the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/validate-installation/"}),"Validate Installation")," guide."))}h.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),l=a.n(n),r=a(463),o=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,s=null;switch(c){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return l.a.createElement("div",{className:o()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:o()("feather","icon-"+(r||s))}),t)}},472:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(463),a(471)),o=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},b="https://github.com/qovery/documentation/issues/new?"+o.a.stringify(s),i=Object(n.useState)(null),u=i[0],p=i[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!u&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:b,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,t,a){"use strict";var n=a(1),l=(a(481),a(478),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),o=a(483),c=a(463),s=a.n(c),b=a(471),i=a.n(b),u=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,o=e.handleKeydown,c=e.style,b=e.values,i=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",l,{"tabs--block":t}),style:c},b.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":i===t,className:s()("tab-item",{"tab-item--active":i===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return o(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function y(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,c=e.values,s=c;if(s[0].group){var b=_.groupBy(s,"group");s=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return r.a.createElement(o.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:s,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,o=e.groupId,c=e.label,s=e.placeholder,b=e.select,h=e.size,v=(e.style,e.values),O=e.urlKey,j=Object(u.a)(),g=j.tabGroupChoices,f=j.setTabGroupChoices,w=Object(l.useState)(a),N=w[0],q=w[1];if(null!=o){var T=g[o];null!=T&&T!==N&&q(T)}var k=function(e){q(e),null!=o&&f(o,e)},Q=[],x=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=i.a.parse(window.location.search);e[O]&&q(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),v.length>1&&(b?r.a.createElement(y,Object(n.a)({changeSelectedValue:k,handleKeydown:x,placeholder:s,selectedValue:N,size:h,tabRefs:Q},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:k,handleKeydown:x,selectedValue:N,tabRefs:Q},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},479:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[199],{351:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return u})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return d})),a.d(t,"default",(function(){return h}));var n,l=a(1),r=a(9),o=(a(0),a(465)),c=a(478),s=a(472),b=a(464),i=a(477),u={last_modified_on:"2024-07-12",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your AWS Kubernetes Service (EKS) cluster"},p={id:"getting-started/install-qovery/aws/self-managed-cluster",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your AWS Kubernetes Service (EKS) cluster",source:"@site/docs/getting-started/install-qovery/aws/self-managed-cluster.md",permalink:"/docs/getting-started/install-qovery/aws/self-managed-cluster",sidebar:"docs",previous:{title:"FAQ",permalink:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/faq"},next:{title:"GCP",permalink:"/docs/getting-started/install-qovery/gcp"}},d=[{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Install Qovery on your AWS EKS cluster",id:"install-qovery-on-your-aws-eks-cluster",children:[]},{value:"What's Next?",id:"whats-next",children:[]}],m=(n="Assumption",function(e){return console.warn("Component "+n+" was not imported, exported, or provided by MDXProvider as global scope"),Object(o.b)("div",e)}),y={rightToc:d};function h(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(l.a)({},y,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are not familiar with Kubernetes, we recommend you to use Qovery on a Managed Kubernetes cluster on ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/"}),"AWS"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/"}),"GCP"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/quickstart/"}),"Scaleway"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart/"}),"Azure"),", or contact us.")),Object(o.b)("p",null,"Qovery Self-Managed (or BYOK: Bring Your Own Kubernetes) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster.\nRead ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/blog/kubernetes-managed-by-qovery-vs-self-managed-byok"}),"this article")," to better understand the difference with the Managed Kubernetes by Qovery. In a nutshell, Qovery BYOK is for Kubernetes experts who want to manage their own Kubernetes cluster. In this version, Qovery does not manage the Kubernetes cluster for you."),Object(o.b)(b.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery automatically updates ",Object(o.b)("strong",{parentName:"p"},"ONLY")," the Qovery applications (agent, shell-agent etc..) via the Qovery Helm chart. With the self-managed offer it will be up to you to manage any dependency components (ingress, dns, logging...), making sure they run with the right version over time."),Object(o.b)("p",null,"The dependencies provided with the Qovery Helm chart are here to help you with the bootstrap, and are not maintained by Qovery. If you want to simplify the maintenance of your cluster, please look at ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/pricing/"}),"Qovery managed Kubernetes offer"),".")),Object(o.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(o.b)(m,{mdxType:"Assumption"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have a AWS EKS Kubernetes cluster up and running."),Object(o.b)("li",{parentName:"ul"},"You have a AWS EKS Kubernetes cluster with at least 4 CPUs and 8GB of RAM."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"kubectl")," installed and configured to access your AWS EKS Kubernetes cluster."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"helm")," installed."),Object(o.b)("li",{parentName:"ul"},"You have a Qovery account. If you don't have one, please sign up at ",Object(o.b)("a",Object(l.a)({parentName:"li"},{href:"https://start.qovery.com"}),"https://start.qovery.com")))),Object(o.b)("h2",{id:"install-qovery-on-your-aws-eks-cluster"},"Install Qovery on your AWS EKS cluster"),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Follow ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/local/"}),"this guide")," to try Qovery on your local machine.")),Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"automatic",placeholder:"Install Qovery",select:!1,size:null,values:[{group:"Install",label:"Automatic",value:"automatic"},{group:"Install",label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"automatic",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery CLI by running the following command:"),Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(c.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("p",null,"Authenticate with Qovery by running the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your AWS EKS cluster:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"qovery cluster install\n")),Object(o.b)("p",null,"Respond to the prompts to install Qovery on your AWS EKS Kubernetes cluster."))))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://helm.sh"}),"Helm")," command line tool.")),Object(o.b)("li",null,Object(o.b)("p",null,"Add Qovery Helm repository."),Object(o.b)(b.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery Helm Chart is only available for users who have access to Qovery BYOK. ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/bring-your-own-kubernetes"}),"Request your access here"),".")),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm repo add qovery https://helm.qovery.com\nhelm repo update\n"))),Object(o.b)("li",null,Object(o.b)("p",null,"Login to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console"),", create a cluster of type ",Object(o.b)("inlineCode",{parentName:"p"},"Self-Managed"),". At the end of the flow you will be able to download the ",Object(o.b)("inlineCode",{parentName:"p"},"values.yaml")," file associated with this cluster.")),Object(o.b)("li",null,Object(o.b)("p",null,"Now you can customize your values.yaml file based on your need. Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),"."),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Make sure that all fields having value ",Object(o.b)("inlineCode",{parentName:"p"},"set-by-customer")," are filled.")),Object(o.b)("p",null,"Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Kubernetes cluster."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --wait --atomic --create-namespace -n qovery -f \\\n --set services.certificates.cert-manager-configs.enabled=false \\\n --set services.certificates.qovery-cert-manager-webhook.enabled=false \\\n --set services.qovery.qovery-cluster-agent.enabled=false \\\n --set services.qovery.qovery-engine.enabled=false \\\n qovery qovery/qovery\n")),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-n qovery"),": the namespace where Qovery and its dependencies will be installed"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"--set..."),": override (only for the first deployment time, if you want to use Cert-Manager) to let cert-manager install its CRDs"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-f your-values-file.yaml"),": the values file you've downloaded, overrided with the Qovery config and your custom config"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery/qovery"),": name of the chart to deploy"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery"),": name of the release")),Object(o.b)("p",null,"If you want to use Cert-Manager, you can remove the ",Object(o.b)("inlineCode",{parentName:"p"},"--set...")," for the future updates (or if already installed):"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --create-namespace -n qovery -f --wait --atomic qovery qovery/qovery\n"))))))),Object(o.b)("p",null,"That's it, you can now use Qovery on your AWS EKS cluster."),Object(o.b)("p",null,"Connect to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console")," to validate that Qovery is properly installed and start deploying your applications."),Object(o.b)("h2",{id:"whats-next"},"What's Next?"),Object(o.b)("p",null,"Now that you have Qovery installed on your Kubernetes cluster, you can check that Qovery is properly installed by following the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/validate-installation/"}),"Validate Installation")," guide."))}h.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),l=a.n(n),r=a(463),o=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,s=null;switch(c){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return l.a.createElement("div",{className:o()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:o()("feather","icon-"+(r||s))}),t)}},472:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(463),a(471)),o=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},b="https://github.com/qovery/documentation/issues/new?"+o.a.stringify(s),i=Object(n.useState)(null),u=i[0],p=i[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!u&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:b,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,t,a){"use strict";var n=a(1),l=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),o=a(483),c=a(463),s=a.n(c),b=a(471),i=a.n(b),u=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,o=e.handleKeydown,c=e.style,b=e.values,i=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",l,{"tabs--block":t}),style:c},b.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":i===t,className:s()("tab-item",{"tab-item--active":i===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return o(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function y(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,c=e.values,s=c;if(s[0].group){var b=_.groupBy(s,"group");s=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return r.a.createElement(o.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:s,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,o=e.groupId,c=e.label,s=e.placeholder,b=e.select,h=e.size,v=(e.style,e.values),O=e.urlKey,j=Object(u.a)(),g=j.tabGroupChoices,f=j.setTabGroupChoices,w=Object(l.useState)(a),N=w[0],q=w[1];if(null!=o){var T=g[o];null!=T&&T!==N&&q(T)}var k=function(e){q(e),null!=o&&f(o,e)},Q=[],x=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=i.a.parse(window.location.search);e[O]&&q(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),v.length>1&&(b?r.a.createElement(y,Object(n.a)({changeSelectedValue:k,handleKeydown:x,placeholder:s,selectedValue:N,size:h,tabRefs:Q},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:k,handleKeydown:x,selectedValue:N,tabRefs:Q},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},478:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/ab8f5b83.1b10e5ba.js b/ab8f5b83.6290c1a3.js similarity index 99% rename from ab8f5b83.1b10e5ba.js rename to ab8f5b83.6290c1a3.js index 3a37ac5835..218b7caa6f 100644 --- a/ab8f5b83.1b10e5ba.js +++ b/ab8f5b83.6290c1a3.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[201],{353:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return p})),n.d(t,"metadata",(function(){return d})),n.d(t,"rightToc",(function(){return h})),n.d(t,"default",(function(){return g}));var a=n(1),r=n(9),o=(n(0),n(465)),i=n(464),l=n(473),s=n(472),c=n(477),b=n(479),u=n(469),p={last_modified_on:"2024-05-03",$schema:"/.meta/.schemas/guides.json",title:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: kotlin","database: postgresql"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",permalink:"/guides/tutorial/url-shortener-api-with-kotlin",readingTime:"14 min read",source:"@site/guides/tutorial/url-shortener-api-with-kotlin.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: kotlin",permalink:"/guides/tags/language-kotlin"},{label:"database: postgresql",permalink:"/guides/tags/database-postgresql"}],title:"URL Shortener API with Kotlin (Part 1/2)",truncated:!1,prevItem:{title:"Terraform",permalink:"/guides/advanced/terraform"},nextItem:{title:"Use an API gateway in front of multiple services",permalink:"/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services"}},h=[{value:"Introduction",id:"introduction",children:[]},{value:"What is a URL shortener?",id:"what-is-a-url-shortener",children:[]},{value:"Ktor principles",id:"ktor-principles",children:[{value:"Kotlin",id:"kotlin",children:[]},{value:"Functional programming",id:"functional-programming",children:[]},{value:"Asynchronous",id:"asynchronous",children:[]}]},{value:"HTTP Server",id:"http-server",children:[]},{value:"URL Encoder",id:"url-encoder",children:[{value:"Handle identifier collision",id:"handle-identifier-collision",children:[]}]},{value:"URL Decoder",id:"url-decoder",children:[]},{value:"Redirect",id:"redirect",children:[]},{value:"Stats: clicks over time",id:"stats-clicks-over-time",children:[]},{value:"Try the API",id:"try-the-api",children:[]},{value:"Connect to a PostgreSQL database with Exposed",id:"connect-to-a-postgresql-database-with-exposed",children:[]},{value:"Deploy in the Cloud with Qovery",id:"deploy-in-the-cloud-with-qovery",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Create an application",id:"create-an-application",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Connect to PostgreSQL",id:"connect-to-postgresql",children:[]},{value:"Deploy",id:"deploy",children:[]}]},{value:"Conclusion",id:"conclusion",children:[]}],m={rightToc:h};function g(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},m,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"The source code for this post can be found on this ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener"}),"github repo")),Object(o.b)("h2",{id:"introduction"},"Introduction"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://ktor.io/"}),"Ktor")," is a brand new micro-framework created by the Jetbrains team, and running over the JVM. Jetbrains are the authors of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/"}),"Kotlin")," - which is now the official programming language for Android, and one of the most popular programming language on the JVM. Kotlin is gaining popularity on server-side and multi-platform application development."),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Ktor is a framework for building asynchronous servers and clients in connected systems using the powerful Kotlin programming language.")),Object(o.b)("p",null,"In this article, you will learn:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"How to design a simple URL shortener."),Object(o.b)("li",{parentName:"ul"},"How to use the Ktor micro-framework with Kotlin"),Object(o.b)("li",{parentName:"ul"},"How to deploy a Ktor application")),Object(o.b)("p",null,"I have +4 years of experience using Spring, and I wanted to give a try to Ktor, which seems promising. Creating a URL shortener is an excellent way to start."),Object(o.b)("h2",{id:"what-is-a-url-shortener"},"What is a URL shortener?"),Object(o.b)("p",null,"A URL shortener is a simple tool that takes a long URL and turns it into a very short one"),Object(o.b)("p",null,Object(o.b)("img",Object(a.a)({parentName:"p"},{src:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655859bc2ae5c7371efa36_urlshortener%20image.png",alt:"Flow of URL shortening - from original URL to short URL"}))),Object(o.b)("p",null,"It is commonly used for 3 reasons:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Tracking clicks"),Object(o.b)("li",{parentName:"ul"},"Make URL much more concise."),Object(o.b)("li",{parentName:"ul"},"Hide original URL")),Object(o.b)("p",null,"One famous freemium provider is bit.ly (see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655a34bc2ae5452b1f124b_bitly.gif"}),"here"),")"),Object(o.b)("p",null,"In this article we will make a basic bit.ly like URL shortener. Let\u2019s go"),Object(o.b)("h2",{id:"ktor-principles"},"Ktor principles"),Object(o.b)("p",null,"Before starting I want to introduce the 3 main principles of Ktor."),Object(o.b)("h3",{id:"kotlin"},"Kotlin"),Object(o.b)("p",null,"Kotlin is the language used to develop on Ktor. It is an object-oriented and functional language. It is very stable and runs on the JVM. Kotlin is 100% interoperable with Java and allows you to benefit from its ecosystem (libraries, build system, etc.)."),Object(o.b)("h3",{id:"functional-programming"},"Functional programming"),Object(o.b)("p",null,"Ktor leverages the power of Kotlin and has a very functional approach. When writing code, everything seems obvious. It's very similar to what you can see on NodeJS. For me, coming from the Spring world, I find it very efficient to read and use."),Object(o.b)("h3",{id:"asynchronous"},"Asynchronous"),Object(o.b)("p",null,"Kotlin provides asynchronous code execution, thanks to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/docs/reference/coroutines-overview.html"}),"coroutines"),". Ktor exploits this feature to its full potential, and even if you have the impression that you are writing code in a blocking manner, this is not the case. Ktor makes your life easier."),Object(o.b)("h2",{id:"http-server"},"HTTP Server"),Object(o.b)("p",null,"Here is a complete and simple example of how to expose an HTTP server (",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080"}),"http://localhost:8080"),") with Ktor."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun main(args: Array): Unit = io.ktor.server.netty.EngineMain.main(args)\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n routing {\n get("/") {\n call.respondText("Hello World", contentType = ContentType.Text.Plain)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-encoder"},"URL Encoder"),Object(o.b)("p",null,"The URL encoder will translate an incoming address into a smaller URL. The idea is to provide an ID that will identify the final URL. Using a hash function is perfect for this operation. However, the operation is non-reversible, meaning you can\u2019t retrieve the final URL by the generated identifier."),Object(o.b)("p",null,"Function to transform a long URL into a shorter URL"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension\nfun String.encodeToID(): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(6)\n // return id\n return truncatedHashString\n}\n')),Object(o.b)("p",null,"We expose the function through the REST API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// Request object\ndata class Request(val url: String) {\n fun toResponse(): Response = Response(url, url.encodeToID())\n}\n\n// Response object\ndata class Response(val originalURL: String, private val id: String) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n enable(SerializationFeature.INDENT_OUTPUT)\n propertyNamingStrategy = PropertyNamingStrategy.SNAKE_CASE\n }\n }\n\n // Hash Table Response object by ID\n val responseByID = mutableMapOf()\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val retrievedResponse = responseByID[request.url.encodeToID()]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[request.url.encodeToID()] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h3",{id:"handle-identifier-collision"},"Handle identifier collision"),Object(o.b)("p",null,"Using a hash function makes no guarantee that it is not already being used. If it is in use, then you need to change it to another one. Note: even if the probability to have a collision is very low, you should handle this case."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension (function signature has changed)\nfun String.encodeToID(truncateLength: Int = 6): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(truncateLength)\n // return id\n return truncatedHashString\n}\n\n//...\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n // Hash Table Response object by id\n val responseByID = mutableMapOf()\n\n fun getIdentifier(url: String, truncateLength: Int = 6): String {\n val id = url.encodeToID()\n\n val retrievedResponse = responseByID[id]\n if (retrievedResponse?.originalURL != url) {\n // collision spotted !\n return getIdentifier(url, truncateLength + 1)\n }\n\n return id\n }\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val id = getID(request.url)\n val retrievedResponse = responseByID[id]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[id] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-decoder"},"URL Decoder"),Object(o.b)("p",null,"Decoding the URL is the process of returning the original URL from the short URL. This is the reverse operation made by the URL Encoder"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),"val shortURL = getShortURL(request.url)\nval retrievedResponse = responseByID[shortURL]\nretrievedResponse?.originalURL // return original URL or null\n")),Object(o.b)("h2",{id:"redirect"},"Redirect"),Object(o.b)("p",null,"When a user clicks on a short URL, the user is redirected to the final URL. HTTP protocol allows to do this naturally by returning a 302 status code and a redirection URL."),Object(o.b)("p",null,"With Ktor the redirection is as simple as calling a method with the final URL as a parameter."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'call.respondRedirect("https://www.qovery.com")\n')),Object(o.b)("p",null,"What we expect is that when the user visits ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080/fbc951"}),"http://localhost:8080/fbc951")," he is redirected to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"https://www.qovery.com"),". If the URL is incorrect then redirect to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.google.com"}),"https://www.google.com")),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n routing {\n get("/{id}") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respondRedirect("https://www.google.com")\n }\n\n log.debug("redirect to: $retrievedResponse")\n call.respondRedirect(retrievedResponse.originalURL)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"stats-clicks-over-time"},"Stats: clicks over time"),Object(o.b)("p",null,"Something that is really useful on products like bit.ly is the stats provided (click over time, referrers, country of visitors). Here is how to store click over time and make them available through the API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// added\ndata class Stat(val clicksOverTime: MutableList = mutableListOf())\n\n// Response object (modified with Stat)\ndata class Response(val originalURL: String, private val id: String, val stat: Stat = Stat()) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n // ...\n // add this line to return Date object as ISO8601 format\n disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)\n }\n }\n // ...\n routing {\n // ...\n get("/api/v1/url/{id}/stat") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respond(HttpStatusCode.NoContent)\n }\n\n call.respond(retrievedResponse.stat)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"try-the-api"},"Try the API"),Object(o.b)("p",null,"Run the application"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ ./gradlew run\n//...\n2020-03-12 09:28:08.150 [main] INFO Application - No ktor.deployment.watch patterns specified, automatic reload is not active\n2020-03-12 09:28:08.606 [main] INFO Application - Responding at http://0.0.0.0:8080\n")),Object(o.b)("p",null,"Then execute the commands"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'# generate a short URL\n$ curl -X POST -d \'{"url": "https://www.qovery.com"}\' -H "Content-type: application/json" "http://localhost:8080/api/v1/encode"\n{\n "original_url": "https://www.qovery.com",\n "stat": {\n "clicks_over_time": []\n },\n "short_url": "http://localhost:8080/fbc951"\n}\n\n# generate 4 fake clicks\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n\n# show stat\n$ curl -X GET \'http://localhost:8080/api/v1/url/fbc951/stat\'\n{\n "clicks_over_time": [\n "2020-03-11T21:10:52.354+0000",\n "2020-03-11T21:10:54.093+0000",\n "2020-03-11T21:12:34.987+0000",\n "2020-03-11T21:12:37.223+0000"\n ]\n}\n')),Object(o.b)("h2",{id:"connect-to-a-postgresql-database-with-exposed"},"Connect to a PostgreSQL database with Exposed"),Object(o.b)("p",null,"By storing the data in memory, we lose all the data every time the application restart. Which is problematic for running in production. To make the data persistent we will store it in a PostgreSQL database. We will have to add 1 new dependency - ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/JetBrains/Exposed"}),"Exposed"),". Exposed (with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/brettwooldridge/HikariCP"}),"Hikari Connection Pool"),") is a lightweight SQL library on top of JDBC driver for Kotlin. With exposed it is possible to access databases in two flavours: typesafe SQL wrapping DSL and lightweight Data Access Objects (DAO)."),Object(o.b)("p",null,"Add the dependencies to your build.gradle (or POM.xml)"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'repositories {\n jcenter()\n}\n\ndependencies {\n // Connection Pool and PostgreSQL driver\n implementation("com.zaxxer:HikariCP:3.4.2")\n implementation("org.postgresql:postgresql:42.2.11")\n\n // Exposed\n implementation("org.jetbrains.exposed:exposed-core:0.22.1")\n implementation("org.jetbrains.exposed:exposed-dao:0.22.1")\n implementation("org.jetbrains.exposed:exposed-jdbc:0.22.1")\n implementation("org.jetbrains.exposed:exposed-java-time:0.22.1")\n}\n')),Object(o.b)("p",null,"We need to have 2 distincts tables, one containing all the final URLs with their correspond identifier"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ResponseTable : Table("response") {\n val id = varchar("id", 32)\n val originalURL = varchar("original_url", 2048)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"And a second one with all the clicking points"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ClickOverTimeTable : Table("click_over_time") {\n val id = integer("id").autoIncrement()\n val clickDate = datetime("click_date")\n val response = reference("response_id", onDelete = ReferenceOption.CASCADE, refColumn = ResponseTable.id)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"We need to create the tables as defined above programmatically"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:postgresql://127.0.0.1:5432/exposed"\n username = "exposed"\n password = "exposed"\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n initDatabase()\n // ...\n}\n')),Object(o.b)("p",null,"We have to replace the Hash Table used to store the data by the PostgreSQL database (see the final code ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener/blob/with_postgresql/src/Application.kt"}),"here"),")"),Object(o.b)("h2",{id:"deploy-in-the-cloud-with-qovery"},"Deploy in the Cloud with Qovery"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery")," is going to help us to deploy the final application in the Cloud without the need to configure the CI/CD, network, security, load balancing, database and all the DevOps tasks"),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Qovery is a deployment platform that helps all developers to deploy their applications in the Cloud in just a few seconds")),Object(o.b)(u.a,{name:"tutorial",mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Your code need to be hosted on Github/Gitlab/Bitbucket"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"https://ktor.io/quickstart/quickstart/docker.html"}),"Package your Ktor application to build and run it on Docker")))),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://console.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.png",alt:"Qovery Sign-up page"}))))),Object(o.b)(b.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(b.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(b.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")))),Object(o.b)("h3",{id:"create-an-application"},"Create an application"),Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(o.b)("p",null,"To follow the guide, ",Object(o.b)("a",{href:"https://github.com/evoxmusic/ktor-url-shortener.git"},"you can fork and use our repository")),Object(o.b)("p",null,"Use the forked repository (and branch ",Object(o.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("p",null,"After the application is created: "),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"})),Object(o.b)("p",null,"This will expose your application and make accessible in the public internet.")))),Object(o.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(o.b)("p",null,"Create and deploy a new database."),Object(o.b)(i.a,{type:"warning",mdxType:"Alert"},"Name the new database **my-pql-db** to follow the guide flawlessly"),Object(o.b)("p",null,"To learn how to do it, you can ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"),"."),Object(o.b)("h3",{id:"connect-to-postgresql"},"Connect to PostgreSQL"),Object(o.b)("p",null,"Qovery add dynamically all required environment variables to connect to the database at the runtime of the container."),Object(o.b)("p",null,"You can list them all in ",Object(o.b)("strong",{parentName:"p"},"Environment Variables")," ",Object(o.b)("strong",{parentName:"p"},"Secrets")," section in your application overview, as described in ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"envs guide"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/db-envs.png",alt:"DB Secrets"})),Object(o.b)("p",null,"To use them:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:${System.getenv("QOVERY_DATABASE_MY_PQL_DB_CONNECTION_URI_WITHOUT_CREDENTIALS")}"\n username = System.getenv("QOVERY_DATABASE_MY_PQL_DB_USERNAME")\n password = System.getenv("QOVERY_DATABASE_MY_PQL_DB_PASSWORD")\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n')),Object(o.b)("h3",{id:"deploy"},"Deploy"),Object(o.b)("p",null,"To deploy your application and database, click ",Object(o.b)("strong",{parentName:"p"},"Action")," and ",Object(o.b)("strong",{parentName:"p"},"Deploy")," button in your environments list view:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",null,"To get public URL to the application, open application details and click on ",Object(o.b)("strong",{parentName:"p"},"Action")," ",Object(o.b)("strong",{parentName:"p"},"Open"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env-1.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/open-app.png",alt:"Kotlin URL Shortener"})),Object(o.b)("h2",{id:"conclusion"},"Conclusion"),Object(o.b)("p",null,"We have seen that creating an URL shortener API with Ktor and Kotlin is extremely simple. Connecting the application to PostgreSQL is very easy with the Exposed library. In just a few lines of code, the service is fully functional and can be deployed in production very quickly with the help of Qovery. In the next part, we will see how to create a web interface connecting to this API to convert our URLs without using the curl command."),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"Part 2"),": bind a web interface to the API - ","[link coming soon]"),Object(o.b)(l.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),o=n(463),i=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return r.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:i()("feather","icon-"+(o||s))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),o=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},470:function(e,t,n){"use strict";var a=n(1),r=n(0),o=n.n(r),i=n(39),l=n(474),s=n(20),c=n.n(s);t.a=function(e){var t,n=e.to,s=e.href,b=n||s,u=Object(l.a)(b),p=Object(r.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?o.a.createElement(i.b,Object(a.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var n,a;d&&e&&u&&(n=e,a=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:b})):o.a.createElement("a",Object(a.a)({},e,{href:b}))}},472:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(463),n(471)),i=n.n(o);n(133);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(s),b=Object(a.useState)(null),u=b[0],p=b[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!u&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=n(470),i=n(463),l=n.n(i);n(134);t.a=function(e){var t=e.children,n=e.className,a=e.badge,i=e.leftIcon,s=e.rightIcon,c=e.size,b=e.target,u=e.to,p=l()("jump-to","jump-to--"+c,n),d=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},i&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+i})),r.a.createElement("div",{className:"jump-to--main"},a?r.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return b?r.a.createElement("a",{href:u,target:b,className:p},d):r.a.createElement(o.a,{to:u,className:p},d)}},474:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},477:function(e,t,n){"use strict";var a=n(1),r=(n(481),n(478),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),i=n(483),l=n(463),s=n.n(l),c=n(471),b=n.n(c),u=n(482),p=37,d=39;function h(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",r,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function m(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return o.a.createElement(i.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,g=e.size,v=(e.style,e.values),j=e.urlKey,O=Object(u.a)(),f=O.tabGroupChoices,y=O.setTabGroupChoices,w=Object(r.useState)(n),N=w[0],k=w[1];if(null!=i){var T=f[i];null!=T&&T!==N&&k(T)}var R=function(e){k(e),null!=i&&y(i,e)},S=[],I=function(e,t,n){switch(n.keyCode){case d:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=b.a.parse(window.location.search);e[j]&&k(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(g||"md")},l&&o.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?o.a.createElement(m,Object(a.a)({changeSelectedValue:R,handleKeydown:I,placeholder:s,selectedValue:N,size:g,tabRefs:S},e)):o.a.createElement(h,Object(a.a)({changeSelectedValue:R,handleKeydown:I,selectedValue:N,tabRefs:S},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},479:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[201],{353:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return p})),n.d(t,"metadata",(function(){return d})),n.d(t,"rightToc",(function(){return h})),n.d(t,"default",(function(){return g}));var a=n(1),r=n(9),o=(n(0),n(465)),i=n(464),l=n(473),s=n(472),c=n(477),b=n(478),u=n(469),p={last_modified_on:"2024-05-03",$schema:"/.meta/.schemas/guides.json",title:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: kotlin","database: postgresql"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",permalink:"/guides/tutorial/url-shortener-api-with-kotlin",readingTime:"14 min read",source:"@site/guides/tutorial/url-shortener-api-with-kotlin.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: kotlin",permalink:"/guides/tags/language-kotlin"},{label:"database: postgresql",permalink:"/guides/tags/database-postgresql"}],title:"URL Shortener API with Kotlin (Part 1/2)",truncated:!1,prevItem:{title:"Terraform",permalink:"/guides/advanced/terraform"},nextItem:{title:"Use an API gateway in front of multiple services",permalink:"/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services"}},h=[{value:"Introduction",id:"introduction",children:[]},{value:"What is a URL shortener?",id:"what-is-a-url-shortener",children:[]},{value:"Ktor principles",id:"ktor-principles",children:[{value:"Kotlin",id:"kotlin",children:[]},{value:"Functional programming",id:"functional-programming",children:[]},{value:"Asynchronous",id:"asynchronous",children:[]}]},{value:"HTTP Server",id:"http-server",children:[]},{value:"URL Encoder",id:"url-encoder",children:[{value:"Handle identifier collision",id:"handle-identifier-collision",children:[]}]},{value:"URL Decoder",id:"url-decoder",children:[]},{value:"Redirect",id:"redirect",children:[]},{value:"Stats: clicks over time",id:"stats-clicks-over-time",children:[]},{value:"Try the API",id:"try-the-api",children:[]},{value:"Connect to a PostgreSQL database with Exposed",id:"connect-to-a-postgresql-database-with-exposed",children:[]},{value:"Deploy in the Cloud with Qovery",id:"deploy-in-the-cloud-with-qovery",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Create an application",id:"create-an-application",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Connect to PostgreSQL",id:"connect-to-postgresql",children:[]},{value:"Deploy",id:"deploy",children:[]}]},{value:"Conclusion",id:"conclusion",children:[]}],m={rightToc:h};function g(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},m,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"The source code for this post can be found on this ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener"}),"github repo")),Object(o.b)("h2",{id:"introduction"},"Introduction"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://ktor.io/"}),"Ktor")," is a brand new micro-framework created by the Jetbrains team, and running over the JVM. Jetbrains are the authors of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/"}),"Kotlin")," - which is now the official programming language for Android, and one of the most popular programming language on the JVM. Kotlin is gaining popularity on server-side and multi-platform application development."),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Ktor is a framework for building asynchronous servers and clients in connected systems using the powerful Kotlin programming language.")),Object(o.b)("p",null,"In this article, you will learn:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"How to design a simple URL shortener."),Object(o.b)("li",{parentName:"ul"},"How to use the Ktor micro-framework with Kotlin"),Object(o.b)("li",{parentName:"ul"},"How to deploy a Ktor application")),Object(o.b)("p",null,"I have +4 years of experience using Spring, and I wanted to give a try to Ktor, which seems promising. Creating a URL shortener is an excellent way to start."),Object(o.b)("h2",{id:"what-is-a-url-shortener"},"What is a URL shortener?"),Object(o.b)("p",null,"A URL shortener is a simple tool that takes a long URL and turns it into a very short one"),Object(o.b)("p",null,Object(o.b)("img",Object(a.a)({parentName:"p"},{src:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655859bc2ae5c7371efa36_urlshortener%20image.png",alt:"Flow of URL shortening - from original URL to short URL"}))),Object(o.b)("p",null,"It is commonly used for 3 reasons:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Tracking clicks"),Object(o.b)("li",{parentName:"ul"},"Make URL much more concise."),Object(o.b)("li",{parentName:"ul"},"Hide original URL")),Object(o.b)("p",null,"One famous freemium provider is bit.ly (see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655a34bc2ae5452b1f124b_bitly.gif"}),"here"),")"),Object(o.b)("p",null,"In this article we will make a basic bit.ly like URL shortener. Let\u2019s go"),Object(o.b)("h2",{id:"ktor-principles"},"Ktor principles"),Object(o.b)("p",null,"Before starting I want to introduce the 3 main principles of Ktor."),Object(o.b)("h3",{id:"kotlin"},"Kotlin"),Object(o.b)("p",null,"Kotlin is the language used to develop on Ktor. It is an object-oriented and functional language. It is very stable and runs on the JVM. Kotlin is 100% interoperable with Java and allows you to benefit from its ecosystem (libraries, build system, etc.)."),Object(o.b)("h3",{id:"functional-programming"},"Functional programming"),Object(o.b)("p",null,"Ktor leverages the power of Kotlin and has a very functional approach. When writing code, everything seems obvious. It's very similar to what you can see on NodeJS. For me, coming from the Spring world, I find it very efficient to read and use."),Object(o.b)("h3",{id:"asynchronous"},"Asynchronous"),Object(o.b)("p",null,"Kotlin provides asynchronous code execution, thanks to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/docs/reference/coroutines-overview.html"}),"coroutines"),". Ktor exploits this feature to its full potential, and even if you have the impression that you are writing code in a blocking manner, this is not the case. Ktor makes your life easier."),Object(o.b)("h2",{id:"http-server"},"HTTP Server"),Object(o.b)("p",null,"Here is a complete and simple example of how to expose an HTTP server (",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080"}),"http://localhost:8080"),") with Ktor."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun main(args: Array): Unit = io.ktor.server.netty.EngineMain.main(args)\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n routing {\n get("/") {\n call.respondText("Hello World", contentType = ContentType.Text.Plain)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-encoder"},"URL Encoder"),Object(o.b)("p",null,"The URL encoder will translate an incoming address into a smaller URL. The idea is to provide an ID that will identify the final URL. Using a hash function is perfect for this operation. However, the operation is non-reversible, meaning you can\u2019t retrieve the final URL by the generated identifier."),Object(o.b)("p",null,"Function to transform a long URL into a shorter URL"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension\nfun String.encodeToID(): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(6)\n // return id\n return truncatedHashString\n}\n')),Object(o.b)("p",null,"We expose the function through the REST API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// Request object\ndata class Request(val url: String) {\n fun toResponse(): Response = Response(url, url.encodeToID())\n}\n\n// Response object\ndata class Response(val originalURL: String, private val id: String) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n enable(SerializationFeature.INDENT_OUTPUT)\n propertyNamingStrategy = PropertyNamingStrategy.SNAKE_CASE\n }\n }\n\n // Hash Table Response object by ID\n val responseByID = mutableMapOf()\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val retrievedResponse = responseByID[request.url.encodeToID()]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[request.url.encodeToID()] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h3",{id:"handle-identifier-collision"},"Handle identifier collision"),Object(o.b)("p",null,"Using a hash function makes no guarantee that it is not already being used. If it is in use, then you need to change it to another one. Note: even if the probability to have a collision is very low, you should handle this case."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension (function signature has changed)\nfun String.encodeToID(truncateLength: Int = 6): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(truncateLength)\n // return id\n return truncatedHashString\n}\n\n//...\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n // Hash Table Response object by id\n val responseByID = mutableMapOf()\n\n fun getIdentifier(url: String, truncateLength: Int = 6): String {\n val id = url.encodeToID()\n\n val retrievedResponse = responseByID[id]\n if (retrievedResponse?.originalURL != url) {\n // collision spotted !\n return getIdentifier(url, truncateLength + 1)\n }\n\n return id\n }\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val id = getID(request.url)\n val retrievedResponse = responseByID[id]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[id] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-decoder"},"URL Decoder"),Object(o.b)("p",null,"Decoding the URL is the process of returning the original URL from the short URL. This is the reverse operation made by the URL Encoder"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),"val shortURL = getShortURL(request.url)\nval retrievedResponse = responseByID[shortURL]\nretrievedResponse?.originalURL // return original URL or null\n")),Object(o.b)("h2",{id:"redirect"},"Redirect"),Object(o.b)("p",null,"When a user clicks on a short URL, the user is redirected to the final URL. HTTP protocol allows to do this naturally by returning a 302 status code and a redirection URL."),Object(o.b)("p",null,"With Ktor the redirection is as simple as calling a method with the final URL as a parameter."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'call.respondRedirect("https://www.qovery.com")\n')),Object(o.b)("p",null,"What we expect is that when the user visits ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080/fbc951"}),"http://localhost:8080/fbc951")," he is redirected to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"https://www.qovery.com"),". If the URL is incorrect then redirect to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.google.com"}),"https://www.google.com")),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n routing {\n get("/{id}") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respondRedirect("https://www.google.com")\n }\n\n log.debug("redirect to: $retrievedResponse")\n call.respondRedirect(retrievedResponse.originalURL)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"stats-clicks-over-time"},"Stats: clicks over time"),Object(o.b)("p",null,"Something that is really useful on products like bit.ly is the stats provided (click over time, referrers, country of visitors). Here is how to store click over time and make them available through the API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// added\ndata class Stat(val clicksOverTime: MutableList = mutableListOf())\n\n// Response object (modified with Stat)\ndata class Response(val originalURL: String, private val id: String, val stat: Stat = Stat()) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n // ...\n // add this line to return Date object as ISO8601 format\n disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)\n }\n }\n // ...\n routing {\n // ...\n get("/api/v1/url/{id}/stat") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respond(HttpStatusCode.NoContent)\n }\n\n call.respond(retrievedResponse.stat)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"try-the-api"},"Try the API"),Object(o.b)("p",null,"Run the application"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ ./gradlew run\n//...\n2020-03-12 09:28:08.150 [main] INFO Application - No ktor.deployment.watch patterns specified, automatic reload is not active\n2020-03-12 09:28:08.606 [main] INFO Application - Responding at http://0.0.0.0:8080\n")),Object(o.b)("p",null,"Then execute the commands"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'# generate a short URL\n$ curl -X POST -d \'{"url": "https://www.qovery.com"}\' -H "Content-type: application/json" "http://localhost:8080/api/v1/encode"\n{\n "original_url": "https://www.qovery.com",\n "stat": {\n "clicks_over_time": []\n },\n "short_url": "http://localhost:8080/fbc951"\n}\n\n# generate 4 fake clicks\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n\n# show stat\n$ curl -X GET \'http://localhost:8080/api/v1/url/fbc951/stat\'\n{\n "clicks_over_time": [\n "2020-03-11T21:10:52.354+0000",\n "2020-03-11T21:10:54.093+0000",\n "2020-03-11T21:12:34.987+0000",\n "2020-03-11T21:12:37.223+0000"\n ]\n}\n')),Object(o.b)("h2",{id:"connect-to-a-postgresql-database-with-exposed"},"Connect to a PostgreSQL database with Exposed"),Object(o.b)("p",null,"By storing the data in memory, we lose all the data every time the application restart. Which is problematic for running in production. To make the data persistent we will store it in a PostgreSQL database. We will have to add 1 new dependency - ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/JetBrains/Exposed"}),"Exposed"),". Exposed (with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/brettwooldridge/HikariCP"}),"Hikari Connection Pool"),") is a lightweight SQL library on top of JDBC driver for Kotlin. With exposed it is possible to access databases in two flavours: typesafe SQL wrapping DSL and lightweight Data Access Objects (DAO)."),Object(o.b)("p",null,"Add the dependencies to your build.gradle (or POM.xml)"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'repositories {\n jcenter()\n}\n\ndependencies {\n // Connection Pool and PostgreSQL driver\n implementation("com.zaxxer:HikariCP:3.4.2")\n implementation("org.postgresql:postgresql:42.2.11")\n\n // Exposed\n implementation("org.jetbrains.exposed:exposed-core:0.22.1")\n implementation("org.jetbrains.exposed:exposed-dao:0.22.1")\n implementation("org.jetbrains.exposed:exposed-jdbc:0.22.1")\n implementation("org.jetbrains.exposed:exposed-java-time:0.22.1")\n}\n')),Object(o.b)("p",null,"We need to have 2 distincts tables, one containing all the final URLs with their correspond identifier"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ResponseTable : Table("response") {\n val id = varchar("id", 32)\n val originalURL = varchar("original_url", 2048)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"And a second one with all the clicking points"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ClickOverTimeTable : Table("click_over_time") {\n val id = integer("id").autoIncrement()\n val clickDate = datetime("click_date")\n val response = reference("response_id", onDelete = ReferenceOption.CASCADE, refColumn = ResponseTable.id)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"We need to create the tables as defined above programmatically"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:postgresql://127.0.0.1:5432/exposed"\n username = "exposed"\n password = "exposed"\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n initDatabase()\n // ...\n}\n')),Object(o.b)("p",null,"We have to replace the Hash Table used to store the data by the PostgreSQL database (see the final code ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener/blob/with_postgresql/src/Application.kt"}),"here"),")"),Object(o.b)("h2",{id:"deploy-in-the-cloud-with-qovery"},"Deploy in the Cloud with Qovery"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery")," is going to help us to deploy the final application in the Cloud without the need to configure the CI/CD, network, security, load balancing, database and all the DevOps tasks"),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Qovery is a deployment platform that helps all developers to deploy their applications in the Cloud in just a few seconds")),Object(o.b)(u.a,{name:"tutorial",mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Your code need to be hosted on Github/Gitlab/Bitbucket"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"https://ktor.io/quickstart/quickstart/docker.html"}),"Package your Ktor application to build and run it on Docker")))),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://console.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.png",alt:"Qovery Sign-up page"}))))),Object(o.b)(b.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(b.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(b.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")))),Object(o.b)("h3",{id:"create-an-application"},"Create an application"),Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(o.b)("p",null,"To follow the guide, ",Object(o.b)("a",{href:"https://github.com/evoxmusic/ktor-url-shortener.git"},"you can fork and use our repository")),Object(o.b)("p",null,"Use the forked repository (and branch ",Object(o.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("p",null,"After the application is created: "),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"})),Object(o.b)("p",null,"This will expose your application and make accessible in the public internet.")))),Object(o.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(o.b)("p",null,"Create and deploy a new database."),Object(o.b)(i.a,{type:"warning",mdxType:"Alert"},"Name the new database **my-pql-db** to follow the guide flawlessly"),Object(o.b)("p",null,"To learn how to do it, you can ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"),"."),Object(o.b)("h3",{id:"connect-to-postgresql"},"Connect to PostgreSQL"),Object(o.b)("p",null,"Qovery add dynamically all required environment variables to connect to the database at the runtime of the container."),Object(o.b)("p",null,"You can list them all in ",Object(o.b)("strong",{parentName:"p"},"Environment Variables")," ",Object(o.b)("strong",{parentName:"p"},"Secrets")," section in your application overview, as described in ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"envs guide"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/db-envs.png",alt:"DB Secrets"})),Object(o.b)("p",null,"To use them:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:${System.getenv("QOVERY_DATABASE_MY_PQL_DB_CONNECTION_URI_WITHOUT_CREDENTIALS")}"\n username = System.getenv("QOVERY_DATABASE_MY_PQL_DB_USERNAME")\n password = System.getenv("QOVERY_DATABASE_MY_PQL_DB_PASSWORD")\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n')),Object(o.b)("h3",{id:"deploy"},"Deploy"),Object(o.b)("p",null,"To deploy your application and database, click ",Object(o.b)("strong",{parentName:"p"},"Action")," and ",Object(o.b)("strong",{parentName:"p"},"Deploy")," button in your environments list view:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",null,"To get public URL to the application, open application details and click on ",Object(o.b)("strong",{parentName:"p"},"Action")," ",Object(o.b)("strong",{parentName:"p"},"Open"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env-1.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/open-app.png",alt:"Kotlin URL Shortener"})),Object(o.b)("h2",{id:"conclusion"},"Conclusion"),Object(o.b)("p",null,"We have seen that creating an URL shortener API with Ktor and Kotlin is extremely simple. Connecting the application to PostgreSQL is very easy with the Exposed library. In just a few lines of code, the service is fully functional and can be deployed in production very quickly with the help of Qovery. In the next part, we will see how to create a web interface connecting to this API to convert our URLs without using the curl command."),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"Part 2"),": bind a web interface to the API - ","[link coming soon]"),Object(o.b)(l.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),o=n(463),i=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return r.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:i()("feather","icon-"+(o||s))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),o=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},470:function(e,t,n){"use strict";var a=n(1),r=n(0),o=n.n(r),i=n(39),l=n(474),s=n(20),c=n.n(s);t.a=function(e){var t,n=e.to,s=e.href,b=n||s,u=Object(l.a)(b),p=Object(r.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?o.a.createElement(i.b,Object(a.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var n,a;d&&e&&u&&(n=e,a=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:b})):o.a.createElement("a",Object(a.a)({},e,{href:b}))}},472:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(463),n(471)),i=n.n(o);n(133);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(s),b=Object(a.useState)(null),u=b[0],p=b[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!u&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=n(470),i=n(463),l=n.n(i);n(134);t.a=function(e){var t=e.children,n=e.className,a=e.badge,i=e.leftIcon,s=e.rightIcon,c=e.size,b=e.target,u=e.to,p=l()("jump-to","jump-to--"+c,n),d=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},i&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+i})),r.a.createElement("div",{className:"jump-to--main"},a?r.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return b?r.a.createElement("a",{href:u,target:b,className:p},d):r.a.createElement(o.a,{to:u,className:p},d)}},474:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},477:function(e,t,n){"use strict";var a=n(1),r=(n(480),n(479),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),i=n(483),l=n(463),s=n.n(l),c=n(471),b=n.n(c),u=n(482),p=37,d=39;function h(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",r,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function m(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return o.a.createElement(i.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,g=e.size,v=(e.style,e.values),j=e.urlKey,O=Object(u.a)(),f=O.tabGroupChoices,y=O.setTabGroupChoices,w=Object(r.useState)(n),N=w[0],k=w[1];if(null!=i){var T=f[i];null!=T&&T!==N&&k(T)}var R=function(e){k(e),null!=i&&y(i,e)},S=[],I=function(e,t,n){switch(n.keyCode){case d:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=b.a.parse(window.location.search);e[j]&&k(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(g||"md")},l&&o.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?o.a.createElement(m,Object(a.a)({changeSelectedValue:R,handleKeydown:I,placeholder:s,selectedValue:N,size:g,tabRefs:S},e)):o.a.createElement(h,Object(a.a)({changeSelectedValue:R,handleKeydown:I,selectedValue:N,tabRefs:S},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},478:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/abbfd6bd.c3682850.js b/abbfd6bd.c3682850.js deleted file mode 100644 index 046d1b0d44..0000000000 --- a/abbfd6bd.c3682850.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see abbfd6bd.c3682850.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[202],{354:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return u})),n.d(t,"metadata",(function(){return c})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return b}));var r=n(1),a=n(9),o=(n(0),n(465)),i=n(472),l=n(469),u={last_modified_on:"2024-07-19",$schema:"/.meta/.schemas/guides.json",title:"Deploy JupyterHub using Helm",description:"How to deploy JupyterHub on Qovery using the official Helm chart.",author_github:"https://github.com/baalooos",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},c={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Deploy JupyterHub using Helm",description:"How to deploy JupyterHub on Qovery using the official Helm chart.",permalink:"/guides/tutorial/deploy-jupyterhub-qovery",readingTime:"3 min read",source:"@site/guides/tutorial/deploy-jupyterhub-qovery.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Deploy JupyterHub using Helm",truncated:!1,prevItem:{title:"Deploy Frontend App",permalink:"/guides/advanced/deploy-frontend"},nextItem:{title:"Deploy Rails with PostgreSQL and Sidekiq",permalink:"/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq"}},s=[{value:"Installation",id:"installation",children:[]},{value:"Conclusion",id:"conclusion",children:[]}],p={rightToc:s};function b(e){var t=e.components,n=Object(a.a)(e,["components"]);return Object(o.b)("wrapper",Object(r.a)({},p,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"JupyterHub is an easy way to interact with a computing environment through a webpage. It provides a standardized way to serve Jupyter Notebooks for multiple users. Pairing it with Kubernetes and Qovery makes it easier to manage and scale."),Object(o.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have a Qovery cluster ready"),Object(o.b)("li",{parentName:"ul"},"You have a dedicated Qovery project and environment to deploy JupyterHub (example: Project=JupyterHub, Environment=Production)"))),Object(o.b)("h2",{id:"installation"},"Installation"),Object(o.b)("p",null,"The easiest way to deploy JupyterHub is using the official ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://github.com/jupyterhub/helm-chart"}),"Helm Chart"),". It will create all the resources you need to run JupyterHub."),Object(o.b)("p",null,"For more information, the official documentation is available ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/jupyterhub/installation.html"}),"here"),"."),Object(o.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("h4",{id:"add-the-jupyterhub-helm-repository"},"Add the JupyterHub helm repository"),Object(o.b)("p",null,"Add the JupyterHub helm repository in your Qovery settings by following ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/organization/helm-repository/"}),"this documentation")),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Repository name: ",Object(o.b)("inlineCode",{parentName:"li"},"JupyterHub")),Object(o.b)("li",{parentName:"ul"},"Kind: ",Object(o.b)("inlineCode",{parentName:"li"},"HTTPS")),Object(o.b)("li",{parentName:"ul"},"Repository URL: ",Object(o.b)("inlineCode",{parentName:"li"},"https://hub.jupyter.org/helm-chart/")))),Object(o.b)("li",null,Object(o.b)("h4",{id:"create-the-jupyterhub-service-within-qovery"},"Create the JupyterHub service within Qovery"),Object(o.b)("p",null,"Create the JupyterHub service in the Qovery environment of your choice (preferably within a dedicated JupyterHub project) by following ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/helm/"}),"this documentation")," and these values:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"General:",Object(o.b)("ul",{parentName:"li"},Object(o.b)("li",{parentName:"ul"},"Application name: ",Object(o.b)("inlineCode",{parentName:"li"},"JupyterHub")),Object(o.b)("li",{parentName:"ul"},"Source:",Object(o.b)("ul",{parentName:"li"},Object(o.b)("li",{parentName:"ul"},"Helm source: ",Object(o.b)("inlineCode",{parentName:"li"},"Helm repository")),Object(o.b)("li",{parentName:"ul"},"Repository: ",Object(o.b)("inlineCode",{parentName:"li"},"JupyterHub")," (the name given during the JupyterHub helm repository added in the previous step)"),Object(o.b)("li",{parentName:"ul"},"Chart name: ",Object(o.b)("inlineCode",{parentName:"li"},"jupyterhub")),Object(o.b)("li",{parentName:"ul"},"Version: ",Object(o.b)("inlineCode",{parentName:"li"},"3.3.7")," (this is the version we used for this setup, update it based on the chosen version)"),Object(o.b)("li",{parentName:"ul"},"Allow cluster-wide resources \u2714\ufe0f"))))),Object(o.b)("li",{parentName:"ul"},"Values",Object(o.b)("ul",{parentName:"li"},Object(o.b)("li",{parentName:"ul"},"Values override as file:"),Object(o.b)("li",{parentName:"ul"},"File source: ",Object(o.b)("inlineCode",{parentName:"li"},"Raw YAML")),Object(o.b)("li",{parentName:"ul"},"Raw YAML:")))),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-yaml"}),'fullnameOverride: "jupyterhub"\nproxy:\n service:\n type: ClusterIP\n')),Object(o.b)("p",null,"There are many other values you can set to modify the JupyterHub behavior. For advanced usage, check: ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/jupyterhub/customization.html"}),"JupyterHub Customization")),Object(o.b)("p",null,"Now get to the last step and ",Object(o.b)("inlineCode",{parentName:"p"},"Create")," the service on Qovery.")),Object(o.b)("li",null,Object(o.b)("h4",{id:"add-network-configuration"},"Add Network configuration"),Object(o.b)("p",null,"In the previous step, we created the JupyterHub service. In this step, we will update its configuration to make it available on the public network (through Qovery Nginx Ingress)."),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Open the JupyterHub service details"),Object(o.b)("li",{parentName:"ul"},"Enter the ",Object(o.b)("inlineCode",{parentName:"li"},"Settings")," section"),Object(o.b)("li",{parentName:"ul"},"Click on ",Object(o.b)("inlineCode",{parentName:"li"},"Networking")),Object(o.b)("li",{parentName:"ul"},"Add a new Port with:",Object(o.b)("ul",{parentName:"li"},Object(o.b)("li",{parentName:"ul"},"Service name: jupyterhub-proxy-public"),Object(o.b)("li",{parentName:"ul"},"Service port: 80"),Object(o.b)("li",{parentName:"ul"},"Select protocol: HTTP"),Object(o.b)("li",{parentName:"ul"},"External port: 443"),Object(o.b)("li",{parentName:"ul"},"Port name: jupyterhub-proxy-public-p80")))),Object(o.b)("p",null,"If you need more information on how to manage your ports, have a look at ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://hub.qovery.com/docs/using-qovery/configuration/application/#ports"}),"this"))),Object(o.b)("li",null,Object(o.b)("h4",{id:"deploy-your-chart"},"Deploy your chart"),Object(o.b)("p",null,"Open the ",Object(o.b)("inlineCode",{parentName:"p"},"Play")," button and trigger the deployment of your chart."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-jupyterhub-qovery/deploy.png",alt:"JupyterHub - Deploy"}))),Object(o.b)("li",null,Object(o.b)("h4",{id:"access-jupyterhub"},"Access JupyterHub"),Object(o.b)("p",null,"You can click the ",Object(o.b)("inlineCode",{parentName:"p"},"Link")," button to access JupyterHub on your cluster."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-jupyterhub-qovery/link.png",alt:"JupyterHub - Link"})),Object(o.b)("p",null,"Now you can login to the webUI and start playing with Jupyter Notebooks.")))),Object(o.b)("h2",{id:"conclusion"},"Conclusion"),Object(o.b)("p",null,"JupyterHub is running on your Qovery cluster. This is a simple installation and you should try to ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/jupyterhub/customization.html"}),"customize")," it according to your needs. You can also check the",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/administrator/index.html"}),"Adminstrator Guide"),"to better understand how it works."))}b.isMDXComponent=!0},463:function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function a(){for(var e=[],t=0;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),s=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l({},t,{},e)),n},p=function(e){var t=s(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},m=Object(r.forwardRef)((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,c=u(e,["components","mdxType","originalType","parentName"]),p=s(n),m=r,d=p["".concat(i,".").concat(m)]||p[m]||b[m]||o;return n?a.a.createElement(d,l({ref:t},c,{components:n})):a.a.createElement(d,l({ref:t},c))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var c=2;c1?arguments[1]:void 0,n),u=i>2?arguments[2]:void 0,c=void 0===u?n:a(u,n);c>l;)t[l++]=e;return t}},468:function(e,t,n){var r=n(28).f,a=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in a||n(10)&&r(a,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var r=n(0),a=n.n(r),o=n(464);t.a=function(e){var t=e.children,n=e.name;return a.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},a.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},471:function(e,t,n){"use strict";var r=n(475),a=n(51);function o(e,t){return t.encode?t.strict?r(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var n=function(e){var t;switch(e.arrayFormat){case"index":return function(e,n,r){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===r[e]&&(r[e]={}),r[e][t[1]]=n):r[e]=n};case"bracket":return function(e,n,r){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==r[e]?r[e]=[].concat(r[e],n):r[e]=[n]:r[e]=n};default:return function(e,t,n){void 0!==n[e]?n[e]=[].concat(n[e],t):n[e]=t}}}(t=a({arrayFormat:"none"},t)),r=Object.create(null);return"string"!=typeof e?r:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),a=t.shift(),o=t.length>0?t.join("="):void 0;o=void 0===o?null:decodeURIComponent(o),n(decodeURIComponent(a),o,r)})),Object.keys(r).sort().reduce((function(e,t){var n=r[t];return Boolean(n)&&"object"==typeof n&&!Array.isArray(n)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(n):e[t]=n,e}),Object.create(null))):r},t.stringify=function(e,t){var n=function(e){switch(e.arrayFormat){case"index":return function(t,n,r){return null===n?[o(t,e),"[",r,"]"].join(""):[o(t,e),"[",o(r,e),"]=",o(n,e)].join("")};case"bracket":return function(t,n){return null===n?o(t,e):[o(t,e),"[]=",o(n,e)].join("")};default:return function(t,n){return null===n?o(t,e):[o(t,e),"=",o(n,e)].join("")}}}(t=a({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(r){var a=e[r];if(void 0===a)return"";if(null===a)return o(r,t);if(Array.isArray(a)){var i=[];return a.slice().forEach((function(e){void 0!==e&&i.push(n(r,e,i.length))})),i.join("&")}return o(r,t)+"="+o(a,t)})).filter((function(e){return e.length>0})).join("&"):""}},472:function(e,t,n){"use strict";var r=n(0),a=n.n(r),o=(n(463),n(471)),i=n.n(o);n(133);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,u={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(u),s=Object(r.useState)(null),p=s[0],b=s[1];return a.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!p&&a.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",a.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return b("yes")}},"Yes"),"\xa0\xa0",a.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==p&&a.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",a.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},475:function(e,t,n){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}}}]); \ No newline at end of file diff --git a/abbfd6bd.c3682850.js.LICENSE.txt b/abbfd6bd.c3682850.js.LICENSE.txt deleted file mode 100644 index bae6dd8e22..0000000000 --- a/abbfd6bd.c3682850.js.LICENSE.txt +++ /dev/null @@ -1,5 +0,0 @@ -/*! - Copyright (c) 2017 Jed Watson. - Licensed under the MIT License (MIT), see - http://jedwatson.github.io/classnames -*/ diff --git a/abbfd6bd.fad2f312.js b/abbfd6bd.fad2f312.js new file mode 100644 index 0000000000..1d2fb9817e --- /dev/null +++ b/abbfd6bd.fad2f312.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[202],{354:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return s})),a.d(t,"metadata",(function(){return b})),a.d(t,"rightToc",(function(){return p})),a.d(t,"default",(function(){return m}));var n=a(1),r=a(9),l=(a(0),a(465)),i=a(477),o=a(478),u=a(472),c=a(469),s={last_modified_on:"2024-11-30",$schema:"/.meta/.schemas/guides.json",title:"Deploy JupyterHub using Helm",description:"How to deploy JupyterHub on Qovery using the official Helm chart.",author_github:"https://github.com/baalooos",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},b={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Deploy JupyterHub using Helm",description:"How to deploy JupyterHub on Qovery using the official Helm chart.",permalink:"/guides/tutorial/deploy-jupyterhub-qovery",readingTime:"3 min read",source:"@site/guides/tutorial/deploy-jupyterhub-qovery.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Deploy JupyterHub using Helm",truncated:!1,prevItem:{title:"Deploy Frontend App",permalink:"/guides/advanced/deploy-frontend"},nextItem:{title:"Deploy Rails with PostgreSQL and Sidekiq",permalink:"/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq"}},p=[{value:"Installation",id:"installation",children:[]},{value:"Conclusion",id:"conclusion",children:[]}],d={rightToc:p};function m(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(l.b)("wrapper",Object(n.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(l.b)("p",null,"JupyterHub is an easy way to interact with a computing environment through a webpage. It provides a standardized way to serve Jupyter Notebooks for multiple users. Pairing it with Kubernetes and Qovery makes it easier to manage and scale."),Object(l.b)(c.a,{name:"guide",mdxType:"Assumptions"},Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"You have a Qovery cluster ready"),Object(l.b)("li",{parentName:"ul"},"You have a dedicated Qovery project and environment to deploy JupyterHub (example: Project=JupyterHub, Environment=Production)"))),Object(l.b)("h2",{id:"installation"},"Installation"),Object(l.b)("p",null,"The easiest way to deploy JupyterHub is using the official ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/jupyterhub/helm-chart"}),"Helm Chart"),". It will create all the resources you need to run JupyterHub."),Object(l.b)("p",null,"For more information, the official documentation is available ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/jupyterhub/installation.html"}),"here"),"."),Object(l.b)(u.a,{headingDepth:3,mdxType:"Steps"},Object(l.b)("ol",null,Object(l.b)("li",null,Object(l.b)("h4",{id:"add-the-jupyterhub-helm-repository"},"Add the JupyterHub helm repository"),Object(l.b)("p",null,"Add the JupyterHub helm repository in your Qovery settings by following ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/organization/helm-repository/"}),"this documentation")),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"Repository name: ",Object(l.b)("inlineCode",{parentName:"li"},"JupyterHub")),Object(l.b)("li",{parentName:"ul"},"Kind: ",Object(l.b)("inlineCode",{parentName:"li"},"HTTPS")),Object(l.b)("li",{parentName:"ul"},"Repository URL: ",Object(l.b)("inlineCode",{parentName:"li"},"https://hub.jupyter.org/helm-chart/")))),Object(l.b)("li",null,Object(l.b)("h4",{id:"create-the-jupyterhub-service-within-qovery"},"Create the JupyterHub service within Qovery"),Object(l.b)("p",null,"Create the JupyterHub service in the Qovery environment of your choice (preferably within a dedicated JupyterHub project) by following ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/helm/"}),"this documentation")," and these values:"),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"General:",Object(l.b)("ul",{parentName:"li"},Object(l.b)("li",{parentName:"ul"},"Application name: ",Object(l.b)("inlineCode",{parentName:"li"},"JupyterHub")),Object(l.b)("li",{parentName:"ul"},"Source:",Object(l.b)("ul",{parentName:"li"},Object(l.b)("li",{parentName:"ul"},"Helm source: ",Object(l.b)("inlineCode",{parentName:"li"},"Helm repository")),Object(l.b)("li",{parentName:"ul"},"Repository: ",Object(l.b)("inlineCode",{parentName:"li"},"JupyterHub")," (the name given during the JupyterHub helm repository added in the previous step)"),Object(l.b)("li",{parentName:"ul"},"Chart name: ",Object(l.b)("inlineCode",{parentName:"li"},"jupyterhub")),Object(l.b)("li",{parentName:"ul"},"Version: ",Object(l.b)("inlineCode",{parentName:"li"},"3.3.7")," (this is the version we used for this setup, update it based on the chosen version)"),Object(l.b)("li",{parentName:"ul"},"Allow cluster-wide resources \u2714\ufe0f"))))),Object(l.b)("li",{parentName:"ul"},"Values",Object(l.b)("ul",{parentName:"li"},Object(l.b)("li",{parentName:"ul"},"Values override as file:"),Object(l.b)("li",{parentName:"ul"},"File source: ",Object(l.b)("inlineCode",{parentName:"li"},"Raw YAML")),Object(l.b)("li",{parentName:"ul"},"Raw YAML:")))),Object(l.b)(i.a,{centered:!0,className:"rounded",defaultValue:"default",placeholder:"Select your cluster type",select:!1,size:null,values:[{group:"Cluster",label:"Default",value:"default"},{group:"Cluster",label:"AWS with Karpenter",value:"karpenter"}],mdxType:"Tabs"},Object(l.b)(o.a,{value:"default",mdxType:"TabItem"},Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'fullnameOverride: "jupyterhub"\nproxy:\n service:\n type: ClusterIP\n'))),Object(l.b)(o.a,{value:"EKS with karpenter",mdxType:"TabItem"},Object(l.b)("p",null,"To ensure every node created by Karpenter is monitored by Datadog, we need to configure a priority class."),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'fullnameOverride: "jupyterhub"\nproxy:\n service:\n type: ClusterIP\nscheduling:\n podPriority:\n enabled: true\n globalDefault: true\n defaultPriority: 50\n imagePullerPriority: 1000\n userPlaceholderPriority: 0\n')))),Object(l.b)("p",null,"There are many other values you can set to modify the JupyterHub behavior. For advanced usage, check: ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/jupyterhub/customization.html"}),"JupyterHub Customization")),Object(l.b)("p",null,"Now get to the last step and ",Object(l.b)("inlineCode",{parentName:"p"},"Create")," the service on Qovery.")),Object(l.b)("li",null,Object(l.b)("h4",{id:"add-network-configuration"},"Add Network configuration"),Object(l.b)("p",null,"In the previous step, we created the JupyterHub service. In this step, we will update its configuration to make it available on the public network (through Qovery Nginx Ingress)."),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"Open the JupyterHub service details"),Object(l.b)("li",{parentName:"ul"},"Enter the ",Object(l.b)("inlineCode",{parentName:"li"},"Settings")," section"),Object(l.b)("li",{parentName:"ul"},"Click on ",Object(l.b)("inlineCode",{parentName:"li"},"Networking")),Object(l.b)("li",{parentName:"ul"},"Add a new Port with:",Object(l.b)("ul",{parentName:"li"},Object(l.b)("li",{parentName:"ul"},"Service name: jupyterhub-proxy-public"),Object(l.b)("li",{parentName:"ul"},"Service port: 80"),Object(l.b)("li",{parentName:"ul"},"Select protocol: HTTP"),Object(l.b)("li",{parentName:"ul"},"External port: 443"),Object(l.b)("li",{parentName:"ul"},"Port name: jupyterhub-proxy-public-p80")))),Object(l.b)("p",null,"If you need more information on how to manage your ports, have a look at ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://hub.qovery.com/docs/using-qovery/configuration/application/#ports"}),"this"))),Object(l.b)("li",null,Object(l.b)("h4",{id:"deploy-your-chart"},"Deploy your chart"),Object(l.b)("p",null,"Open the ",Object(l.b)("inlineCode",{parentName:"p"},"Play")," button and trigger the deployment of your chart."),Object(l.b)("p",{align:"center"},Object(l.b)("img",{src:"/img/deploy-jupyterhub-qovery/deploy.png",alt:"JupyterHub - Deploy"}))),Object(l.b)("li",null,Object(l.b)("h4",{id:"access-jupyterhub"},"Access JupyterHub"),Object(l.b)("p",null,"You can click the ",Object(l.b)("inlineCode",{parentName:"p"},"Link")," button to access JupyterHub on your cluster."),Object(l.b)("p",{align:"center"},Object(l.b)("img",{src:"/img/deploy-jupyterhub-qovery/link.png",alt:"JupyterHub - Link"})),Object(l.b)("p",null,"Now you can login to the webUI and start playing with Jupyter Notebooks.")))),Object(l.b)("h2",{id:"conclusion"},"Conclusion"),Object(l.b)("p",null,"JupyterHub is running on your Qovery cluster. This is a simple installation and you should try to ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/jupyterhub/customization.html"}),"customize")," it according to your needs. You can also check the",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://z2jh.jupyter.org/en/stable/administrator/index.html"}),"Adminstrator Guide"),"to better understand how it works."))}m.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),r=a.n(n),l=a(463),i=a.n(l);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,l=e.icon,o=e.type,u=null;switch(o){case"danger":u="alert-triangle";break;case"success":u="check-circle";break;case"warning":u="alert-triangle";break;default:u="info"}return r.a.createElement("div",{className:i()(a,"alert","alert--"+o,{"alert--fill":n,"alert--icon":!1!==l}),role:"alert"},!1!==l&&r.a.createElement("i",{className:i()("feather","icon-"+(l||u))}),t)}},468:function(e,t,a){var n=a(28).f,r=Function.prototype,l=/^\s*function ([^ (]*)/;"name"in r||a(10)&&n(r,"name",{configurable:!0,get:function(){try{return(""+this).match(l)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),r=a.n(n),l=a(464);t.a=function(e){var t=e.children,a=e.name;return r.a.createElement(l.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},472:function(e,t,a){"use strict";var n=a(0),r=a.n(n),l=(a(463),a(471)),i=a.n(l);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,l=e.hideFeedbackQuestion,o="undefined"!=typeof window?window.location:null,u={title:"Tutorial on "+o+" failed",body:"The tutorial on:\n\n"+o+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(u),s=Object(n.useState)(null),b=s[0],p=s[1];return r.a.createElement("div",{className:"steps steps--h"+a},t,!l&&!b&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==b&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,t,a){"use strict";var n=a(1),r=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),l=a.n(r),i=a(483),o=a(463),u=a.n(o),c=a(471),s=a.n(c),b=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,r=e.className,i=e.handleKeydown,o=e.style,c=e.values,s=e.selectedValue,b=e.tabRefs;return l.a.createElement("div",{className:a?"tabs--centered":null},l.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:u()("tabs",r,{"tabs--block":t}),style:o},c.map((function(e){var t=e.value,a=e.label;return l.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:u()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return i(b,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,r=e.size,o=e.values,u=o;if(u[0].group){var c=_.groupBy(u,"group");u=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return l.a.createElement(i.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:u,isClearable:a,placeholder:t,value:o.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,i=e.groupId,o=e.label,u=e.placeholder,c=e.select,y=e.size,j=(e.style,e.values),g=e.urlKey,f=Object(b.a)(),O=f.tabGroupChoices,v=f.setTabGroupChoices,N=Object(r.useState)(a),w=N[0],k=N[1];if(null!=i){var H=O[i];null!=H&&H!==w&&k(H)}var C=function(e){k(e),null!=i&&v(i,e)},J=[],T=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=s.a.parse(window.location.search);e[g]&&k(e[g])}}),[]),l.a.createElement(l.a.Fragment,null,l.a.createElement("div",{className:"margin-bottom--"+(y||"md")},o&&l.a.createElement("div",{className:"margin-vert--sm"},o),j.length>1&&(c?l.a.createElement(h,Object(n.a)({changeSelectedValue:C,handleKeydown:T,placeholder:u,selectedValue:w,size:y,tabRefs:J},e)):l.a.createElement(m,Object(n.a)({changeSelectedValue:C,handleKeydown:T,selectedValue:w,tabRefs:J},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===w}))[0])}},478:function(e,t,a){"use strict";var n=a(0),r=a.n(n);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/ac0a13b6.0c52cdb7.js b/ac0a13b6.ffd160ec.js similarity index 99% rename from ac0a13b6.0c52cdb7.js rename to ac0a13b6.ffd160ec.js index 81ed753bb9..566ea10d15 100644 --- a/ac0a13b6.0c52cdb7.js +++ b/ac0a13b6.ffd160ec.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[203],{355:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return i})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return d})),a.d(t,"default",(function(){return h}));var n,l=a(1),r=a(9),o=(a(0),a(465)),c=a(479),s=a(472),u=a(464),b=a(477),i={last_modified_on:"2024-07-12",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your Azure Kubernetes Service (AKS) cluster"},p={id:"getting-started/install-qovery/azure/self-managed-cluster",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your Azure Kubernetes Service (AKS) cluster",source:"@site/docs/getting-started/install-qovery/azure/self-managed-cluster.md",permalink:"/docs/getting-started/install-qovery/azure/self-managed-cluster",sidebar:"docs",previous:{title:"Quickstart",permalink:"/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart"},next:{title:"Kubernetes",permalink:"/docs/getting-started/install-qovery/kubernetes"}},d=[{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Install Qovery on your Azure AKS cluster",id:"install-qovery-on-your-azure-aks-cluster",children:[]},{value:"What's Next?",id:"whats-next",children:[]}],m=(n="Assumption",function(e){return console.warn("Component "+n+" was not imported, exported, or provided by MDXProvider as global scope"),Object(o.b)("div",e)}),y={rightToc:d};function h(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(l.a)({},y,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are not familiar with Kubernetes, we recommend you to use Qovery on a Managed Kubernetes cluster on ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/"}),"AWS"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/"}),"GCP"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/quickstart/"}),"Scaleway"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart/"}),"Azure"),", or contact us.")),Object(o.b)("p",null,"Qovery Self-Managed (or BYOK: Bring Your Own Kubernetes) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster.\nRead ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/blog/kubernetes-managed-by-qovery-vs-self-managed-byok"}),"this article")," to better understand the difference with the Managed Kubernetes by Qovery. In a nutshell, Qovery BYOK is for Kubernetes experts who want to manage their own Kubernetes cluster. In this version, Qovery does not manage the Kubernetes cluster for you."),Object(o.b)(u.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery automatically updates ",Object(o.b)("strong",{parentName:"p"},"ONLY")," the Qovery applications (agent, shell-agent etc..) via the Qovery Helm chart. With the self-managed offer it will be up to you to manage any dependency components (ingress, dns, logging...), making sure they run with the right version over time."),Object(o.b)("p",null,"The dependencies provided with the Qovery Helm chart are here to help you with the bootstrap, and are not maintained by Qovery. If you want to simplify the maintenance of your cluster, please look at ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/pricing/"}),"Qovery managed Kubernetes offer"),".")),Object(o.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(o.b)(m,{mdxType:"Assumption"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have a Azure AKS Kubernetes cluster up and running."),Object(o.b)("li",{parentName:"ul"},"You have a Azure AKS Kubernetes cluster with at least 4 CPUs and 8GB of RAM."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"kubectl")," installed and configured to access your Azure AKS Kubernetes cluster."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"helm")," installed."),Object(o.b)("li",{parentName:"ul"},"You have a Qovery account. If you don't have one, please sign up at ",Object(o.b)("a",Object(l.a)({parentName:"li"},{href:"https://start.qovery.com"}),"https://start.qovery.com")))),Object(o.b)("h2",{id:"install-qovery-on-your-azure-aks-cluster"},"Install Qovery on your Azure AKS cluster"),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Follow ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/local/"}),"this guide")," to try Qovery on your local machine.")),Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"automatic",placeholder:"Install Qovery",select:!1,size:null,values:[{group:"Install",label:"Automatic",value:"automatic"},{group:"Install",label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"automatic",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery CLI by running the following command:"),Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(c.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("p",null,"Authenticate with Qovery by running the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Azure AKS cluster:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"qovery cluster install\n")),Object(o.b)("p",null,"Respond to the prompts to install Qovery on your Azure AKS Kubernetes cluster."))))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://helm.sh"}),"Helm")," command line tool.")),Object(o.b)("li",null,Object(o.b)("p",null,"Add Qovery Helm repository."),Object(o.b)(u.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery Helm Chart is only available for users who have access to Qovery BYOK. ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/bring-your-own-kubernetes"}),"Request your access here"),".")),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm repo add qovery https://helm.qovery.com\nhelm repo update\n"))),Object(o.b)("li",null,Object(o.b)("p",null,"Login to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console"),", create a cluster of type ",Object(o.b)("inlineCode",{parentName:"p"},"Self-Managed"),". At the end of the flow you will be able to download the ",Object(o.b)("inlineCode",{parentName:"p"},"values.yaml")," file associated with this cluster.")),Object(o.b)("li",null,Object(o.b)("p",null,"Now you can customize your values.yaml file based on your need. Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),"."),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Make sure that all fields having value ",Object(o.b)("inlineCode",{parentName:"p"},"set-by-customer")," are filled.")),Object(o.b)("p",null,"Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Kubernetes cluster."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --wait --atomic --create-namespace -n qovery -f \\\n --set services.certificates.cert-manager-configs.enabled=false \\\n --set services.certificates.qovery-cert-manager-webhook.enabled=false \\\n --set services.qovery.qovery-cluster-agent.enabled=false \\\n --set services.qovery.qovery-engine.enabled=false \\\n qovery qovery/qovery\n")),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-n qovery"),": the namespace where Qovery and its dependencies will be installed"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"--set..."),": override (only for the first deployment time, if you want to use Cert-Manager) to let cert-manager install its CRDs"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-f your-values-file.yaml"),": the values file you've downloaded, overrided with the Qovery config and your custom config"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery/qovery"),": name of the chart to deploy"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery"),": name of the release")),Object(o.b)("p",null,"If you want to use Cert-Manager, you can remove the ",Object(o.b)("inlineCode",{parentName:"p"},"--set...")," for the future updates (or if already installed):"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --create-namespace -n qovery -f --wait --atomic qovery qovery/qovery\n"))))))),Object(o.b)("p",null,"That's it, you can now use Qovery on your Azure AKS cluster."),Object(o.b)("p",null,"Connect to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console")," to validate that Qovery is properly installed and start deploying your applications."),Object(o.b)("h2",{id:"whats-next"},"What's Next?"),Object(o.b)("p",null,"Now that you have Qovery installed on your Kubernetes cluster, you can check that Qovery is properly installed by following the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/validate-installation/"}),"Validate Installation")," guide."))}h.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),l=a.n(n),r=a(463),o=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,s=null;switch(c){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return l.a.createElement("div",{className:o()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:o()("feather","icon-"+(r||s))}),t)}},472:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(463),a(471)),o=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},u="https://github.com/qovery/documentation/issues/new?"+o.a.stringify(s),b=Object(n.useState)(null),i=b[0],p=b[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!i&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:u,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==i&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,t,a){"use strict";var n=a(1),l=(a(481),a(478),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),o=a(483),c=a(463),s=a.n(c),u=a(471),b=a.n(u),i=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,o=e.handleKeydown,c=e.style,u=e.values,b=e.selectedValue,i=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",l,{"tabs--block":t}),style:c},u.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return i.push(e)},onKeyDown:function(e){return o(i,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function y(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,c=e.values,s=c;if(s[0].group){var u=_.groupBy(s,"group");s=Object.keys(u).map((function(e){return{label:e,options:u[e]}}))}return r.a.createElement(o.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:s,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,o=e.groupId,c=e.label,s=e.placeholder,u=e.select,h=e.size,v=(e.style,e.values),O=e.urlKey,j=Object(i.a)(),g=j.tabGroupChoices,f=j.setTabGroupChoices,w=Object(l.useState)(a),N=w[0],q=w[1];if(null!=o){var T=g[o];null!=T&&T!==N&&q(T)}var k=function(e){q(e),null!=o&&f(o,e)},Q=[],x=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&q(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),v.length>1&&(u?r.a.createElement(y,Object(n.a)({changeSelectedValue:k,handleKeydown:x,placeholder:s,selectedValue:N,size:h,tabRefs:Q},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:k,handleKeydown:x,selectedValue:N,tabRefs:Q},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},479:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[203],{355:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return i})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return d})),a.d(t,"default",(function(){return h}));var n,l=a(1),r=a(9),o=(a(0),a(465)),c=a(478),s=a(472),u=a(464),b=a(477),i={last_modified_on:"2024-07-12",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your Azure Kubernetes Service (AKS) cluster"},p={id:"getting-started/install-qovery/azure/self-managed-cluster",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your Azure Kubernetes Service (AKS) cluster",source:"@site/docs/getting-started/install-qovery/azure/self-managed-cluster.md",permalink:"/docs/getting-started/install-qovery/azure/self-managed-cluster",sidebar:"docs",previous:{title:"Quickstart",permalink:"/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart"},next:{title:"Kubernetes",permalink:"/docs/getting-started/install-qovery/kubernetes"}},d=[{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Install Qovery on your Azure AKS cluster",id:"install-qovery-on-your-azure-aks-cluster",children:[]},{value:"What's Next?",id:"whats-next",children:[]}],m=(n="Assumption",function(e){return console.warn("Component "+n+" was not imported, exported, or provided by MDXProvider as global scope"),Object(o.b)("div",e)}),y={rightToc:d};function h(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(l.a)({},y,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are not familiar with Kubernetes, we recommend you to use Qovery on a Managed Kubernetes cluster on ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/"}),"AWS"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/"}),"GCP"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/quickstart/"}),"Scaleway"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart/"}),"Azure"),", or contact us.")),Object(o.b)("p",null,"Qovery Self-Managed (or BYOK: Bring Your Own Kubernetes) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster.\nRead ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/blog/kubernetes-managed-by-qovery-vs-self-managed-byok"}),"this article")," to better understand the difference with the Managed Kubernetes by Qovery. In a nutshell, Qovery BYOK is for Kubernetes experts who want to manage their own Kubernetes cluster. In this version, Qovery does not manage the Kubernetes cluster for you."),Object(o.b)(u.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery automatically updates ",Object(o.b)("strong",{parentName:"p"},"ONLY")," the Qovery applications (agent, shell-agent etc..) via the Qovery Helm chart. With the self-managed offer it will be up to you to manage any dependency components (ingress, dns, logging...), making sure they run with the right version over time."),Object(o.b)("p",null,"The dependencies provided with the Qovery Helm chart are here to help you with the bootstrap, and are not maintained by Qovery. If you want to simplify the maintenance of your cluster, please look at ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/pricing/"}),"Qovery managed Kubernetes offer"),".")),Object(o.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(o.b)(m,{mdxType:"Assumption"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have a Azure AKS Kubernetes cluster up and running."),Object(o.b)("li",{parentName:"ul"},"You have a Azure AKS Kubernetes cluster with at least 4 CPUs and 8GB of RAM."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"kubectl")," installed and configured to access your Azure AKS Kubernetes cluster."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"helm")," installed."),Object(o.b)("li",{parentName:"ul"},"You have a Qovery account. If you don't have one, please sign up at ",Object(o.b)("a",Object(l.a)({parentName:"li"},{href:"https://start.qovery.com"}),"https://start.qovery.com")))),Object(o.b)("h2",{id:"install-qovery-on-your-azure-aks-cluster"},"Install Qovery on your Azure AKS cluster"),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Follow ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/local/"}),"this guide")," to try Qovery on your local machine.")),Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"automatic",placeholder:"Install Qovery",select:!1,size:null,values:[{group:"Install",label:"Automatic",value:"automatic"},{group:"Install",label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"automatic",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery CLI by running the following command:"),Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(c.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(b.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("p",null,"Authenticate with Qovery by running the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Azure AKS cluster:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"qovery cluster install\n")),Object(o.b)("p",null,"Respond to the prompts to install Qovery on your Azure AKS Kubernetes cluster."))))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://helm.sh"}),"Helm")," command line tool.")),Object(o.b)("li",null,Object(o.b)("p",null,"Add Qovery Helm repository."),Object(o.b)(u.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery Helm Chart is only available for users who have access to Qovery BYOK. ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/bring-your-own-kubernetes"}),"Request your access here"),".")),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm repo add qovery https://helm.qovery.com\nhelm repo update\n"))),Object(o.b)("li",null,Object(o.b)("p",null,"Login to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console"),", create a cluster of type ",Object(o.b)("inlineCode",{parentName:"p"},"Self-Managed"),". At the end of the flow you will be able to download the ",Object(o.b)("inlineCode",{parentName:"p"},"values.yaml")," file associated with this cluster.")),Object(o.b)("li",null,Object(o.b)("p",null,"Now you can customize your values.yaml file based on your need. Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),"."),Object(o.b)(u.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Make sure that all fields having value ",Object(o.b)("inlineCode",{parentName:"p"},"set-by-customer")," are filled.")),Object(o.b)("p",null,"Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Kubernetes cluster."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --wait --atomic --create-namespace -n qovery -f \\\n --set services.certificates.cert-manager-configs.enabled=false \\\n --set services.certificates.qovery-cert-manager-webhook.enabled=false \\\n --set services.qovery.qovery-cluster-agent.enabled=false \\\n --set services.qovery.qovery-engine.enabled=false \\\n qovery qovery/qovery\n")),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-n qovery"),": the namespace where Qovery and its dependencies will be installed"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"--set..."),": override (only for the first deployment time, if you want to use Cert-Manager) to let cert-manager install its CRDs"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-f your-values-file.yaml"),": the values file you've downloaded, overrided with the Qovery config and your custom config"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery/qovery"),": name of the chart to deploy"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery"),": name of the release")),Object(o.b)("p",null,"If you want to use Cert-Manager, you can remove the ",Object(o.b)("inlineCode",{parentName:"p"},"--set...")," for the future updates (or if already installed):"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --create-namespace -n qovery -f --wait --atomic qovery qovery/qovery\n"))))))),Object(o.b)("p",null,"That's it, you can now use Qovery on your Azure AKS cluster."),Object(o.b)("p",null,"Connect to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console")," to validate that Qovery is properly installed and start deploying your applications."),Object(o.b)("h2",{id:"whats-next"},"What's Next?"),Object(o.b)("p",null,"Now that you have Qovery installed on your Kubernetes cluster, you can check that Qovery is properly installed by following the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/validate-installation/"}),"Validate Installation")," guide."))}h.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),l=a.n(n),r=a(463),o=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,s=null;switch(c){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return l.a.createElement("div",{className:o()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:o()("feather","icon-"+(r||s))}),t)}},472:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(463),a(471)),o=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},u="https://github.com/qovery/documentation/issues/new?"+o.a.stringify(s),b=Object(n.useState)(null),i=b[0],p=b[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!i&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:u,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==i&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,t,a){"use strict";var n=a(1),l=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),o=a(483),c=a(463),s=a.n(c),u=a(471),b=a.n(u),i=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,o=e.handleKeydown,c=e.style,u=e.values,b=e.selectedValue,i=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",l,{"tabs--block":t}),style:c},u.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return i.push(e)},onKeyDown:function(e){return o(i,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function y(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,c=e.values,s=c;if(s[0].group){var u=_.groupBy(s,"group");s=Object.keys(u).map((function(e){return{label:e,options:u[e]}}))}return r.a.createElement(o.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:s,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,o=e.groupId,c=e.label,s=e.placeholder,u=e.select,h=e.size,v=(e.style,e.values),O=e.urlKey,j=Object(i.a)(),g=j.tabGroupChoices,f=j.setTabGroupChoices,w=Object(l.useState)(a),N=w[0],q=w[1];if(null!=o){var T=g[o];null!=T&&T!==N&&q(T)}var k=function(e){q(e),null!=o&&f(o,e)},Q=[],x=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&q(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),v.length>1&&(u?r.a.createElement(y,Object(n.a)({changeSelectedValue:k,handleKeydown:x,placeholder:s,selectedValue:N,size:h,tabRefs:Q},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:k,handleKeydown:x,selectedValue:N,tabRefs:Q},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},478:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/acbf1af7.4641776a.js b/acbf1af7.bee44943.js similarity index 99% rename from acbf1af7.4641776a.js rename to acbf1af7.bee44943.js index 513ced28b3..da7669afb0 100644 --- a/acbf1af7.4641776a.js +++ b/acbf1af7.bee44943.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[206],{358:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return u})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return p})),n.d(t,"default",(function(){return h}));var a=n(1),r=n(9),o=(n(0),n(465)),i=n(477),c=n(479),l=n(472),s=(n(473),n(464)),u=(n(469),{last_modified_on:"2024-11-27",title:"AWS EKS with Karpenter",description:"Learn how to configure your AWS Kubernetes clusters with Karpenter on Qovery"}),b={id:"using-qovery/configuration/clusters/aws-with-karpenter",title:"AWS EKS with Karpenter",description:"Learn how to configure your AWS Kubernetes clusters with Karpenter on Qovery",source:"@site/docs/using-qovery/configuration/clusters/aws-with-karpenter.md",permalink:"/docs/using-qovery/configuration/clusters/aws-with-karpenter",sidebar:"docs",previous:{title:"AWS EKS",permalink:"/docs/using-qovery/configuration/clusters/aws"},next:{title:"GCP GKE",permalink:"/docs/using-qovery/configuration/clusters/gcp"}},p=[{value:"Creating a AWS EKS Cluster with Karpenter",id:"creating-a-aws-eks-cluster-with-karpenter",children:[]},{value:"Migrating from AWS with auto-scaler to AWS with Karpenter",id:"migrating-from-aws-with-auto-scaler-to-aws-with-karpenter",children:[]},{value:"Managing your Cluster Settings",id:"managing-your-cluster-settings",children:[]}],d={rightToc:p};function h(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},d,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(s.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Karpenter is only available for non-production clusters. If you have created a production cluster, this option will not be visible.")),Object(o.b)("p",null,"Karpenter automatically launches just the right compute resources to handle your cluster's applications. It is designed to let you take full advantage of the cloud with fast and simple compute provisioning for Kubernetes clusters.\nYou can our ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/save-up-to-60-on-aws-costs-with-eks-and-karpenter/"}),"blog post"),' for more information."'),Object(o.b)("h3",{id:"creating-a-aws-eks-cluster-with-karpenter"},"Creating a AWS EKS Cluster with Karpenter"),Object(o.b)(l.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Click on ",Object(o.b)("inlineCode",{parentName:"p"},"AWS")," as hosting mode and then ",Object(o.b)("inlineCode",{parentName:"p"},"Qovery Managed")," option:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/cluster_hosting_selection_aws.png",alt:"Cluster AWS"})),Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Create Cluster")," window enter:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Cluster name"),": enter the name of your choice for your cluster."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Description"),": enter a description to identify better your cluster."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Production cluster"),": select this option if your cluster will be used for production. Note: Karpenter is currently only available for non-production clusters."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Region"),": select the geographical area in which you want your cluster to be hosted."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Credentials"),": select one of the existing cloud provider credentials or add a new one by clicking on ",Object(o.b)("inlineCode",{parentName:"li"},"New Credentials"),". In the New credentials window, add the credentials that you have generated on your cloud provider console (",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/#attach-aws-credentials"}),"Procedure for AWS account"),"). Added credentials can be used later to create and manage additional cluster.")),Object(o.b)("p",null,"To confirm, click ",Object(o.b)("inlineCode",{parentName:"p"},"Next"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Set Resources")," window, select:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Karpenter"),": Toggle the switch to enable Karpenter on your AWS EKS cluster"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Instance types scopes"),": By editing it, you can apply different filters to the node architectures, categories, families, and sizes. On the right, you can view all the instance types that match the applied filters. This means Karpenter will be able to spawn nodes on any of the listed instance types.",Object(o.b)("ul",{parentName:"li"},Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Architectures"),": by default both ",Object(o.b)("inlineCode",{parentName:"li"},"AMD64")," and ",Object(o.b)("inlineCode",{parentName:"li"},"ARM64")," architectures are selected."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Default build architecture"),": by default ",Object(o.b)("inlineCode",{parentName:"li"},"AMD64"),". If you build your application with the Qovery CI, your application will be built using this architecture by default."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Families"),": by default all families are selected."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Sizes"),": by default all sizes are selected."))),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Spot instances"),": In order to reduce even more your costs, you can also enable the spot instances on your clusters. Spot instances cost up to 90% less compared to On-Demand prices. But keep in mind that spot instances can be terminated by the cloud provider at any time. Check this ",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"https://aws.amazon.com/ec2/spot/"}),"documentation")," for more information. Even if this flag is enabled, the statefulsets won't run on spot instances."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Disk size"),": select the size of the disks to be attached to your cluster instances (to locally store container images etc..).")),Object(o.b)("br",null),Object(o.b)(s.a,{type:"warning",mdxType:"Alert"},"Instance type selection from your Qovery Console has direct consequences on your cloud provider\u2019s bill. While Qovery allows you to switch to a different instance type whenever you want, it is your sole responsibility to keep an eye on your infrastructure costs, especially when you want to upsize.",Object(o.b)("p",null,"Please be aware that changing the instance type or disk size might cause a downtime for your service."),Object(o.b)("p",null,"For more information on the instance types provided by each cloud provider and their associated pricing, see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#what-are-the-different-instance-types-available-when-creating-a-cluster"}),"What are the different instance types available when creating a cluster?")),Object(o.b)("p",null,"Also, before downsizing, you need to ensure that your applications will still have enough resources to run correctly.")),Object(o.b)("br",null),Object(o.b)("p",null,"To confirm, click ",Object(o.b)("inlineCode",{parentName:"p"},"Next"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Features")," step, select the features you want to enable on your cluster."),Object(o.b)("p",null,"If you want to manage the network layer of your cluster by yourself, you can switch VPC mode to ",Object(o.b)("inlineCode",{parentName:"p"},"Deploy on my existing VPC")," to use your own VPC instead of the one provided by Qovery."),Object(o.b)(s.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"These options can only be configured during cluster creation and cannot be modified later.")),Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"vpc managed by qovery",placeholder:"Select a VPC mode",select:!1,size:null,values:[{group:"Features",label:"VPC managed by Qovery",value:"vpc managed by qovery"},{group:"Features",label:"Use your existing VPC",value:"use existing vpc"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"vpc managed by qovery",mdxType:"TabItem"},Object(o.b)("h4",{id:"static-ip"},"Static IP"),Object(o.b)("p",null,"By default, when your cluster is created, its worker nodes are allocated public IP addresses, which are used for external communication. For improved security and control, the ",Object(o.b)("strong",{parentName:"p"},"Static IP")," feature allows you to ensure that outbound traffic from your cluster uses specific IP addresses."),Object(o.b)("p",null,"Here is what will be deployed on your cluster:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Nat Gateways"),Object(o.b)("li",{parentName:"ul"},"Elastic IPs"),Object(o.b)("li",{parentName:"ul"},"Private subnets")),Object(o.b)("p",null,"Once set up, here is the procedure to find your static IP addresses on ",Object(o.b)("inlineCode",{parentName:"p"},"AWS"),":"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"On your AWS account, select the VPC service."),Object(o.b)("li",{parentName:"ul"},"On the left menu, you\u2019ll find Elastic IP addresses. Once on it, in the Allocated IPv4 address column, you\u2019ll have your public IPs.")),Object(o.b)(s.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you work in a sensitive business area such as financial technology, enabling the ",Object(o.b)("strong",{parentName:"p"},"Static IP")," feature can help fulfil the security requirements of some of the external services you use, therefore making it easier for you to get whitelisted by them."),Object(o.b)("p",null,"This feature has been activated by default. Since February 1, 2024, AWS charge public IPv4 Addresses. Disabling it may cost you more, depending on the number of nodes in your cluster. Check this ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://aws.amazon.com/blogs/aws/new-aws-public-ipv4-address-charge-public-ip-insights/"}),"link")," for more information.")),Object(o.b)("h4",{id:"custom-vpc-subnet"},"Custom VPC Subnet"),Object(o.b)("p",null,"Virtual Private Cloud (VPC) peering allows you to set up a connection between your Qovery VPC and another VPC on your AWS account. This way, you can access resources stored on your AWS VPC directly from your Qovery applications."),Object(o.b)("p",null,"A VPC can only be used if it has at least one range of IP addresses called a ",Object(o.b)("strong",{parentName:"p"},"subnet"),". When you create a cluster, Qovery automatically picks a default subnet for it. However, to perform VPC peering, you may want to define which specific VPC subnet you want to use, so that you can avoid any conflicting settings. To do so, you can enable the ",Object(o.b)("strong",{parentName:"p"},"Custom VPC Subnet")," feature on your cluster. For more information on how to set up VPC peering, ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://hub.qovery.com/guides/tutorial/aws-vpc-peering-with-qovery/"}),"see our dedicated tutorial"),".")),Object(o.b)(c.a,{value:"use existing vpc",mdxType:"TabItem"},Object(o.b)("p",null,"You have to specify the ",Object(o.b)("inlineCode",{parentName:"p"},"VPC id")," (1) and ensure that in your VPC settings you have enabled the ",Object(o.b)("inlineCode",{parentName:"p"},"DNS hostnames")," (2):"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/existing_vpc_aws_dns_hostnames.png",alt:"Existing VPC AWS DNS Hostnmaes"})),Object(o.b)("p",null,"Then you have to specify the different subnets ids:"),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"EKS"),":"),Object(o.b)("p",null,"The EKS subnets are mandatory, you have to specify at least ",Object(o.b)("strong",{parentName:"p"},"one subnet id per zone")," (1) and ensure you have enabled the ",Object(o.b)("strong",{parentName:"p"},"auto-assign public IPv4 address")," setting on your subnets (2)."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/existing_vpc_aws_auto_assign.png",alt:"Existing VPC AWS DNS Hostnmaes"})),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"Managed databases"),":"),Object(o.b)("p",null,"This section is exclusively for enabling managed databases (container databases will be enabled by default)."),Object(o.b)("p",null,"Depending on the managed databases you want to you use (",Object(o.b)("strong",{parentName:"p"},"MongoDB"),", ",Object(o.b)("strong",{parentName:"p"},"RDS:MySQL/PostgreSQL")," and ",Object(o.b)("strong",{parentName:"p"},"Redis"),"), specify at least one subnet id per zone.")))),Object(o.b)("li",null,Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Ready to install your cluster")," window, check that the services needed to install your cluster are correct."),Object(o.b)("p",null,"You can now press the ",Object(o.b)("inlineCode",{parentName:"p"},"Create and Install")," button."),Object(o.b)("p",null,"Your cluster is now displayed in your organization settings, featuring the ",Object(o.b)("inlineCode",{parentName:"p"},"Installing...")," status (orange status). Once your cluster is properly installed, its status turns to green and you will be able to deploy your applications on it."),Object(o.b)("p",null,"You can follow the execution of the action via the cluster status and/or by accessing the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#logs"}),"Cluster Logs"))))),Object(o.b)("h3",{id:"migrating-from-aws-with-auto-scaler-to-aws-with-karpenter"},"Migrating from AWS with auto-scaler to AWS with Karpenter"),Object(o.b)(s.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"A SQS queue will be created. Before deploying your cluster, update the IAM permissions of the Qovery user, make sure to use the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://hub.qovery.com/files/qovery-iam-aws.json"}),"latest version here")," to add the permission on SQS.")),Object(o.b)("p",null,"You can easily activate Karpenter on your non-production existing cluster by following this process:"),Object(o.b)(l.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Open your ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery Console"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"On the left menu bar, click on the Cluster page.")),Object(o.b)("li",null,Object(o.b)("p",null,"To access your cluster settings, click on the wheel button:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/cluster_settings.png",alt:"Display Cluster Settings"}))),Object(o.b)("li",null,Object(o.b)("p",null,"Access to ",Object(o.b)("inlineCode",{parentName:"p"},"Resources")," section and switch on the toggle ",Object(o.b)("inlineCode",{parentName:"p"},"Activate Karpenter"))),Object(o.b)("li",null,Object(o.b)("p",null,"Update your cluster by selecting the action ",Object(o.b)("inlineCode",{parentName:"p"},"Update")," from the drop-down menu.")),Object(o.b)("li",null,Object(o.b)("p",null,"Once the update is complete, your cluster will be running on Karpenter. By default, only the instance types selected when you created your AWS cluster with the auto-scaler will be configured. You can add additional instance types by editing the instance types in the resources section.")))),Object(o.b)("h3",{id:"managing-your-cluster-settings"},"Managing your Cluster Settings"),Object(o.b)("p",null,"To manage the settings of an existing cluster:"),Object(o.b)(l.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Open your ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery Console"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"On the left menu bar, click on the Cluster page.")),Object(o.b)("li",null,Object(o.b)("p",null,"To access your cluster settings, click on the wheel button:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/cluster_settings.png",alt:"Display Cluster Settings"}))))),Object(o.b)("p",null,"Below you can find a description of each section"),Object(o.b)("h4",{id:"general"},"General"),Object(o.b)("p",null,"The ",Object(o.b)("inlineCode",{parentName:"p"},"General")," tab allows you to define high-level information on your cluster:"),Object(o.b)("table",null,Object(o.b)("thead",{parentName:"table"},Object(o.b)("tr",{parentName:"thead"},Object(o.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Item"),Object(o.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Description"))),Object(o.b)("tbody",{parentName:"table"},Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Cluster Name"),Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To edit the name of your cluster.")),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Description"),Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To enter or edit the description of your cluster.")),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Production Cluster"),Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To enter or edit the production flag of your cluster.")))),Object(o.b)("h4",{id:"credentials"},"Credentials"),Object(o.b)("p",null,"Here you can manage here the cloud provider credentials associated with your cluster."),Object(o.b)("p",null,"If you need to change the credentials:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"generate a new set of credentials on your cloud provider(",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/#attach-aws-credentials"}),"Procedure for AWS account"),")"),Object(o.b)("li",{parentName:"ul"},'create the new credential on the Qovery by opening the drop-down and selecting "New Credentials"')),Object(o.b)("p",null,"Once created and associated, you need to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#updating-a-cluster"}),"updating your cluster")," to apply the change."),Object(o.b)("h4",{id:"resources"},"Resources"),Object(o.b)("p",null,"Qovery allows you to modify the resources allocated for your cluster:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"The list of the instance types"),Object(o.b)("li",{parentName:"ul"},"The spot instances activation"),Object(o.b)("li",{parentName:"ul"},"The ",Object(o.b)("inlineCode",{parentName:"li"},"Node disk size (GB)")," field, enter the disk capacity you want to allocate to your worker node(s) (meaning how much data, in gigabytes, you want each worker node to be able to hold).")),Object(o.b)(s.a,{type:"warning",mdxType:"Alert"},"Instance type selection from your Qovery Console has direct consequences on your cloud provider\u2019s bill. While Qovery allows you to switch to a different instance type whenever you want, it is your sole responsibility to keep an eye on your infrastructure costs, especially when you want to upsize.",Object(o.b)("p",null,"For more information on the instance types provided by each cloud provider and their associated pricing, see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#what-are-the-different-instance-types-available-when-creating-a-cluster"}),"What are the different instance types available when creating a cluster?"))),Object(o.b)("br",null),Object(o.b)("h4",{id:"image-registry"},"Image registry"),Object(o.b)("p",null,"In this tab, you will see that a container registry already exist (called ",Object(o.b)("inlineCode",{parentName:"p"},"registry-{$UIID}"),").\nThis is your cloud provider container registry used by Qovery to manage the deployment of your applications by mirroring the docker images."),Object(o.b)("p",null,"The credentials configured on this registry are the one used to create the cluster. But you can still update them if you prefer to manage them separately (dedicated pair of creds just to access the registry)."),Object(o.b)("p",null,"Check ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/image-mirroring/"}),"this link")," for more information."),Object(o.b)("h4",{id:"features"},"Features"),Object(o.b)("p",null,"The ",Object(o.b)("inlineCode",{parentName:"p"},"Features")," tab in your cluster settings allows you to check if the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"#static-ip"}),Object(o.b)("strong",{parentName:"a"},"Static IP")),", ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"#custom-vpc-subnet"}),Object(o.b)("strong",{parentName:"a"},"Custom VPC subnet")),", ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"#use-existing-vpc"}),Object(o.b)("strong",{parentName:"a"},"Deploy on existing VPC"))," features are enabled on your cluster. The enabled features cannot be changed after the creation of the cluster."),Object(o.b)("h4",{id:"network"},"Network"),Object(o.b)("p",null,"The ",Object(o.b)("inlineCode",{parentName:"p"},"Network")," tab in your cluster settings allows you to update your Qovery VPC route table so that you can perform VPC peering. For step-by-step guidelines on how to set up VPC peering, ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://hub.qovery.com/guides/tutorial/aws-vpc-peering-with-qovery/"}),"see our dedicated tutorial"),"."))}h.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),o=n(463),i=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,c=e.type,l=null;switch(c){case"danger":l="alert-triangle";break;case"success":l="check-circle";break;case"warning":l="alert-triangle";break;default:l="info"}return r.a.createElement("div",{className:i()(n,"alert","alert--"+c,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:i()("feather","icon-"+(o||l))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),o=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},470:function(e,t,n){"use strict";var a=n(1),r=n(0),o=n.n(r),i=n(39),c=n(474),l=n(20),s=n.n(l);t.a=function(e){var t,n=e.to,l=e.href,u=n||l,b=Object(c.a)(u),p=Object(r.useRef)(!1),d=s.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!d&&b&&window.docusaurus.prefetch(u),function(){d&&t&&t.disconnect()}}),[u,d,b]),u&&b?o.a.createElement(i.b,Object(a.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(u),p.current=!0)},innerRef:function(e){var n,a;d&&e&&b&&(n=e,a=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:u})):o.a.createElement("a",Object(a.a)({},e,{href:u}))}},472:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(463),n(471)),i=n.n(o);n(133);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,l={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},s="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(l),u=Object(a.useState)(null),b=u[0],p=u[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!b&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:s,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==b&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=n(470),i=n(463),c=n.n(i);n(134);t.a=function(e){var t=e.children,n=e.className,a=e.badge,i=e.leftIcon,l=e.rightIcon,s=e.size,u=e.target,b=e.to,p=c()("jump-to","jump-to--"+s,n),d=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},i&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+i})),r.a.createElement("div",{className:"jump-to--main"},a?r.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(l||"chevron-right")+" arrow"}))));return u?r.a.createElement("a",{href:b,target:u,className:p},d):r.a.createElement(o.a,{to:b,className:p},d)}},474:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},477:function(e,t,n){"use strict";var a=n(1),r=(n(481),n(478),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),i=n(483),c=n(463),l=n.n(c),s=n(471),u=n.n(s),b=n(482),p=37,d=39;function h(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,i=e.handleKeydown,c=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:l()("tabs",r,{"tabs--block":t}),style:c},s.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:l()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return i(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function m(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,c=e.values,l=c;if(l[0].group){var s=_.groupBy(l,"group");l=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return o.a.createElement(i.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:l,isClearable:n,placeholder:t,value:c.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,c=e.label,l=e.placeholder,s=e.select,y=e.size,g=(e.style,e.values),f=e.urlKey,O=Object(b.a)(),j=O.tabGroupChoices,w=O.setTabGroupChoices,v=Object(r.useState)(n),N=v[0],C=v[1];if(null!=i){var k=j[i];null!=k&&k!==N&&C(k)}var S=function(e){C(e),null!=i&&w(i,e)},E=[],P=function(e,t,n){switch(n.keyCode){case d:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=u.a.parse(window.location.search);e[f]&&C(e[f])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(y||"md")},c&&o.a.createElement("div",{className:"margin-vert--sm"},c),g.length>1&&(s?o.a.createElement(m,Object(a.a)({changeSelectedValue:S,handleKeydown:P,placeholder:l,selectedValue:N,size:y,tabRefs:E},e)):o.a.createElement(h,Object(a.a)({changeSelectedValue:S,handleKeydown:P,selectedValue:N,tabRefs:E},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},479:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[206],{358:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return u})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return p})),n.d(t,"default",(function(){return h}));var a=n(1),r=n(9),o=(n(0),n(465)),i=n(477),c=n(478),l=n(472),s=(n(473),n(464)),u=(n(469),{last_modified_on:"2024-11-27",title:"AWS EKS with Karpenter",description:"Learn how to configure your AWS Kubernetes clusters with Karpenter on Qovery"}),b={id:"using-qovery/configuration/clusters/aws-with-karpenter",title:"AWS EKS with Karpenter",description:"Learn how to configure your AWS Kubernetes clusters with Karpenter on Qovery",source:"@site/docs/using-qovery/configuration/clusters/aws-with-karpenter.md",permalink:"/docs/using-qovery/configuration/clusters/aws-with-karpenter",sidebar:"docs",previous:{title:"AWS EKS",permalink:"/docs/using-qovery/configuration/clusters/aws"},next:{title:"GCP GKE",permalink:"/docs/using-qovery/configuration/clusters/gcp"}},p=[{value:"Creating a AWS EKS Cluster with Karpenter",id:"creating-a-aws-eks-cluster-with-karpenter",children:[]},{value:"Migrating from AWS with auto-scaler to AWS with Karpenter",id:"migrating-from-aws-with-auto-scaler-to-aws-with-karpenter",children:[]},{value:"Managing your Cluster Settings",id:"managing-your-cluster-settings",children:[]}],d={rightToc:p};function h(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},d,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(s.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Karpenter is only available for non-production clusters. If you have created a production cluster, this option will not be visible.")),Object(o.b)("p",null,"Karpenter automatically launches just the right compute resources to handle your cluster's applications. It is designed to let you take full advantage of the cloud with fast and simple compute provisioning for Kubernetes clusters.\nYou can our ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/save-up-to-60-on-aws-costs-with-eks-and-karpenter/"}),"blog post"),' for more information."'),Object(o.b)("h3",{id:"creating-a-aws-eks-cluster-with-karpenter"},"Creating a AWS EKS Cluster with Karpenter"),Object(o.b)(l.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Click on ",Object(o.b)("inlineCode",{parentName:"p"},"AWS")," as hosting mode and then ",Object(o.b)("inlineCode",{parentName:"p"},"Qovery Managed")," option:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/cluster_hosting_selection_aws.png",alt:"Cluster AWS"})),Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Create Cluster")," window enter:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Cluster name"),": enter the name of your choice for your cluster."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Description"),": enter a description to identify better your cluster."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Production cluster"),": select this option if your cluster will be used for production. Note: Karpenter is currently only available for non-production clusters."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Region"),": select the geographical area in which you want your cluster to be hosted."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Credentials"),": select one of the existing cloud provider credentials or add a new one by clicking on ",Object(o.b)("inlineCode",{parentName:"li"},"New Credentials"),". In the New credentials window, add the credentials that you have generated on your cloud provider console (",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/#attach-aws-credentials"}),"Procedure for AWS account"),"). Added credentials can be used later to create and manage additional cluster.")),Object(o.b)("p",null,"To confirm, click ",Object(o.b)("inlineCode",{parentName:"p"},"Next"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Set Resources")," window, select:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Karpenter"),": Toggle the switch to enable Karpenter on your AWS EKS cluster"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Instance types scopes"),": By editing it, you can apply different filters to the node architectures, categories, families, and sizes. On the right, you can view all the instance types that match the applied filters. This means Karpenter will be able to spawn nodes on any of the listed instance types.",Object(o.b)("ul",{parentName:"li"},Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Architectures"),": by default both ",Object(o.b)("inlineCode",{parentName:"li"},"AMD64")," and ",Object(o.b)("inlineCode",{parentName:"li"},"ARM64")," architectures are selected."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Default build architecture"),": by default ",Object(o.b)("inlineCode",{parentName:"li"},"AMD64"),". If you build your application with the Qovery CI, your application will be built using this architecture by default."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Families"),": by default all families are selected."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Sizes"),": by default all sizes are selected."))),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Spot instances"),": In order to reduce even more your costs, you can also enable the spot instances on your clusters. Spot instances cost up to 90% less compared to On-Demand prices. But keep in mind that spot instances can be terminated by the cloud provider at any time. Check this ",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"https://aws.amazon.com/ec2/spot/"}),"documentation")," for more information. Even if this flag is enabled, the statefulsets won't run on spot instances."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Disk size"),": select the size of the disks to be attached to your cluster instances (to locally store container images etc..).")),Object(o.b)("br",null),Object(o.b)(s.a,{type:"warning",mdxType:"Alert"},"Instance type selection from your Qovery Console has direct consequences on your cloud provider\u2019s bill. While Qovery allows you to switch to a different instance type whenever you want, it is your sole responsibility to keep an eye on your infrastructure costs, especially when you want to upsize.",Object(o.b)("p",null,"Please be aware that changing the instance type or disk size might cause a downtime for your service."),Object(o.b)("p",null,"For more information on the instance types provided by each cloud provider and their associated pricing, see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#what-are-the-different-instance-types-available-when-creating-a-cluster"}),"What are the different instance types available when creating a cluster?")),Object(o.b)("p",null,"Also, before downsizing, you need to ensure that your applications will still have enough resources to run correctly.")),Object(o.b)("br",null),Object(o.b)("p",null,"To confirm, click ",Object(o.b)("inlineCode",{parentName:"p"},"Next"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Features")," step, select the features you want to enable on your cluster."),Object(o.b)("p",null,"If you want to manage the network layer of your cluster by yourself, you can switch VPC mode to ",Object(o.b)("inlineCode",{parentName:"p"},"Deploy on my existing VPC")," to use your own VPC instead of the one provided by Qovery."),Object(o.b)(s.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"These options can only be configured during cluster creation and cannot be modified later.")),Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"vpc managed by qovery",placeholder:"Select a VPC mode",select:!1,size:null,values:[{group:"Features",label:"VPC managed by Qovery",value:"vpc managed by qovery"},{group:"Features",label:"Use your existing VPC",value:"use existing vpc"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"vpc managed by qovery",mdxType:"TabItem"},Object(o.b)("h4",{id:"static-ip"},"Static IP"),Object(o.b)("p",null,"By default, when your cluster is created, its worker nodes are allocated public IP addresses, which are used for external communication. For improved security and control, the ",Object(o.b)("strong",{parentName:"p"},"Static IP")," feature allows you to ensure that outbound traffic from your cluster uses specific IP addresses."),Object(o.b)("p",null,"Here is what will be deployed on your cluster:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Nat Gateways"),Object(o.b)("li",{parentName:"ul"},"Elastic IPs"),Object(o.b)("li",{parentName:"ul"},"Private subnets")),Object(o.b)("p",null,"Once set up, here is the procedure to find your static IP addresses on ",Object(o.b)("inlineCode",{parentName:"p"},"AWS"),":"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"On your AWS account, select the VPC service."),Object(o.b)("li",{parentName:"ul"},"On the left menu, you\u2019ll find Elastic IP addresses. Once on it, in the Allocated IPv4 address column, you\u2019ll have your public IPs.")),Object(o.b)(s.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you work in a sensitive business area such as financial technology, enabling the ",Object(o.b)("strong",{parentName:"p"},"Static IP")," feature can help fulfil the security requirements of some of the external services you use, therefore making it easier for you to get whitelisted by them."),Object(o.b)("p",null,"This feature has been activated by default. Since February 1, 2024, AWS charge public IPv4 Addresses. Disabling it may cost you more, depending on the number of nodes in your cluster. Check this ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://aws.amazon.com/blogs/aws/new-aws-public-ipv4-address-charge-public-ip-insights/"}),"link")," for more information.")),Object(o.b)("h4",{id:"custom-vpc-subnet"},"Custom VPC Subnet"),Object(o.b)("p",null,"Virtual Private Cloud (VPC) peering allows you to set up a connection between your Qovery VPC and another VPC on your AWS account. This way, you can access resources stored on your AWS VPC directly from your Qovery applications."),Object(o.b)("p",null,"A VPC can only be used if it has at least one range of IP addresses called a ",Object(o.b)("strong",{parentName:"p"},"subnet"),". When you create a cluster, Qovery automatically picks a default subnet for it. However, to perform VPC peering, you may want to define which specific VPC subnet you want to use, so that you can avoid any conflicting settings. To do so, you can enable the ",Object(o.b)("strong",{parentName:"p"},"Custom VPC Subnet")," feature on your cluster. For more information on how to set up VPC peering, ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://hub.qovery.com/guides/tutorial/aws-vpc-peering-with-qovery/"}),"see our dedicated tutorial"),".")),Object(o.b)(c.a,{value:"use existing vpc",mdxType:"TabItem"},Object(o.b)("p",null,"You have to specify the ",Object(o.b)("inlineCode",{parentName:"p"},"VPC id")," (1) and ensure that in your VPC settings you have enabled the ",Object(o.b)("inlineCode",{parentName:"p"},"DNS hostnames")," (2):"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/existing_vpc_aws_dns_hostnames.png",alt:"Existing VPC AWS DNS Hostnmaes"})),Object(o.b)("p",null,"Then you have to specify the different subnets ids:"),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"EKS"),":"),Object(o.b)("p",null,"The EKS subnets are mandatory, you have to specify at least ",Object(o.b)("strong",{parentName:"p"},"one subnet id per zone")," (1) and ensure you have enabled the ",Object(o.b)("strong",{parentName:"p"},"auto-assign public IPv4 address")," setting on your subnets (2)."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/existing_vpc_aws_auto_assign.png",alt:"Existing VPC AWS DNS Hostnmaes"})),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"Managed databases"),":"),Object(o.b)("p",null,"This section is exclusively for enabling managed databases (container databases will be enabled by default)."),Object(o.b)("p",null,"Depending on the managed databases you want to you use (",Object(o.b)("strong",{parentName:"p"},"MongoDB"),", ",Object(o.b)("strong",{parentName:"p"},"RDS:MySQL/PostgreSQL")," and ",Object(o.b)("strong",{parentName:"p"},"Redis"),"), specify at least one subnet id per zone.")))),Object(o.b)("li",null,Object(o.b)("p",null,"In the ",Object(o.b)("inlineCode",{parentName:"p"},"Ready to install your cluster")," window, check that the services needed to install your cluster are correct."),Object(o.b)("p",null,"You can now press the ",Object(o.b)("inlineCode",{parentName:"p"},"Create and Install")," button."),Object(o.b)("p",null,"Your cluster is now displayed in your organization settings, featuring the ",Object(o.b)("inlineCode",{parentName:"p"},"Installing...")," status (orange status). Once your cluster is properly installed, its status turns to green and you will be able to deploy your applications on it."),Object(o.b)("p",null,"You can follow the execution of the action via the cluster status and/or by accessing the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#logs"}),"Cluster Logs"))))),Object(o.b)("h3",{id:"migrating-from-aws-with-auto-scaler-to-aws-with-karpenter"},"Migrating from AWS with auto-scaler to AWS with Karpenter"),Object(o.b)(s.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"A SQS queue will be created. Before deploying your cluster, update the IAM permissions of the Qovery user, make sure to use the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://hub.qovery.com/files/qovery-iam-aws.json"}),"latest version here")," to add the permission on SQS.")),Object(o.b)("p",null,"You can easily activate Karpenter on your non-production existing cluster by following this process:"),Object(o.b)(l.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Open your ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery Console"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"On the left menu bar, click on the Cluster page.")),Object(o.b)("li",null,Object(o.b)("p",null,"To access your cluster settings, click on the wheel button:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/cluster_settings.png",alt:"Display Cluster Settings"}))),Object(o.b)("li",null,Object(o.b)("p",null,"Access to ",Object(o.b)("inlineCode",{parentName:"p"},"Resources")," section and switch on the toggle ",Object(o.b)("inlineCode",{parentName:"p"},"Activate Karpenter"))),Object(o.b)("li",null,Object(o.b)("p",null,"Update your cluster by selecting the action ",Object(o.b)("inlineCode",{parentName:"p"},"Update")," from the drop-down menu.")),Object(o.b)("li",null,Object(o.b)("p",null,"Once the update is complete, your cluster will be running on Karpenter. By default, only the instance types selected when you created your AWS cluster with the auto-scaler will be configured. You can add additional instance types by editing the instance types in the resources section.")))),Object(o.b)("h3",{id:"managing-your-cluster-settings"},"Managing your Cluster Settings"),Object(o.b)("p",null,"To manage the settings of an existing cluster:"),Object(o.b)(l.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Open your ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery Console"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"On the left menu bar, click on the Cluster page.")),Object(o.b)("li",null,Object(o.b)("p",null,"To access your cluster settings, click on the wheel button:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/configuration/clusters/cluster_settings.png",alt:"Display Cluster Settings"}))))),Object(o.b)("p",null,"Below you can find a description of each section"),Object(o.b)("h4",{id:"general"},"General"),Object(o.b)("p",null,"The ",Object(o.b)("inlineCode",{parentName:"p"},"General")," tab allows you to define high-level information on your cluster:"),Object(o.b)("table",null,Object(o.b)("thead",{parentName:"table"},Object(o.b)("tr",{parentName:"thead"},Object(o.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Item"),Object(o.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Description"))),Object(o.b)("tbody",{parentName:"table"},Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Cluster Name"),Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To edit the name of your cluster.")),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Description"),Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To enter or edit the description of your cluster.")),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Production Cluster"),Object(o.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"To enter or edit the production flag of your cluster.")))),Object(o.b)("h4",{id:"credentials"},"Credentials"),Object(o.b)("p",null,"Here you can manage here the cloud provider credentials associated with your cluster."),Object(o.b)("p",null,"If you need to change the credentials:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"generate a new set of credentials on your cloud provider(",Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/#attach-aws-credentials"}),"Procedure for AWS account"),")"),Object(o.b)("li",{parentName:"ul"},'create the new credential on the Qovery by opening the drop-down and selecting "New Credentials"')),Object(o.b)("p",null,"Once created and associated, you need to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#updating-a-cluster"}),"updating your cluster")," to apply the change."),Object(o.b)("h4",{id:"resources"},"Resources"),Object(o.b)("p",null,"Qovery allows you to modify the resources allocated for your cluster:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"The list of the instance types"),Object(o.b)("li",{parentName:"ul"},"The spot instances activation"),Object(o.b)("li",{parentName:"ul"},"The ",Object(o.b)("inlineCode",{parentName:"li"},"Node disk size (GB)")," field, enter the disk capacity you want to allocate to your worker node(s) (meaning how much data, in gigabytes, you want each worker node to be able to hold).")),Object(o.b)(s.a,{type:"warning",mdxType:"Alert"},"Instance type selection from your Qovery Console has direct consequences on your cloud provider\u2019s bill. While Qovery allows you to switch to a different instance type whenever you want, it is your sole responsibility to keep an eye on your infrastructure costs, especially when you want to upsize.",Object(o.b)("p",null,"For more information on the instance types provided by each cloud provider and their associated pricing, see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/clusters/#what-are-the-different-instance-types-available-when-creating-a-cluster"}),"What are the different instance types available when creating a cluster?"))),Object(o.b)("br",null),Object(o.b)("h4",{id:"image-registry"},"Image registry"),Object(o.b)("p",null,"In this tab, you will see that a container registry already exist (called ",Object(o.b)("inlineCode",{parentName:"p"},"registry-{$UIID}"),").\nThis is your cloud provider container registry used by Qovery to manage the deployment of your applications by mirroring the docker images."),Object(o.b)("p",null,"The credentials configured on this registry are the one used to create the cluster. But you can still update them if you prefer to manage them separately (dedicated pair of creds just to access the registry)."),Object(o.b)("p",null,"Check ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/image-mirroring/"}),"this link")," for more information."),Object(o.b)("h4",{id:"features"},"Features"),Object(o.b)("p",null,"The ",Object(o.b)("inlineCode",{parentName:"p"},"Features")," tab in your cluster settings allows you to check if the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"#static-ip"}),Object(o.b)("strong",{parentName:"a"},"Static IP")),", ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"#custom-vpc-subnet"}),Object(o.b)("strong",{parentName:"a"},"Custom VPC subnet")),", ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"#use-existing-vpc"}),Object(o.b)("strong",{parentName:"a"},"Deploy on existing VPC"))," features are enabled on your cluster. The enabled features cannot be changed after the creation of the cluster."),Object(o.b)("h4",{id:"network"},"Network"),Object(o.b)("p",null,"The ",Object(o.b)("inlineCode",{parentName:"p"},"Network")," tab in your cluster settings allows you to update your Qovery VPC route table so that you can perform VPC peering. For step-by-step guidelines on how to set up VPC peering, ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://hub.qovery.com/guides/tutorial/aws-vpc-peering-with-qovery/"}),"see our dedicated tutorial"),"."))}h.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),o=n(463),i=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,c=e.type,l=null;switch(c){case"danger":l="alert-triangle";break;case"success":l="check-circle";break;case"warning":l="alert-triangle";break;default:l="info"}return r.a.createElement("div",{className:i()(n,"alert","alert--"+c,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:i()("feather","icon-"+(o||l))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),o=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},470:function(e,t,n){"use strict";var a=n(1),r=n(0),o=n.n(r),i=n(39),c=n(474),l=n(20),s=n.n(l);t.a=function(e){var t,n=e.to,l=e.href,u=n||l,b=Object(c.a)(u),p=Object(r.useRef)(!1),d=s.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!d&&b&&window.docusaurus.prefetch(u),function(){d&&t&&t.disconnect()}}),[u,d,b]),u&&b?o.a.createElement(i.b,Object(a.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(u),p.current=!0)},innerRef:function(e){var n,a;d&&e&&b&&(n=e,a=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:u})):o.a.createElement("a",Object(a.a)({},e,{href:u}))}},472:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(463),n(471)),i=n.n(o);n(133);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,l={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},s="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(l),u=Object(a.useState)(null),b=u[0],p=u[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!b&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:s,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==b&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=n(470),i=n(463),c=n.n(i);n(134);t.a=function(e){var t=e.children,n=e.className,a=e.badge,i=e.leftIcon,l=e.rightIcon,s=e.size,u=e.target,b=e.to,p=c()("jump-to","jump-to--"+s,n),d=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},i&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+i})),r.a.createElement("div",{className:"jump-to--main"},a?r.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(l||"chevron-right")+" arrow"}))));return u?r.a.createElement("a",{href:b,target:u,className:p},d):r.a.createElement(o.a,{to:b,className:p},d)}},474:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},477:function(e,t,n){"use strict";var a=n(1),r=(n(480),n(479),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),i=n(483),c=n(463),l=n.n(c),s=n(471),u=n.n(s),b=n(482),p=37,d=39;function h(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,i=e.handleKeydown,c=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:l()("tabs",r,{"tabs--block":t}),style:c},s.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:l()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return i(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function m(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,c=e.values,l=c;if(l[0].group){var s=_.groupBy(l,"group");l=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return o.a.createElement(i.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:l,isClearable:n,placeholder:t,value:c.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,c=e.label,l=e.placeholder,s=e.select,y=e.size,g=(e.style,e.values),f=e.urlKey,O=Object(b.a)(),j=O.tabGroupChoices,w=O.setTabGroupChoices,v=Object(r.useState)(n),N=v[0],C=v[1];if(null!=i){var k=j[i];null!=k&&k!==N&&C(k)}var S=function(e){C(e),null!=i&&w(i,e)},E=[],P=function(e,t,n){switch(n.keyCode){case d:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=u.a.parse(window.location.search);e[f]&&C(e[f])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(y||"md")},c&&o.a.createElement("div",{className:"margin-vert--sm"},c),g.length>1&&(s?o.a.createElement(m,Object(a.a)({changeSelectedValue:S,handleKeydown:P,placeholder:l,selectedValue:N,size:y,tabRefs:E},e)):o.a.createElement(h,Object(a.a)({changeSelectedValue:S,handleKeydown:P,selectedValue:N,tabRefs:E},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},478:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/b479fc9a.53c20524.js b/b479fc9a.53c20524.js new file mode 100644 index 0000000000..19a14241d1 --- /dev/null +++ b/b479fc9a.53c20524.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[212],{363:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return u})),a.d(t,"metadata",(function(){return d})),a.d(t,"rightToc",(function(){return b})),a.d(t,"default",(function(){return p}));var n=a(1),o=a(9),r=(a(0),a(465)),i=a(472),l=a(477),c=a(478),s=(a(464),a(469)),u=(a(473),{last_modified_on:"2024-11-30",$schema:"/.meta/.schemas/guides.json",title:"Kubernetes observability and monitoring with Datadog",description:"How to integrate Datadog with Kubernetes on Qovery.",author_github:"https://github.com/acarranoqovery",tags:["type: tutorial","technology: qovery"],hide_pagination:!0}),d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Kubernetes observability and monitoring with Datadog",description:"How to integrate Datadog with Kubernetes on Qovery.",permalink:"/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog",readingTime:"5 min read",source:"@site/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Kubernetes observability and monitoring with Datadog",truncated:!1,prevItem:{title:"Integrate your application logs to Cloudwatch",permalink:"/guides/tutorial/cloudwatch-integration"},nextItem:{title:"Managing Environment Variables in React (create-react-app)",permalink:"/guides/tutorial/managing-env-variables-in-create-react-app"}},b=[{value:"Installation",id:"installation",children:[]},{value:"Conclusion",id:"conclusion",children:[]}],m={rightToc:b};function p(e){var t=e.components,a=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},m,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"While Qovery will soon provide basic metrics on apps resources usage, you might need a more advanced view on what happens on your infrastructure. There are many solutions on the market, one of them being Datadog.\nDatadog is one of the leading platforms for monitoring and observability, and it is pretty easy to integrate it with Qovery."),Object(r.b)(s.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have a Qovery cluster running"),Object(r.b)("li",{parentName:"ul"},"You have a dedicated Qovery project and environment to deploy Datadog (example: Project=Tooling, Environment=Production)"),Object(r.b)("li",{parentName:"ul"},"You have a Datadog account"),Object(r.b)("li",{parentName:"ul"},"You have already created a ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://docs.datadoghq.com/account_management/api-app-keys/#api-keys"}),"Datadog API Key")))),Object(r.b)("h2",{id:"installation"},"Installation"),Object(r.b)("p",null,"In this tutorial, we will install the Datadog agent on a Qovery cluster to gather metrics about infrastructure and applications."),Object(r.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(r.b)("ol",null,Object(r.b)("li",null,Object(r.b)("h4",{id:"add-the-datadog-helm-repository"},"Add the Datadog helm repository"),Object(r.b)("p",null,"Add the Datadog helm repository in your Qovery settings by following ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/organization/helm-repository/"}),"this documentation")),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Repository name: ",Object(r.b)("inlineCode",{parentName:"li"},"Datadog")),Object(r.b)("li",{parentName:"ul"},"Kind: ",Object(r.b)("inlineCode",{parentName:"li"},"HTTPS")),Object(r.b)("li",{parentName:"ul"},"Repository URL: ",Object(r.b)("inlineCode",{parentName:"li"},"https://helm.datadoghq.com")))),Object(r.b)("li",null,Object(r.b)("h4",{id:"create-the-datadog-service-within-qovery"},"Create the datadog service within Qovery"),Object(r.b)("p",null,"Create the Datadog helm service in the Qovery environment of your choice (preferrably within a dedicated Tooling project) by following ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/helm/"}),"this documentation")," and these values:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"General:",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Application name: ",Object(r.b)("inlineCode",{parentName:"li"},"Datadog")),Object(r.b)("li",{parentName:"ul"},"Source:",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Helm source: ",Object(r.b)("inlineCode",{parentName:"li"},"Helm repository")),Object(r.b)("li",{parentName:"ul"},"Repository: ",Object(r.b)("inlineCode",{parentName:"li"},"Datadog")," (the name given during the datadog helm repository added in the previous step)"),Object(r.b)("li",{parentName:"ul"},"Chart name: ",Object(r.b)("inlineCode",{parentName:"li"},"datadog")),Object(r.b)("li",{parentName:"ul"},"Version: ",Object(r.b)("inlineCode",{parentName:"li"},"3.49.5")," (this is the version we used for this setup, update it based on the chosen version)"),Object(r.b)("li",{parentName:"ul"},"Allow cluster-wide resources \u2714\ufe0f"))))),Object(r.b)("li",{parentName:"ul"},"Values",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Values override as file:"),Object(r.b)("li",{parentName:"ul"},"File source: ",Object(r.b)("inlineCode",{parentName:"li"},"Raw YAML")),Object(r.b)("li",{parentName:"ul"},"Raw YAML:")))),Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"default",placeholder:"Select your cluster type",select:!1,size:null,values:[{group:"Cluster",label:"Default",value:"default"},{group:"Cluster",label:"AWS with Karpenter",value:"karpenter"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"default",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"# The following YAML contains the minimum configuration required to deploy the Datadog Agent\n# on your cluster. Update it accordingly to your needs\ndatadog:\n # here we use a Qovery secret to retrieve the Datadog API Key (See next step)\n apiKey: qovery.env.DD_API_KEY\n # Update the site depending on where you want to store your data in Datadog\n site: datadoghq.eu\n # Update the cluster name with the name of your choice\n clusterName: qoverycluster\n"))),Object(r.b)(c.a,{value:"EKS with karpenter",mdxType:"TabItem"},Object(r.b)("p",null,"To ensure every node created by Karpenter is monitored by Datadog, we need to configure a priority class."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'# The following YAML contains the minimum configuration required to deploy the Datadog Agent\n# on your cluster. Update it accordingly to your needs\ndatadog:\n # here we use a Qovery secret to retrieve the Datadog API Key (See next step)\n apiKey: qovery.env.DD_API_KEY\n # Update the site depending on where you want to store your data in Datadog\n site: datadoghq.eu\n # Update the cluster name with the name of your choice\n clusterName: qoverycluster\nagents:\n tolerations:\n - operator: Exists\n affinity:\n nodeAffinity:\n requiredDuringSchedulingIgnoredDuringExecution:\n nodeSelectorTerms:\n - matchExpressions:\n - key: eks.amazonaws.com/compute-type\n operator: NotIn\n values:\n - fargate\n priorityClassCreate: true\n # Update the priority class name as you want\n priorityClassName: "datadog-karpenter-priorityclass"\n priorityClassValue: 1000\n')))),Object(r.b)("p",null,"There are many other values you can set and modify the Datadog agent behaviour. For advanced usage, check: ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Datadog/helm-charts/blob/main/charts/datadog/values.yaml"}),"https://github.com/Datadog/helm-charts/blob/main/charts/datadog/values.yaml")),Object(r.b)("p",null,"Now get to the last step and just ",Object(r.b)("inlineCode",{parentName:"p"},"Create")," the service on Qovery.")),Object(r.b)("li",null,Object(r.b)("h4",{id:"store-the-datadog-api-key-as-secret"},"Store the Datadog API Key as secret"),Object(r.b)("p",null,"In the previous step we have assigned the macro ",Object(r.b)("inlineCode",{parentName:"p"},"qovery.env.DD_API_KEY")," to the API Key value. In this step we will create this secret within the Qovery console."),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Open the service overview of the created Datadog service"),Object(r.b)("li",{parentName:"ul"},"Enter the ",Object(r.b)("inlineCode",{parentName:"li"},"Variables")," section"),Object(r.b)("li",{parentName:"ul"},"Add a new Variable with:",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Variable = DD_API_KEY"),Object(r.b)("li",{parentName:"ul"},"Value = "),Object(r.b)("li",{parentName:"ul"},"Scope = Service (so that it is accessible only to this service)"),Object(r.b)("li",{parentName:"ul"},"Secret variable \u2714\ufe0f")))),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/datadog-secret.png",alt:"Datadog - API Key"})),Object(r.b)("p",null,"If you need more information on how to manage your environment variables, have a look at ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"this documentation"))),Object(r.b)("li",null,Object(r.b)("h4",{id:"deploy-your-chart"},"Deploy your chart"),Object(r.b)("p",null,"Open the ",Object(r.b)("inlineCode",{parentName:"p"},"Play")," button and trigger the deployment of your chart (see point 1 in the picture below)."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/deploy.png",alt:"Datadog - Deploy"})),Object(r.b)("p",null,"You can follow the deployment and access the deployment logs by pressing the ",Object(r.b)("inlineCode",{parentName:"p"},"Log")," button (see point 2 in the picutre above)."),Object(r.b)("p",null,"Once the deployment is completed, you should see the Datadog agent pods and their status directly within the Qovery console."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/datadog-pods.png",alt:"Datadog - Pods"})),Object(r.b)("p",null,"You can also look at the Pod logs by pressing the ",Object(r.b)("inlineCode",{parentName:"p"},"Log")," button.")),Object(r.b)("li",null,Object(r.b)("h4",{id:"verify-the-setup-on-datadog"},"Verify the setup on Datadog"),Object(r.b)("p",null,"Access again your Datadog interface and access the Infrastructure > Containers > Kubernetes sections. You should now see the data coming from your Qovery cluster"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/datadog-console.png",alt:"Datadog - Console"}))))),Object(r.b)("h2",{id:"conclusion"},"Conclusion"),Object(r.b)("p",null,"You now have Datadog agent running on your Qovery cluster. You can check their ",Object(r.b)("inlineCode",{parentName:"p"},"Getting Started")," guide to familiarize yourself with the product: ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://docs.datadoghq.com/fr/getting_started"}),"https://docs.datadoghq.com/fr/getting_started"),"."))}p.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),o=a.n(n),r=a(463),i=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return o.a.createElement("div",{className:i()(a,"alert","alert--"+l,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||c))}),t)}},468:function(e,t,a){var n=a(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||a(10)&&n(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),o=a.n(n),r=a(464);t.a=function(e){var t=e.children,a=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),o=a(0),r=a.n(o),i=a(39),l=a(474),c=a(20),s=a.n(c);t.a=function(e){var t,a=e.to,c=e.href,u=a||c,d=Object(l.a)(u),b=Object(o.useRef)(!1),m=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!m&&d&&window.docusaurus.prefetch(u),function(){m&&t&&t.disconnect()}}),[u,m,d]),u&&d?r.a.createElement(i.b,Object(n.a)({},e,{onMouseEnter:function(){b.current||(window.docusaurus.preload(u),b.current=!0)},innerRef:function(e){var a,n;m&&e&&d&&(a=e,n=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:u})):r.a.createElement("a",Object(n.a)({},e,{href:u}))}},472:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=(a(463),a(471)),i=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,c={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},s="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(c),u=Object(n.useState)(null),d=u[0],b=u[1];return o.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!d&&o.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",o.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return b("yes")}},"Yes"),"\xa0\xa0",o.a.createElement("a",{href:s,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==d&&o.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",o.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=a(470),i=a(463),l=a.n(i);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,i=e.leftIcon,c=e.rightIcon,s=e.size,u=e.target,d=e.to,b=l()("jump-to","jump-to--"+s,a),m=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},i&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+i})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(c||"chevron-right")+" arrow"}))));return u?o.a.createElement("a",{href:d,target:u,className:b},m):o.a.createElement(r.a,{to:d,className:b},m)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),o=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),r=a.n(o),i=a(483),l=a(463),c=a.n(l),s=a(471),u=a.n(s),d=a(482),b=37,m=39;function p(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,s=e.values,u=e.selectedValue,d=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",o,{"tabs--block":t}),style:l},s.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return d.push(e)},onKeyDown:function(e){return i(d,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,o=e.size,l=e.values,c=l;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:l.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,i=e.groupId,l=e.label,c=e.placeholder,s=e.select,g=e.size,y=(e.style,e.values),f=e.urlKey,v=Object(d.a)(),j=v.tabGroupChoices,O=v.setTabGroupChoices,w=Object(o.useState)(a),N=w[0],D=w[1];if(null!=i){var k=j[i];null!=k&&k!==N&&D(k)}var E=function(e){D(e),null!=i&&O(i,e)},C=[],I=function(e,t,a){switch(a.keyCode){case m:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case b:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=u.a.parse(window.location.search);e[f]&&D(e[f])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(g||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),y.length>1&&(s?r.a.createElement(h,Object(n.a)({changeSelectedValue:E,handleKeydown:I,placeholder:c,selectedValue:N,size:g,tabRefs:C},e)):r.a.createElement(p,Object(n.a)({changeSelectedValue:E,handleKeydown:I,selectedValue:N,tabRefs:C},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},478:function(e,t,a){"use strict";var n=a(0),o=a.n(n);t.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/b479fc9a.f1ee7dde.js b/b479fc9a.f1ee7dde.js deleted file mode 100644 index 7d00b8e76d..0000000000 --- a/b479fc9a.f1ee7dde.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[212],{363:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return u})),a.d(t,"metadata",(function(){return d})),a.d(t,"rightToc",(function(){return b})),a.d(t,"default",(function(){return p}));var n=a(1),o=a(9),r=(a(0),a(465)),i=a(472),l=a(477),c=a(479),s=(a(464),a(469)),u=(a(473),{last_modified_on:"2024-11-28",$schema:"/.meta/.schemas/guides.json",title:"Kubernetes observability and monitoring with Datadog",description:"How to integrate Datadog with Kubernetes on Qovery.",author_github:"https://github.com/acarranoqovery",tags:["type: tutorial","technology: qovery"],hide_pagination:!0}),d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Kubernetes observability and monitoring with Datadog",description:"How to integrate Datadog with Kubernetes on Qovery.",permalink:"/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog",readingTime:"5 min read",source:"@site/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Kubernetes observability and monitoring with Datadog",truncated:!1,prevItem:{title:"Integrate your application logs to Cloudwatch",permalink:"/guides/tutorial/cloudwatch-integration"},nextItem:{title:"Managing Environment Variables in React (create-react-app)",permalink:"/guides/tutorial/managing-env-variables-in-create-react-app"}},b=[{value:"Installation",id:"installation",children:[]},{value:"Conclusion",id:"conclusion",children:[]}],m={rightToc:b};function p(e){var t=e.components,a=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},m,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"While Qovery will soon provide basic metrics on apps resources usage, you might need a more advanced view on what happens on your infrastructure. There are many solutions on the market, one of them being Datadog.\nDatadog is one of the leading platforms for monitoring and observability, and it's pretty easy to integrate it with Qovery."),Object(r.b)(s.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have a Qovery cluster running"),Object(r.b)("li",{parentName:"ul"},"You have a dedicated Qovery project and environment to deploy Datadog (example: Project=Tooling, Environment=Production)"),Object(r.b)("li",{parentName:"ul"},"You have a Datadog account"),Object(r.b)("li",{parentName:"ul"},"You have already created a ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://docs.datadoghq.com/account_management/api-app-keys/#api-keys"}),"Datadog API Key")))),Object(r.b)("h2",{id:"installation"},"Installation"),Object(r.b)("p",null,"In this tutorial, we will install the Datadog agent on a Qovery cluster to gather metrics about infrastructure and applications."),Object(r.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(r.b)("ol",null,Object(r.b)("li",null,Object(r.b)("h4",{id:"add-the-datadog-helm-repository"},"Add the Datadog helm repository"),Object(r.b)("p",null,"Add the Datadog helm repository in your Qovery settings by following ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/organization/helm-repository/"}),"this documentation")),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Repository name: ",Object(r.b)("inlineCode",{parentName:"li"},"Datadog")),Object(r.b)("li",{parentName:"ul"},"Kind: ",Object(r.b)("inlineCode",{parentName:"li"},"HTTPS")),Object(r.b)("li",{parentName:"ul"},"Repository URL: ",Object(r.b)("inlineCode",{parentName:"li"},"https://helm.datadoghq.com")))),Object(r.b)("li",null,Object(r.b)("h4",{id:"create-the-datadog-service-within-qovery"},"Create the datadog service within Qovery"),Object(r.b)("p",null,"Create the Datadog helm service in the Qovery environment of your choice (preferrably within a dedicated Tooling project) by following ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/helm/"}),"this documentation")," and these values:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"General:",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Application name: ",Object(r.b)("inlineCode",{parentName:"li"},"Datadog")),Object(r.b)("li",{parentName:"ul"},"Source:",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Helm source: ",Object(r.b)("inlineCode",{parentName:"li"},"Helm repository")),Object(r.b)("li",{parentName:"ul"},"Repository: ",Object(r.b)("inlineCode",{parentName:"li"},"Datadog")," (the name given during the datadog helm repository added in the previous step)"),Object(r.b)("li",{parentName:"ul"},"Chart name: ",Object(r.b)("inlineCode",{parentName:"li"},"datadog")),Object(r.b)("li",{parentName:"ul"},"Version: ",Object(r.b)("inlineCode",{parentName:"li"},"3.49.5")," (this is the version we used for this setup, update it based on the chosen version)"),Object(r.b)("li",{parentName:"ul"},"Allow cluster-wide resources \u2714\ufe0f"))))),Object(r.b)("li",{parentName:"ul"},"Values",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Values override as file:"),Object(r.b)("li",{parentName:"ul"},"File source: ",Object(r.b)("inlineCode",{parentName:"li"},"Raw YAML")),Object(r.b)("li",{parentName:"ul"},"Raw YAML:")))),Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"default",placeholder:"Select your cluster type",select:!1,size:null,values:[{group:"Cluster",label:"Default",value:"default"},{group:"Cluster",label:"AWS with Karpenter",value:"karpenter"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"default",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"# The following YAML contains the minimum configuration required to deploy the Datadog Agent\n# on your cluster. Update it accordingly to your needs\ndatadog:\n # here we use a Qovery secret to retrieve the Datadog API Key (See next step)\n apiKey: qovery.env.DD_API_KEY\n # Update the site depending on where you want to store your data in Datadog\n site: datadoghq.eu\n # Update the cluster name with the name of your choice\n clusterName: qoverycluster\n"))),Object(r.b)(c.a,{value:"karpenter",mdxType:"TabItem"},Object(r.b)("p",null,"To ensure every node created by Karpenter is monitored by Datadog, we need to configure a priority class."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'# The following YAML contains the minimum configuration required to deploy the Datadog Agent\n# on your cluster. Update it accordingly to your needs\ndatadog:\n # here we use a Qovery secret to retrieve the Datadog API Key (See next step)\n apiKey: qovery.env.DD_API_KEY\n # Update the site depending on where you want to store your data in Datadog\n site: datadoghq.eu\n # Update the cluster name with the name of your choice\n clusterName: qoverycluster\nagents:\n tolerations:\n - operator: Exists\n affinity:\n nodeAffinity:\n requiredDuringSchedulingIgnoredDuringExecution:\n nodeSelectorTerms:\n - matchExpressions:\n - key: eks.amazonaws.com/compute-type\n operator: NotIn\n values:\n - fargate\n priorityClassCreate: true\n # Update the priority class name as you want\n priorityClassName: "datadog-karpenter-priorityclass"\n priorityClassValue: 1000\n')))),Object(r.b)("p",null,"There are many other values you can set and modify the Datadog agent behaviour. For advanced usage, check: ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Datadog/helm-charts/blob/main/charts/datadog/values.yaml"}),"https://github.com/Datadog/helm-charts/blob/main/charts/datadog/values.yaml")),Object(r.b)("p",null,"Now get to the last step and just ",Object(r.b)("inlineCode",{parentName:"p"},"Create")," the service on Qovery.")),Object(r.b)("li",null,Object(r.b)("h4",{id:"store-the-datadog-api-key-as-secret"},"Store the Datadog API Key as secret"),Object(r.b)("p",null,"In the previous step we have assigned the macro ",Object(r.b)("inlineCode",{parentName:"p"},"qovery.env.DD_API_KEY")," to the API Key value. In this step we will create this secret within the Qovery console."),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Open the service overview of the created Datadog service"),Object(r.b)("li",{parentName:"ul"},"Enter the ",Object(r.b)("inlineCode",{parentName:"li"},"Variables")," section"),Object(r.b)("li",{parentName:"ul"},"Add a new Variable with:",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Variable = DD_API_KEY"),Object(r.b)("li",{parentName:"ul"},"Value = "),Object(r.b)("li",{parentName:"ul"},"Scope = Service (so that it is accessible only to this service)"),Object(r.b)("li",{parentName:"ul"},"Secret variable \u2714\ufe0f")))),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/datadog-secret.png",alt:"Datadog - API Key"})),Object(r.b)("p",null,"If you need more information on how to manage your environment variables, have a look at ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"this documentation"))),Object(r.b)("li",null,Object(r.b)("h4",{id:"deploy-your-chart"},"Deploy your chart"),Object(r.b)("p",null,"Open the ",Object(r.b)("inlineCode",{parentName:"p"},"Play")," button and trigger the deployment of your chart (see point 1 in the picture below)."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/deploy.png",alt:"Datadog - Deploy"})),Object(r.b)("p",null,"You can follow the deployment and access the deployment logs by pressing the ",Object(r.b)("inlineCode",{parentName:"p"},"Log")," button (see point 2 in the picutre above)."),Object(r.b)("p",null,"Once the deployment is completed, you should see the Datadog agent pods and their status directly within the Qovery console."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/datadog-pods.png",alt:"Datadog - Pods"})),Object(r.b)("p",null,"You can also look at the Pod logs by pressing the ",Object(r.b)("inlineCode",{parentName:"p"},"Log")," button.")),Object(r.b)("li",null,Object(r.b)("h4",{id:"verify-the-setup-on-datadog"},"Verify the setup on Datadog"),Object(r.b)("p",null,"Access again your Datadog interface and access the Infrastructure > Containers > Kubernetes sections. You should now see the data coming from your Qovery cluster"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/datadog-console.png",alt:"Datadog - Console"}))))),Object(r.b)("h2",{id:"conclusion"},"Conclusion"),Object(r.b)("p",null,"You now have Datadog agent running on your Qovery cluster. You can check their ",Object(r.b)("inlineCode",{parentName:"p"},"Getting Started")," guide to familiarize yourself with the product: ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://docs.datadoghq.com/fr/getting_started"}),"https://docs.datadoghq.com/fr/getting_started"),"."))}p.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),o=a.n(n),r=a(463),i=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return o.a.createElement("div",{className:i()(a,"alert","alert--"+l,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||c))}),t)}},468:function(e,t,a){var n=a(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||a(10)&&n(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),o=a.n(n),r=a(464);t.a=function(e){var t=e.children,a=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),o=a(0),r=a.n(o),i=a(39),l=a(474),c=a(20),s=a.n(c);t.a=function(e){var t,a=e.to,c=e.href,u=a||c,d=Object(l.a)(u),b=Object(o.useRef)(!1),m=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!m&&d&&window.docusaurus.prefetch(u),function(){m&&t&&t.disconnect()}}),[u,m,d]),u&&d?r.a.createElement(i.b,Object(n.a)({},e,{onMouseEnter:function(){b.current||(window.docusaurus.preload(u),b.current=!0)},innerRef:function(e){var a,n;m&&e&&d&&(a=e,n=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:u})):r.a.createElement("a",Object(n.a)({},e,{href:u}))}},472:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=(a(463),a(471)),i=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,c={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},s="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(c),u=Object(n.useState)(null),d=u[0],b=u[1];return o.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!d&&o.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",o.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return b("yes")}},"Yes"),"\xa0\xa0",o.a.createElement("a",{href:s,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==d&&o.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",o.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=a(470),i=a(463),l=a.n(i);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,i=e.leftIcon,c=e.rightIcon,s=e.size,u=e.target,d=e.to,b=l()("jump-to","jump-to--"+s,a),m=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},i&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+i})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(c||"chevron-right")+" arrow"}))));return u?o.a.createElement("a",{href:d,target:u,className:b},m):o.a.createElement(r.a,{to:d,className:b},m)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),o=(a(481),a(478),a(52),a(29),a(22),a(21),a(0)),r=a.n(o),i=a(483),l=a(463),c=a.n(l),s=a(471),u=a.n(s),d=a(482),b=37,m=39;function p(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,s=e.values,u=e.selectedValue,d=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",o,{"tabs--block":t}),style:l},s.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return d.push(e)},onKeyDown:function(e){return i(d,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,o=e.size,l=e.values,c=l;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:l.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,i=e.groupId,l=e.label,c=e.placeholder,s=e.select,g=e.size,y=(e.style,e.values),f=e.urlKey,v=Object(d.a)(),j=v.tabGroupChoices,O=v.setTabGroupChoices,w=Object(o.useState)(a),N=w[0],D=w[1];if(null!=i){var k=j[i];null!=k&&k!==N&&D(k)}var E=function(e){D(e),null!=i&&O(i,e)},C=[],I=function(e,t,a){switch(a.keyCode){case m:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case b:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=u.a.parse(window.location.search);e[f]&&D(e[f])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(g||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),y.length>1&&(s?r.a.createElement(h,Object(n.a)({changeSelectedValue:E,handleKeydown:I,placeholder:c,selectedValue:N,size:g,tabRefs:C},e)):r.a.createElement(p,Object(n.a)({changeSelectedValue:E,handleKeydown:I,selectedValue:N,tabRefs:C},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},479:function(e,t,a){"use strict";var n=a(0),o=a.n(n);t.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/b49a87dd.854b6773.js b/b49a87dd.1e689a55.js similarity index 99% rename from b49a87dd.854b6773.js rename to b49a87dd.1e689a55.js index 936524d6e3..e8114d89e0 100644 --- a/b49a87dd.854b6773.js +++ b/b49a87dd.1e689a55.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[213],{364:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return u})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return d})),a.d(t,"default",(function(){return h}));var n,l=a(1),r=a(9),o=(a(0),a(465)),c=a(479),s=a(472),b=a(464),i=a(477),u={last_modified_on:"2024-07-12",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your GCP Kubernetes Service (GKE) cluster"},p={id:"getting-started/install-qovery/gcp/self-managed-cluster",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your GCP Kubernetes Service (GKE) cluster",source:"@site/docs/getting-started/install-qovery/gcp/self-managed-cluster.md",permalink:"/docs/getting-started/install-qovery/gcp/self-managed-cluster",sidebar:"docs",previous:{title:"Create Credentials",permalink:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/create-credentials"},next:{title:"Scaleway",permalink:"/docs/getting-started/install-qovery/scaleway"}},d=[{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Install Qovery on your GCP GKE cluster",id:"install-qovery-on-your-gcp-gke-cluster",children:[]},{value:"What's Next?",id:"whats-next",children:[]}],m=(n="Assumption",function(e){return console.warn("Component "+n+" was not imported, exported, or provided by MDXProvider as global scope"),Object(o.b)("div",e)}),y={rightToc:d};function h(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(l.a)({},y,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are not familiar with Kubernetes, we recommend you to use Qovery on a Managed Kubernetes cluster on ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/"}),"AWS"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/"}),"GCP"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/quickstart/"}),"Scaleway"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart/"}),"Azure"),", or contact us.")),Object(o.b)("p",null,"Qovery Self-Managed (or BYOK: Bring Your Own Kubernetes) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster.\nRead ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/blog/kubernetes-managed-by-qovery-vs-self-managed-byok"}),"this article")," to better understand the difference with the Managed Kubernetes by Qovery. In a nutshell, Qovery BYOK is for Kubernetes experts who want to manage their own Kubernetes cluster. In this version, Qovery does not manage the Kubernetes cluster for you."),Object(o.b)(b.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery automatically updates ",Object(o.b)("strong",{parentName:"p"},"ONLY")," the Qovery applications (agent, shell-agent etc..) via the Qovery Helm chart. With the self-managed offer it will be up to you to manage any dependency components (ingress, dns, logging...), making sure they run with the right version over time."),Object(o.b)("p",null,"The dependencies provided with the Qovery Helm chart are here to help you with the bootstrap, and are not maintained by Qovery. If you want to simplify the maintenance of your cluster, please look at ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/pricing/"}),"Qovery managed Kubernetes offer"),".")),Object(o.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(o.b)(m,{mdxType:"Assumption"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have a GCP GKE Kubernetes cluster up and running."),Object(o.b)("li",{parentName:"ul"},"You have a GCP GKE Kubernetes cluster with at least 4 CPUs and 8GB of RAM."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"kubectl")," installed and configured to access your GCP GKE Kubernetes cluster."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"helm")," installed."),Object(o.b)("li",{parentName:"ul"},"You have a Qovery account. If you don't have one, please sign up at ",Object(o.b)("a",Object(l.a)({parentName:"li"},{href:"https://start.qovery.com"}),"https://start.qovery.com")))),Object(o.b)("h2",{id:"install-qovery-on-your-gcp-gke-cluster"},"Install Qovery on your GCP GKE cluster"),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Follow ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/local/"}),"this guide")," to try Qovery on your local machine.")),Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"automatic",placeholder:"Install Qovery",select:!1,size:null,values:[{group:"Install",label:"Automatic",value:"automatic"},{group:"Install",label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"automatic",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery CLI by running the following command:"),Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(c.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("p",null,"Authenticate with Qovery by running the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your GCP GKE cluster:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"qovery cluster install\n")),Object(o.b)("p",null,"Respond to the prompts to install Qovery on your GCP GKE Kubernetes cluster."))))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://helm.sh"}),"Helm")," command line tool.")),Object(o.b)("li",null,Object(o.b)("p",null,"Add Qovery Helm repository."),Object(o.b)(b.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery Helm Chart is only available for users who have access to Qovery BYOK. ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/bring-your-own-kubernetes"}),"Request your access here"),".")),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm repo add qovery https://helm.qovery.com\nhelm repo update\n"))),Object(o.b)("li",null,Object(o.b)("p",null,"Login to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console"),", create a cluster of type ",Object(o.b)("inlineCode",{parentName:"p"},"Self-Managed"),". At the end of the flow you will be able to download the ",Object(o.b)("inlineCode",{parentName:"p"},"values.yaml")," file associated with this cluster.")),Object(o.b)("li",null,Object(o.b)("p",null,"Now you can customize your values.yaml file based on your need. Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),"."),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Make sure that all fields having value ",Object(o.b)("inlineCode",{parentName:"p"},"set-by-customer")," are filled.")),Object(o.b)("p",null,"Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Kubernetes cluster."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --wait --atomic --create-namespace -n qovery -f \\\n --set services.certificates.cert-manager-configs.enabled=false \\\n --set services.certificates.qovery-cert-manager-webhook.enabled=false \\\n --set services.qovery.qovery-cluster-agent.enabled=false \\\n --set services.qovery.qovery-engine.enabled=false \\\n qovery qovery/qovery\n")),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-n qovery"),": the namespace where Qovery and its dependencies will be installed"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"--set..."),": override (only for the first deployment time, if you want to use Cert-Manager) to let cert-manager install its CRDs"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-f your-values-file.yaml"),": the values file you've downloaded, overrided with the Qovery config and your custom config"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery/qovery"),": name of the chart to deploy"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery"),": name of the release")),Object(o.b)("p",null,"If you want to use Cert-Manager, you can remove the ",Object(o.b)("inlineCode",{parentName:"p"},"--set...")," for the future updates (or if already installed):"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --create-namespace -n qovery -f --wait --atomic qovery qovery/qovery\n"))))))),Object(o.b)("p",null,"That's it, you can now use Qovery on your GCP GKE cluster."),Object(o.b)("p",null,"Connect to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console")," to validate that Qovery is properly installed and start deploying your applications."),Object(o.b)("h2",{id:"whats-next"},"What's Next?"),Object(o.b)("p",null,"Now that you have Qovery installed on your Kubernetes cluster, you can check that Qovery is properly installed by following the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/validate-installation/"}),"Validate Installation")," guide."))}h.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),l=a.n(n),r=a(463),o=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,s=null;switch(c){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return l.a.createElement("div",{className:o()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:o()("feather","icon-"+(r||s))}),t)}},472:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(463),a(471)),o=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},b="https://github.com/qovery/documentation/issues/new?"+o.a.stringify(s),i=Object(n.useState)(null),u=i[0],p=i[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!u&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:b,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,t,a){"use strict";var n=a(1),l=(a(481),a(478),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),o=a(483),c=a(463),s=a.n(c),b=a(471),i=a.n(b),u=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,o=e.handleKeydown,c=e.style,b=e.values,i=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",l,{"tabs--block":t}),style:c},b.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":i===t,className:s()("tab-item",{"tab-item--active":i===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return o(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function y(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,c=e.values,s=c;if(s[0].group){var b=_.groupBy(s,"group");s=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return r.a.createElement(o.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:s,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,o=e.groupId,c=e.label,s=e.placeholder,b=e.select,h=e.size,v=(e.style,e.values),O=e.urlKey,g=Object(u.a)(),j=g.tabGroupChoices,f=g.setTabGroupChoices,w=Object(l.useState)(a),N=w[0],q=w[1];if(null!=o){var T=j[o];null!=T&&T!==N&&q(T)}var C=function(e){q(e),null!=o&&f(o,e)},k=[],Q=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=i.a.parse(window.location.search);e[O]&&q(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),v.length>1&&(b?r.a.createElement(y,Object(n.a)({changeSelectedValue:C,handleKeydown:Q,placeholder:s,selectedValue:N,size:h,tabRefs:k},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:C,handleKeydown:Q,selectedValue:N,tabRefs:k},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},479:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[213],{364:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return u})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return d})),a.d(t,"default",(function(){return h}));var n,l=a(1),r=a(9),o=(a(0),a(465)),c=a(478),s=a(472),b=a(464),i=a(477),u={last_modified_on:"2024-07-12",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your GCP Kubernetes Service (GKE) cluster"},p={id:"getting-started/install-qovery/gcp/self-managed-cluster",title:"Self-Managed Cluster",description:"Learn how to install and configure Qovery on your GCP Kubernetes Service (GKE) cluster",source:"@site/docs/getting-started/install-qovery/gcp/self-managed-cluster.md",permalink:"/docs/getting-started/install-qovery/gcp/self-managed-cluster",sidebar:"docs",previous:{title:"Create Credentials",permalink:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/create-credentials"},next:{title:"Scaleway",permalink:"/docs/getting-started/install-qovery/scaleway"}},d=[{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Install Qovery on your GCP GKE cluster",id:"install-qovery-on-your-gcp-gke-cluster",children:[]},{value:"What's Next?",id:"whats-next",children:[]}],m=(n="Assumption",function(e){return console.warn("Component "+n+" was not imported, exported, or provided by MDXProvider as global scope"),Object(o.b)("div",e)}),y={rightToc:d};function h(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(l.a)({},y,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are not familiar with Kubernetes, we recommend you to use Qovery on a Managed Kubernetes cluster on ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/"}),"AWS"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/"}),"GCP"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/quickstart/"}),"Scaleway"),", ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart/"}),"Azure"),", or contact us.")),Object(o.b)("p",null,"Qovery Self-Managed (or BYOK: Bring Your Own Kubernetes) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster.\nRead ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/blog/kubernetes-managed-by-qovery-vs-self-managed-byok"}),"this article")," to better understand the difference with the Managed Kubernetes by Qovery. In a nutshell, Qovery BYOK is for Kubernetes experts who want to manage their own Kubernetes cluster. In this version, Qovery does not manage the Kubernetes cluster for you."),Object(o.b)(b.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery automatically updates ",Object(o.b)("strong",{parentName:"p"},"ONLY")," the Qovery applications (agent, shell-agent etc..) via the Qovery Helm chart. With the self-managed offer it will be up to you to manage any dependency components (ingress, dns, logging...), making sure they run with the right version over time."),Object(o.b)("p",null,"The dependencies provided with the Qovery Helm chart are here to help you with the bootstrap, and are not maintained by Qovery. If you want to simplify the maintenance of your cluster, please look at ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/pricing/"}),"Qovery managed Kubernetes offer"),".")),Object(o.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(o.b)(m,{mdxType:"Assumption"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have a GCP GKE Kubernetes cluster up and running."),Object(o.b)("li",{parentName:"ul"},"You have a GCP GKE Kubernetes cluster with at least 4 CPUs and 8GB of RAM."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"kubectl")," installed and configured to access your GCP GKE Kubernetes cluster."),Object(o.b)("li",{parentName:"ul"},"You have ",Object(o.b)("inlineCode",{parentName:"li"},"helm")," installed."),Object(o.b)("li",{parentName:"ul"},"You have a Qovery account. If you don't have one, please sign up at ",Object(o.b)("a",Object(l.a)({parentName:"li"},{href:"https://start.qovery.com"}),"https://start.qovery.com")))),Object(o.b)("h2",{id:"install-qovery-on-your-gcp-gke-cluster"},"Install Qovery on your GCP GKE cluster"),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Follow ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/local/"}),"this guide")," to try Qovery on your local machine.")),Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"automatic",placeholder:"Install Qovery",select:!1,size:null,values:[{group:"Install",label:"Automatic",value:"automatic"},{group:"Install",label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"automatic",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery CLI by running the following command:"),Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(c.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(i.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("p",null,"Authenticate with Qovery by running the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your GCP GKE cluster:"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"qovery cluster install\n")),Object(o.b)("p",null,"Respond to the prompts to install Qovery on your GCP GKE Kubernetes cluster."))))),Object(o.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://helm.sh"}),"Helm")," command line tool.")),Object(o.b)("li",null,Object(o.b)("p",null,"Add Qovery Helm repository."),Object(o.b)(b.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Qovery Helm Chart is only available for users who have access to Qovery BYOK. ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/bring-your-own-kubernetes"}),"Request your access here"),".")),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm repo add qovery https://helm.qovery.com\nhelm repo update\n"))),Object(o.b)("li",null,Object(o.b)("p",null,"Login to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console"),", create a cluster of type ",Object(o.b)("inlineCode",{parentName:"p"},"Self-Managed"),". At the end of the flow you will be able to download the ",Object(o.b)("inlineCode",{parentName:"p"},"values.yaml")," file associated with this cluster.")),Object(o.b)("li",null,Object(o.b)("p",null,"Now you can customize your values.yaml file based on your need. Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),"."),Object(o.b)(b.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Make sure that all fields having value ",Object(o.b)("inlineCode",{parentName:"p"},"set-by-customer")," are filled.")),Object(o.b)("p",null,"Learn more about the configuration in the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/byok-config/"}),"Configuration page"),".")),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Kubernetes cluster."),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --wait --atomic --create-namespace -n qovery -f \\\n --set services.certificates.cert-manager-configs.enabled=false \\\n --set services.certificates.qovery-cert-manager-webhook.enabled=false \\\n --set services.qovery.qovery-cluster-agent.enabled=false \\\n --set services.qovery.qovery-engine.enabled=false \\\n qovery qovery/qovery\n")),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-n qovery"),": the namespace where Qovery and its dependencies will be installed"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"--set..."),": override (only for the first deployment time, if you want to use Cert-Manager) to let cert-manager install its CRDs"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-f your-values-file.yaml"),": the values file you've downloaded, overrided with the Qovery config and your custom config"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery/qovery"),": name of the chart to deploy"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery"),": name of the release")),Object(o.b)("p",null,"If you want to use Cert-Manager, you can remove the ",Object(o.b)("inlineCode",{parentName:"p"},"--set...")," for the future updates (or if already installed):"),Object(o.b)("pre",null,Object(o.b)("code",Object(l.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install --create-namespace -n qovery -f --wait --atomic qovery qovery/qovery\n"))))))),Object(o.b)("p",null,"That's it, you can now use Qovery on your GCP GKE cluster."),Object(o.b)("p",null,"Connect to the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"https://console.qovery.com"}),"Qovery console")," to validate that Qovery is properly installed and start deploying your applications."),Object(o.b)("h2",{id:"whats-next"},"What's Next?"),Object(o.b)("p",null,"Now that you have Qovery installed on your Kubernetes cluster, you can check that Qovery is properly installed by following the ",Object(o.b)("a",Object(l.a)({parentName:"p"},{href:"/docs/getting-started/install-qovery/kubernetes/validate-installation/"}),"Validate Installation")," guide."))}h.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),l=a.n(n),r=a(463),o=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,s=null;switch(c){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return l.a.createElement("div",{className:o()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:o()("feather","icon-"+(r||s))}),t)}},472:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(463),a(471)),o=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},b="https://github.com/qovery/documentation/issues/new?"+o.a.stringify(s),i=Object(n.useState)(null),u=i[0],p=i[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!u&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:b,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},477:function(e,t,a){"use strict";var n=a(1),l=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),o=a(483),c=a(463),s=a.n(c),b=a(471),i=a.n(b),u=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,o=e.handleKeydown,c=e.style,b=e.values,i=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",l,{"tabs--block":t}),style:c},b.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":i===t,className:s()("tab-item",{"tab-item--active":i===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return o(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function y(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,c=e.values,s=c;if(s[0].group){var b=_.groupBy(s,"group");s=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return r.a.createElement(o.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:s,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,o=e.groupId,c=e.label,s=e.placeholder,b=e.select,h=e.size,v=(e.style,e.values),O=e.urlKey,g=Object(u.a)(),j=g.tabGroupChoices,f=g.setTabGroupChoices,w=Object(l.useState)(a),N=w[0],q=w[1];if(null!=o){var T=j[o];null!=T&&T!==N&&q(T)}var C=function(e){q(e),null!=o&&f(o,e)},k=[],Q=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=i.a.parse(window.location.search);e[O]&&q(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),v.length>1&&(b?r.a.createElement(y,Object(n.a)({changeSelectedValue:C,handleKeydown:Q,placeholder:s,selectedValue:N,size:h,tabRefs:k},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:C,handleKeydown:Q,selectedValue:N,tabRefs:k},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},478:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/b565c464.34d220c0.js b/b565c464.c6980a7c.js similarity index 99% rename from b565c464.34d220c0.js rename to b565c464.c6980a7c.js index 77df7c1cd5..6d95486edd 100644 --- a/b565c464.34d220c0.js +++ b/b565c464.c6980a7c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[217],{368:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),r=a(9),o=(a(0),a(465)),l=a(477),i=a(479),c=a(464),s=a(469),u=a(473),b={last_modified_on:"2024-05-03",$schema:"/.meta/.schemas/guides.json",title:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},p={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",permalink:"/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease",readingTime:"8 min read",source:"@site/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"How to deploy a Rust REST API application on AWS with ease",truncated:!1,prevItem:{title:"How to create an RDS instance through the AWS console",permalink:"/guides/tutorial/how-to-create-an-rds-instance-through-aws-console"},nextItem:{title:"How to integrate Qovery with GitHub Actions",permalink:"/guides/tutorial/how-to-integrate-qovery-with-github-actions"}},m=[{value:"Create a Rust REST API app",id:"create-a-rust-rest-api-app",children:[]},{value:"Dockerized our Rust REST API app",id:"dockerized-our-rust-rest-api-app",children:[]},{value:"Deploy our Rust REST API app on AWS",id:"deploy-our-rust-rest-api-app-on-aws",children:[{value:"Sign up into Qovery",id:"sign-up-into-qovery",children:[]},{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Connect your AWS account",id:"connect-your-aws-account",children:[]},{value:"Deploy our Rust REST API app",id:"deploy-our-rust-rest-api-app",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],d={rightToc:m};function g(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(o.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety."),Object(o.b)("p",null,"In this article, you will learn how to deploy a Rust API easily in a few steps. This article is separate into two parts:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Create a Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Dockerized our Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Deploy our Rust REST API app on AWS")),Object(o.b)(s.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Rust installed on your system (instructions ",Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.rust-lang.org/learn/get-started"}),"here"),")"),Object(o.b)("li",{parentName:"ul"},"You have an AWS account"),Object(o.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(o.b)("p",null,"Let's go!"),Object(o.b)("h2",{id:"create-a-rust-rest-api-app"},"Create a Rust REST API app"),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Check out the Rust REST API repo ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"here"),". You can fork it!")),Object(o.b)("p",null,"To illustrate the deployment of our Rust API application, we are going to create an API to know if a number is prime number. Let's create our Rust project using cargo"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="create our rust project"',title:'"create',our:!0,rust:!0,'project"':!0}),"cargo new --bin rust-prime-number-api\n")),Object(o.b)("p",null,"Now you must have a ",Object(o.b)("inlineCode",{parentName:"p"},"rust-prime-number-api")," folder with 2 files:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Cargo.toml")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"src/main.rs"))),Object(o.b)("p",null,"To build our Rust REST API we are going to use Rocket - a web framework for Rust that makes it simple to write fast web application."),Object(o.b)("p",null,"Add the ",Object(o.b)("inlineCode",{parentName:"p"},"rocket")," and ",Object(o.b)("inlineCode",{parentName:"p"},"serde")," (JSON serializer/deserializer) dependencies to your ",Object(o.b)("inlineCode",{parentName:"p"},"Cargo.toml"),", then run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo fetch")," (optional) to update your local dependencies."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-toml",metastring:'title="Cargo.toml" {9-12}',title:'"Cargo.toml"',"{9-12}":!0}),'[package]\nname = "rust-prime-number-api"\nversion = "0.1.0"\nauthors = ["Romaric Philogene "]\nedition = "2018"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nrocket = { version = "0.5.0-rc.1", features = ["json"] }\nserde = { version = "1.0.130", features = ["derive"] }\nserde_json = "1.0.68"\n')),Object(o.b)("p",null,"Put inside your ",Object(o.b)("inlineCode",{parentName:"p"},"src/main.rs")," the following Rust code"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'}),'#[macro_use]\nextern crate rocket;\n\nuse rocket::serde::json::Json;\nuse serde::Serialize;\nuse std::time::SystemTime;\nuse std::net::{IpAddr, Ipv4Addr};\n\n#[derive(Serialize)]\nstruct NumberResponse {\n number: u64,\n is_prime_number: bool,\n execution_time_in_micros: u128\n}\n\n#[get("/")]\nfn index() -> &\'static str {\n "This is my Rust prime number REST API"\n}\n\n#[get("/isPrime?")]\nfn get_is_prime(number: u64) -> Json {\n let now = SystemTime::now();\n\n Json(NumberResponse {\n number,\n is_prime_number: is_prime(number),\n execution_time_in_micros: now.elapsed().unwrap().as_micros(),\n })\n}\n\nfn is_prime(n: u64) -> bool {\n if n <= 1 {\n return false;\n }\n\n for a in 2..n {\n if n % a == 0 {\n return false;\n }\n }\n\n true\n}\n\n#[rocket::main]\nasync fn main() {\n let mut config = rocket::config::Config::default();\n config.address = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));\n\n let _ = rocket::build()\n .configure(config)\n .mount("/", routes![index, get_is_prime])\n .launch()\n .await;\n}\n')),Object(o.b)("p",null,"Run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo run")," and you are supposed to get the following output"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"\ud83d\udd27 Configured for debug.\n >> address: 0.0.0.0\n >> port: 8000\n >> workers: 16\n >> ident: Rocket\n >> keep-alive: 5s\n >> limits: bytes = 8KiB, data-form = 2MiB, file = 1MiB, form = 32KiB, json = 1MiB, msgpack = 1MiB, string = 8KiB\n >> tls: disabled\n >> temp dir: /var/folders/td/bjr48yg96gd2xgd3s44fg40c0000gn/T/\n >> log level: normal\n >> cli colors: true\n >> shutdown: ctrlc = true, force = true, signals = [SIGTERM], grace = 2s, mercy = 3s\n\ud83d\udef0 Routes:\n >> (index) GET /\n >> (get_is_prime) GET /isPrime?\n\ud83d\udce1 Fairings:\n >> Shield (liftoff, response, singleton)\n\ud83d\udee1\ufe0f Shield:\n >> X-Frame-Options: SAMEORIGIN\n >> Permissions-Policy: interest-cohort=()\n >> X-Content-Type-Options: nosniff\n\ud83d\ude80 Rocket has launched from http://127.0.0.1:8000\n")),Object(o.b)("p",null,"You can try your Rust REST API by opening ",Object(o.b)("inlineCode",{parentName:"p"},"http://127.0.0.1:8000/isPrime?number=9293029022983991")," in your browser."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-json"}),'{\n "number": 9293029022983992,\n "is_prime_number": false,\n "execution_time_in_micros": 942894\n}\n')),Object(o.b)("p",null,"Let's now containerized our app with Docker to deploy it on our AWS account."),Object(o.b)("h2",{id:"dockerized-our-rust-rest-api-app"},"Dockerized our Rust REST API app"),Object(o.b)("p",null,"To run our Rust app we need to provide a valid Dockerfile. If you are not familiar with Docker, you can take a look to ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),". Here is the content of our Dockerfile."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Our Dockerfile contains a multi-stage build. That is why we have two ",Object(o.b)("inlineCode",{parentName:"p"},"FROM")," instructions.\nOur final container image is optimized to be as light as possible.")),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-Dockerfile",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'####################################################################################################\n## Builder\n####################################################################################################\nFROM rust:latest AS builder\n\nRUN rustup target add x86_64-unknown-linux-musl\nRUN apt update && apt install -y musl-tools musl-dev\nRUN update-ca-certificates\n\n# Create appuser\nENV USER=app\nENV UID=10001\n\nRUN adduser \\\n --disabled-password \\\n --gecos "" \\\n --home "/nonexistent" \\\n --shell "/sbin/nologin" \\\n --no-create-home \\\n --uid "${UID}" \\\n "${USER}"\n\nWORKDIR /app\n\nCOPY ./ .\n\nRUN cargo build --target x86_64-unknown-linux-musl --release\n\n####################################################################################################\n## Final image\n####################################################################################################\nFROM scratch\n\n# Import from builder.\nCOPY --from=builder /etc/passwd /etc/passwd\nCOPY --from=builder /etc/group /etc/group\n\nWORKDIR /app\n\n# Copy our build\nCOPY --from=builder /app/target/x86_64-unknown-linux-musl/release/rust-prime-number-api ./\n\n# Use an unprivileged user.\nUSER app:app\n\nCMD ["/app/rust-prime-number-api"]\n')),Object(o.b)("h2",{id:"deploy-our-rust-rest-api-app-on-aws"},"Deploy our Rust REST API app on AWS"),Object(o.b)("p",null,"To deploy our Rust app on AWS we are going to use Qovery. Qovery is the simplest way to deploy any app on AWS. It is the perfect candidate to deploy our Rust REST API in a few steps."),Object(o.b)("h3",{id:"sign-up-into-qovery"},"Sign up into Qovery"),Object(o.b)("p",null,"First, you need to sign up or sign in on Qovery."),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://console.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.png",alt:"Qovery Sign-up page"}))))),Object(o.b)(i.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(i.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(i.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")))),Object(o.b)("h3",{id:"connect-your-aws-account"},"Connect your AWS account"),Object(o.b)("p",null,"To connect your AWS account check out ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"this guide"),"."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Qovery installation on your AWS account takes up to 30 minutes. You will be notified by email when it is over.")),Object(o.b)("h3",{id:"deploy-our-rust-rest-api-app"},"Deploy our Rust REST API app"),Object(o.b)("p",null,"Once your AWS account is set-up, you can deploy your Rust app by.."),Object(o.b)("p",null,"Creating a project ",Object(o.b)("inlineCode",{parentName:"p"},"prime number"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_project.png",alt:"Create a project"})),Object(o.b)("p",null,"Creating an environment ",Object(o.b)("inlineCode",{parentName:"p"},"prod"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_environment.png",alt:"Create an environment"})),Object(o.b)("p",null,"Creating an app by selecting your Rust app repository, build mode > ",Object(o.b)("strong",{parentName:"p"},"Dockerfile"),", and the port ",Object(o.b)("strong",{parentName:"p"},"8000"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app.png",alt:"Create an app"})),Object(o.b)("p",null,"And deploy! That's it \ud83d\udd25... nothing more. Our Rust REST API app is ready"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app_deployed.png",alt:"Our app is deployed"})),Object(o.b)("p",null,"Check out this video to see how I quickly deploy my Rust REST API with Qovery."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7ae48d3383da40159d8aa97c23aadb3e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Watch this video showing the final result \ud83d\udc47"),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/30cc34ef166a4fdaaeb0a9e864bf7836",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"Rust combined to Rocket web framework turns building REST API super easy. Deploying your Rust app on AWS with Qovery is as simple as selecting your GitHub repository. Nothing more. Hope you liked it."),Object(o.b)("h2",{id:"useful-resources"},"Useful resources"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"Source code")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://rocket.rs"}),"Rocket framework")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://circleci.com/blog/rust-cd/"}),"Rust Circle CI"))),Object(o.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),r=a.n(n),o=a(463),l=a.n(o);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":n,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},468:function(e,t,a){var n=a(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||a(10)&&n(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),r=a.n(n),o=a(464);t.a=function(e){var t=e.children,a=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),r=a(0),o=a.n(r),l=a(39),i=a(474),c=a(20),s=a.n(c);t.a=function(e){var t,a=e.to,c=e.href,u=a||c,b=Object(i.a)(u),p=Object(r.useRef)(!1),m=s.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!m&&b&&window.docusaurus.prefetch(u),function(){m&&t&&t.disconnect()}}),[u,m,b]),u&&b?o.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(u),p.current=!0)},innerRef:function(e){var a,n;m&&e&&b&&(a=e,n=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:u})):o.a.createElement("a",Object(n.a)({},e,{href:u}))}},473:function(e,t,a){"use strict";var n=a(0),r=a.n(n),o=a(470),l=a(463),i=a.n(l);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,c=e.rightIcon,s=e.size,u=e.target,b=e.to,p=i()("jump-to","jump-to--"+s,a),m=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},l&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+l})),r.a.createElement("div",{className:"jump-to--main"},n?r.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(c||"chevron-right")+" arrow"}))));return u?r.a.createElement("a",{href:b,target:u,className:p},m):r.a.createElement(o.a,{to:b,className:p},m)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),r=(a(481),a(478),a(52),a(29),a(22),a(21),a(0)),o=a.n(r),l=a(483),i=a(463),c=a.n(i),s=a(471),u=a.n(s),b=a(482),p=37,m=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:a?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},s.map((function(e){var t=e.value,a=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function g(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,s=e.select,h=e.size,O=(e.style,e.values),j=e.urlKey,f=Object(b.a)(),y=f.tabGroupChoices,v=f.setTabGroupChoices,w=Object(r.useState)(a),N=w[0],R=w[1];if(null!=l){var T=y[l];null!=T&&T!==N&&R(T)}var I=function(e){R(e),null!=l&&v(l,e)},k=[],S=function(e,t,a){switch(a.keyCode){case m:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=u.a.parse(window.location.search);e[j]&&R(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(h||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),O.length>1&&(s?o.a.createElement(g,Object(n.a)({changeSelectedValue:I,handleKeydown:S,placeholder:c,selectedValue:N,size:h,tabRefs:k},e)):o.a.createElement(d,Object(n.a)({changeSelectedValue:I,handleKeydown:S,selectedValue:N,tabRefs:k},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},479:function(e,t,a){"use strict";var n=a(0),r=a.n(n);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[217],{368:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),r=a(9),o=(a(0),a(465)),l=a(477),i=a(478),c=a(464),s=a(469),u=a(473),b={last_modified_on:"2024-05-03",$schema:"/.meta/.schemas/guides.json",title:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},p={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",permalink:"/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease",readingTime:"8 min read",source:"@site/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"How to deploy a Rust REST API application on AWS with ease",truncated:!1,prevItem:{title:"How to create an RDS instance through the AWS console",permalink:"/guides/tutorial/how-to-create-an-rds-instance-through-aws-console"},nextItem:{title:"How to integrate Qovery with GitHub Actions",permalink:"/guides/tutorial/how-to-integrate-qovery-with-github-actions"}},m=[{value:"Create a Rust REST API app",id:"create-a-rust-rest-api-app",children:[]},{value:"Dockerized our Rust REST API app",id:"dockerized-our-rust-rest-api-app",children:[]},{value:"Deploy our Rust REST API app on AWS",id:"deploy-our-rust-rest-api-app-on-aws",children:[{value:"Sign up into Qovery",id:"sign-up-into-qovery",children:[]},{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Connect your AWS account",id:"connect-your-aws-account",children:[]},{value:"Deploy our Rust REST API app",id:"deploy-our-rust-rest-api-app",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],d={rightToc:m};function g(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(o.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety."),Object(o.b)("p",null,"In this article, you will learn how to deploy a Rust API easily in a few steps. This article is separate into two parts:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Create a Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Dockerized our Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Deploy our Rust REST API app on AWS")),Object(o.b)(s.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Rust installed on your system (instructions ",Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.rust-lang.org/learn/get-started"}),"here"),")"),Object(o.b)("li",{parentName:"ul"},"You have an AWS account"),Object(o.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(o.b)("p",null,"Let's go!"),Object(o.b)("h2",{id:"create-a-rust-rest-api-app"},"Create a Rust REST API app"),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Check out the Rust REST API repo ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"here"),". You can fork it!")),Object(o.b)("p",null,"To illustrate the deployment of our Rust API application, we are going to create an API to know if a number is prime number. Let's create our Rust project using cargo"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="create our rust project"',title:'"create',our:!0,rust:!0,'project"':!0}),"cargo new --bin rust-prime-number-api\n")),Object(o.b)("p",null,"Now you must have a ",Object(o.b)("inlineCode",{parentName:"p"},"rust-prime-number-api")," folder with 2 files:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Cargo.toml")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"src/main.rs"))),Object(o.b)("p",null,"To build our Rust REST API we are going to use Rocket - a web framework for Rust that makes it simple to write fast web application."),Object(o.b)("p",null,"Add the ",Object(o.b)("inlineCode",{parentName:"p"},"rocket")," and ",Object(o.b)("inlineCode",{parentName:"p"},"serde")," (JSON serializer/deserializer) dependencies to your ",Object(o.b)("inlineCode",{parentName:"p"},"Cargo.toml"),", then run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo fetch")," (optional) to update your local dependencies."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-toml",metastring:'title="Cargo.toml" {9-12}',title:'"Cargo.toml"',"{9-12}":!0}),'[package]\nname = "rust-prime-number-api"\nversion = "0.1.0"\nauthors = ["Romaric Philogene "]\nedition = "2018"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nrocket = { version = "0.5.0-rc.1", features = ["json"] }\nserde = { version = "1.0.130", features = ["derive"] }\nserde_json = "1.0.68"\n')),Object(o.b)("p",null,"Put inside your ",Object(o.b)("inlineCode",{parentName:"p"},"src/main.rs")," the following Rust code"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'}),'#[macro_use]\nextern crate rocket;\n\nuse rocket::serde::json::Json;\nuse serde::Serialize;\nuse std::time::SystemTime;\nuse std::net::{IpAddr, Ipv4Addr};\n\n#[derive(Serialize)]\nstruct NumberResponse {\n number: u64,\n is_prime_number: bool,\n execution_time_in_micros: u128\n}\n\n#[get("/")]\nfn index() -> &\'static str {\n "This is my Rust prime number REST API"\n}\n\n#[get("/isPrime?")]\nfn get_is_prime(number: u64) -> Json {\n let now = SystemTime::now();\n\n Json(NumberResponse {\n number,\n is_prime_number: is_prime(number),\n execution_time_in_micros: now.elapsed().unwrap().as_micros(),\n })\n}\n\nfn is_prime(n: u64) -> bool {\n if n <= 1 {\n return false;\n }\n\n for a in 2..n {\n if n % a == 0 {\n return false;\n }\n }\n\n true\n}\n\n#[rocket::main]\nasync fn main() {\n let mut config = rocket::config::Config::default();\n config.address = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));\n\n let _ = rocket::build()\n .configure(config)\n .mount("/", routes![index, get_is_prime])\n .launch()\n .await;\n}\n')),Object(o.b)("p",null,"Run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo run")," and you are supposed to get the following output"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"\ud83d\udd27 Configured for debug.\n >> address: 0.0.0.0\n >> port: 8000\n >> workers: 16\n >> ident: Rocket\n >> keep-alive: 5s\n >> limits: bytes = 8KiB, data-form = 2MiB, file = 1MiB, form = 32KiB, json = 1MiB, msgpack = 1MiB, string = 8KiB\n >> tls: disabled\n >> temp dir: /var/folders/td/bjr48yg96gd2xgd3s44fg40c0000gn/T/\n >> log level: normal\n >> cli colors: true\n >> shutdown: ctrlc = true, force = true, signals = [SIGTERM], grace = 2s, mercy = 3s\n\ud83d\udef0 Routes:\n >> (index) GET /\n >> (get_is_prime) GET /isPrime?\n\ud83d\udce1 Fairings:\n >> Shield (liftoff, response, singleton)\n\ud83d\udee1\ufe0f Shield:\n >> X-Frame-Options: SAMEORIGIN\n >> Permissions-Policy: interest-cohort=()\n >> X-Content-Type-Options: nosniff\n\ud83d\ude80 Rocket has launched from http://127.0.0.1:8000\n")),Object(o.b)("p",null,"You can try your Rust REST API by opening ",Object(o.b)("inlineCode",{parentName:"p"},"http://127.0.0.1:8000/isPrime?number=9293029022983991")," in your browser."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-json"}),'{\n "number": 9293029022983992,\n "is_prime_number": false,\n "execution_time_in_micros": 942894\n}\n')),Object(o.b)("p",null,"Let's now containerized our app with Docker to deploy it on our AWS account."),Object(o.b)("h2",{id:"dockerized-our-rust-rest-api-app"},"Dockerized our Rust REST API app"),Object(o.b)("p",null,"To run our Rust app we need to provide a valid Dockerfile. If you are not familiar with Docker, you can take a look to ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),". Here is the content of our Dockerfile."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Our Dockerfile contains a multi-stage build. That is why we have two ",Object(o.b)("inlineCode",{parentName:"p"},"FROM")," instructions.\nOur final container image is optimized to be as light as possible.")),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-Dockerfile",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'####################################################################################################\n## Builder\n####################################################################################################\nFROM rust:latest AS builder\n\nRUN rustup target add x86_64-unknown-linux-musl\nRUN apt update && apt install -y musl-tools musl-dev\nRUN update-ca-certificates\n\n# Create appuser\nENV USER=app\nENV UID=10001\n\nRUN adduser \\\n --disabled-password \\\n --gecos "" \\\n --home "/nonexistent" \\\n --shell "/sbin/nologin" \\\n --no-create-home \\\n --uid "${UID}" \\\n "${USER}"\n\nWORKDIR /app\n\nCOPY ./ .\n\nRUN cargo build --target x86_64-unknown-linux-musl --release\n\n####################################################################################################\n## Final image\n####################################################################################################\nFROM scratch\n\n# Import from builder.\nCOPY --from=builder /etc/passwd /etc/passwd\nCOPY --from=builder /etc/group /etc/group\n\nWORKDIR /app\n\n# Copy our build\nCOPY --from=builder /app/target/x86_64-unknown-linux-musl/release/rust-prime-number-api ./\n\n# Use an unprivileged user.\nUSER app:app\n\nCMD ["/app/rust-prime-number-api"]\n')),Object(o.b)("h2",{id:"deploy-our-rust-rest-api-app-on-aws"},"Deploy our Rust REST API app on AWS"),Object(o.b)("p",null,"To deploy our Rust app on AWS we are going to use Qovery. Qovery is the simplest way to deploy any app on AWS. It is the perfect candidate to deploy our Rust REST API in a few steps."),Object(o.b)("h3",{id:"sign-up-into-qovery"},"Sign up into Qovery"),Object(o.b)("p",null,"First, you need to sign up or sign in on Qovery."),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://console.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.png",alt:"Qovery Sign-up page"}))))),Object(o.b)(i.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(i.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(i.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")))),Object(o.b)("h3",{id:"connect-your-aws-account"},"Connect your AWS account"),Object(o.b)("p",null,"To connect your AWS account check out ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"this guide"),"."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Qovery installation on your AWS account takes up to 30 minutes. You will be notified by email when it is over.")),Object(o.b)("h3",{id:"deploy-our-rust-rest-api-app"},"Deploy our Rust REST API app"),Object(o.b)("p",null,"Once your AWS account is set-up, you can deploy your Rust app by.."),Object(o.b)("p",null,"Creating a project ",Object(o.b)("inlineCode",{parentName:"p"},"prime number"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_project.png",alt:"Create a project"})),Object(o.b)("p",null,"Creating an environment ",Object(o.b)("inlineCode",{parentName:"p"},"prod"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_environment.png",alt:"Create an environment"})),Object(o.b)("p",null,"Creating an app by selecting your Rust app repository, build mode > ",Object(o.b)("strong",{parentName:"p"},"Dockerfile"),", and the port ",Object(o.b)("strong",{parentName:"p"},"8000"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app.png",alt:"Create an app"})),Object(o.b)("p",null,"And deploy! That's it \ud83d\udd25... nothing more. Our Rust REST API app is ready"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app_deployed.png",alt:"Our app is deployed"})),Object(o.b)("p",null,"Check out this video to see how I quickly deploy my Rust REST API with Qovery."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7ae48d3383da40159d8aa97c23aadb3e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Watch this video showing the final result \ud83d\udc47"),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/30cc34ef166a4fdaaeb0a9e864bf7836",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"Rust combined to Rocket web framework turns building REST API super easy. Deploying your Rust app on AWS with Qovery is as simple as selecting your GitHub repository. Nothing more. Hope you liked it."),Object(o.b)("h2",{id:"useful-resources"},"Useful resources"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"Source code")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://rocket.rs"}),"Rocket framework")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://circleci.com/blog/rust-cd/"}),"Rust Circle CI"))),Object(o.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),r=a.n(n),o=a(463),l=a.n(o);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":n,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},468:function(e,t,a){var n=a(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||a(10)&&n(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),r=a.n(n),o=a(464);t.a=function(e){var t=e.children,a=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),r=a(0),o=a.n(r),l=a(39),i=a(474),c=a(20),s=a.n(c);t.a=function(e){var t,a=e.to,c=e.href,u=a||c,b=Object(i.a)(u),p=Object(r.useRef)(!1),m=s.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!m&&b&&window.docusaurus.prefetch(u),function(){m&&t&&t.disconnect()}}),[u,m,b]),u&&b?o.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(u),p.current=!0)},innerRef:function(e){var a,n;m&&e&&b&&(a=e,n=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:u})):o.a.createElement("a",Object(n.a)({},e,{href:u}))}},473:function(e,t,a){"use strict";var n=a(0),r=a.n(n),o=a(470),l=a(463),i=a.n(l);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,c=e.rightIcon,s=e.size,u=e.target,b=e.to,p=i()("jump-to","jump-to--"+s,a),m=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},l&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+l})),r.a.createElement("div",{className:"jump-to--main"},n?r.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(c||"chevron-right")+" arrow"}))));return u?r.a.createElement("a",{href:b,target:u,className:p},m):r.a.createElement(o.a,{to:b,className:p},m)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),r=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),o=a.n(r),l=a(483),i=a(463),c=a.n(i),s=a(471),u=a.n(s),b=a(482),p=37,m=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:a?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},s.map((function(e){var t=e.value,a=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function g(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,s=e.select,h=e.size,O=(e.style,e.values),j=e.urlKey,f=Object(b.a)(),y=f.tabGroupChoices,v=f.setTabGroupChoices,w=Object(r.useState)(a),N=w[0],R=w[1];if(null!=l){var T=y[l];null!=T&&T!==N&&R(T)}var I=function(e){R(e),null!=l&&v(l,e)},k=[],S=function(e,t,a){switch(a.keyCode){case m:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=u.a.parse(window.location.search);e[j]&&R(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(h||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),O.length>1&&(s?o.a.createElement(g,Object(n.a)({changeSelectedValue:I,handleKeydown:S,placeholder:c,selectedValue:N,size:h,tabRefs:k},e)):o.a.createElement(d,Object(n.a)({changeSelectedValue:I,handleKeydown:S,selectedValue:N,tabRefs:k},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},478:function(e,t,a){"use strict";var n=a(0),r=a.n(n);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/b5eab6bb.dc88e311.js b/b5eab6bb.dc88e311.js deleted file mode 100644 index 24fbd173e9..0000000000 --- a/b5eab6bb.dc88e311.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[218],{369:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return u})),a.d(t,"metadata",(function(){return d})),a.d(t,"rightToc",(function(){return b})),a.d(t,"default",(function(){return p}));var n=a(1),o=a(9),r=(a(0),a(465)),i=a(472),l=a(477),c=a(479),s=(a(464),a(469)),u=(a(473),{last_modified_on:"2024-11-28",$schema:"/.meta/.schemas/guides.json",title:"Kubernetes observability and monitoring with Datadog",description:"How to integrate Datadog with Kubernetes on Qovery.",author_github:"https://github.com/acarranoqovery",tags:["type: tutorial","technology: qovery"],hide_pagination:!0}),d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Kubernetes observability and monitoring with Datadog",description:"How to integrate Datadog with Kubernetes on Qovery.",permalink:"/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog",readingTime:"5 min read",source:"@site/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Kubernetes observability and monitoring with Datadog",truncated:!1,prevItem:{title:"Integrate your application logs to Cloudwatch",permalink:"/guides/tutorial/cloudwatch-integration"},nextItem:{title:"Managing Environment Variables in React (create-react-app)",permalink:"/guides/tutorial/managing-env-variables-in-create-react-app"}},b=[{value:"Installation",id:"installation",children:[]},{value:"Conclusion",id:"conclusion",children:[]}],m={rightToc:b};function p(e){var t=e.components,a=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},m,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"While Qovery will soon provide basic metrics on apps resources usage, you might need a more advanced view on what happens on your infrastructure. There are many solutions on the market, one of them being Datadog.\nDatadog is one of the leading platforms for monitoring and observability, and it's pretty easy to integrate it with Qovery."),Object(r.b)(s.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have a Qovery cluster running"),Object(r.b)("li",{parentName:"ul"},"You have a dedicated Qovery project and environment to deploy Datadog (example: Project=Tooling, Environment=Production)"),Object(r.b)("li",{parentName:"ul"},"You have a Datadog account"),Object(r.b)("li",{parentName:"ul"},"You have already created a ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://docs.datadoghq.com/account_management/api-app-keys/#api-keys"}),"Datadog API Key")))),Object(r.b)("h2",{id:"installation"},"Installation"),Object(r.b)("p",null,"In this tutorial, we will install the Datadog agent on a Qovery cluster to gather metrics about infrastructure and applications."),Object(r.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(r.b)("ol",null,Object(r.b)("li",null,Object(r.b)("h4",{id:"add-the-datadog-helm-repository"},"Add the Datadog helm repository"),Object(r.b)("p",null,"Add the Datadog helm repository in your Qovery settings by following ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/organization/helm-repository/"}),"this documentation")),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Repository name: ",Object(r.b)("inlineCode",{parentName:"li"},"Datadog")),Object(r.b)("li",{parentName:"ul"},"Kind: ",Object(r.b)("inlineCode",{parentName:"li"},"HTTPS")),Object(r.b)("li",{parentName:"ul"},"Repository URL: ",Object(r.b)("inlineCode",{parentName:"li"},"https://helm.datadoghq.com")))),Object(r.b)("li",null,Object(r.b)("h4",{id:"create-the-datadog-service-within-qovery"},"Create the datadog service within Qovery"),Object(r.b)("p",null,"Create the Datadog helm service in the Qovery environment of your choice (preferrably within a dedicated Tooling project) by following ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/helm/"}),"this documentation")," and these values:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"General:",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Application name: ",Object(r.b)("inlineCode",{parentName:"li"},"Datadog")),Object(r.b)("li",{parentName:"ul"},"Source:",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Helm source: ",Object(r.b)("inlineCode",{parentName:"li"},"Helm repository")),Object(r.b)("li",{parentName:"ul"},"Repository: ",Object(r.b)("inlineCode",{parentName:"li"},"Datadog")," (the name given during the datadog helm repository added in the previous step)"),Object(r.b)("li",{parentName:"ul"},"Chart name: ",Object(r.b)("inlineCode",{parentName:"li"},"datadog")),Object(r.b)("li",{parentName:"ul"},"Version: ",Object(r.b)("inlineCode",{parentName:"li"},"3.49.5")," (this is the version we used for this setup, update it based on the chosen version)"),Object(r.b)("li",{parentName:"ul"},"Allow cluster-wide resources \u2714\ufe0f"))))),Object(r.b)("li",{parentName:"ul"},"Values",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Values override as file:"),Object(r.b)("li",{parentName:"ul"},"File source: ",Object(r.b)("inlineCode",{parentName:"li"},"Raw YAML")),Object(r.b)("li",{parentName:"ul"},"Raw YAML:")))),Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"default",placeholder:"Select your cluster type",select:!1,size:null,values:[{group:"Cluster",label:"Default",value:"default"},{group:"Cluster",label:"AWS with Karpenter",value:"karpenter"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"default",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"# The following YAML contains the minimum configuration required to deploy the Datadog Agent\n# on your cluster. Update it accordingly to your needs\ndatadog:\n # here we use a Qovery secret to retrieve the Datadog API Key (See next step)\n apiKey: qovery.env.DD_API_KEY\n # Update the site depending on where you want to store your data in Datadog\n site: datadoghq.eu\n # Update the cluster name with the name of your choice\n clusterName: qoverycluster\n"))),Object(r.b)(c.a,{value:"karpenter",mdxType:"TabItem"},Object(r.b)("p",null,"To ensure every node created by Karpenter is monitored by Datadog, we need to configure a priority class."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'# The following YAML contains the minimum configuration required to deploy the Datadog Agent\n# on your cluster. Update it accordingly to your needs\ndatadog:\n # here we use a Qovery secret to retrieve the Datadog API Key (See next step)\n apiKey: qovery.env.DD_API_KEY\n # Update the site depending on where you want to store your data in Datadog\n site: datadoghq.eu\n # Update the cluster name with the name of your choice\n clusterName: qoverycluster\nagents:\n tolerations:\n - operator: Exists\n affinity:\n nodeAffinity:\n requiredDuringSchedulingIgnoredDuringExecution:\n nodeSelectorTerms:\n - matchExpressions:\n - key: eks.amazonaws.com/compute-type\n operator: NotIn\n values:\n - fargate\n priorityClassCreate: true\n # Update the priority class name as you want\n priorityClassName: "datadog-karpenter-priorityclass"\n priorityClassValue: 1000\n')))),Object(r.b)("p",null,"There are many other values you can set and modify the Datadog agent behaviour. For advanced usage, check: ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Datadog/helm-charts/blob/main/charts/datadog/values.yaml"}),"https://github.com/Datadog/helm-charts/blob/main/charts/datadog/values.yaml")),Object(r.b)("p",null,"Now get to the last step and just ",Object(r.b)("inlineCode",{parentName:"p"},"Create")," the service on Qovery.")),Object(r.b)("li",null,Object(r.b)("h4",{id:"store-the-datadog-api-key-as-secret"},"Store the Datadog API Key as secret"),Object(r.b)("p",null,"In the previous step we have assigned the macro ",Object(r.b)("inlineCode",{parentName:"p"},"qovery.env.DD_API_KEY")," to the API Key value. In this step we will create this secret within the Qovery console."),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Open the service overview of the created Datadog service"),Object(r.b)("li",{parentName:"ul"},"Enter the ",Object(r.b)("inlineCode",{parentName:"li"},"Variables")," section"),Object(r.b)("li",{parentName:"ul"},"Add a new Variable with:",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Variable = DD_API_KEY"),Object(r.b)("li",{parentName:"ul"},"Value = "),Object(r.b)("li",{parentName:"ul"},"Scope = Service (so that it is accessible only to this service)"),Object(r.b)("li",{parentName:"ul"},"Secret variable \u2714\ufe0f")))),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/datadog-secret.png",alt:"Datadog - API Key"})),Object(r.b)("p",null,"If you need more information on how to manage your environment variables, have a look at ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"this documentation"))),Object(r.b)("li",null,Object(r.b)("h4",{id:"deploy-your-chart"},"Deploy your chart"),Object(r.b)("p",null,"Open the ",Object(r.b)("inlineCode",{parentName:"p"},"Play")," button and trigger the deployment of your chart (see point 1 in the picture below)."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/deploy.png",alt:"Datadog - Deploy"})),Object(r.b)("p",null,"You can follow the deployment and access the deployment logs by pressing the ",Object(r.b)("inlineCode",{parentName:"p"},"Log")," button (see point 2 in the picutre above)."),Object(r.b)("p",null,"Once the deployment is completed, you should see the Datadog agent pods and their status directly within the Qovery console."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/datadog-pods.png",alt:"Datadog - Pods"})),Object(r.b)("p",null,"You can also look at the Pod logs by pressing the ",Object(r.b)("inlineCode",{parentName:"p"},"Log")," button.")),Object(r.b)("li",null,Object(r.b)("h4",{id:"verify-the-setup-on-datadog"},"Verify the setup on Datadog"),Object(r.b)("p",null,"Access again your Datadog interface and access the Infrastructure > Containers > Kubernetes sections. You should now see the data coming from your Qovery cluster"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/datadog-console.png",alt:"Datadog - Console"}))))),Object(r.b)("h2",{id:"conclusion"},"Conclusion"),Object(r.b)("p",null,"You now have Datadog agent running on your Qovery cluster. You can check their ",Object(r.b)("inlineCode",{parentName:"p"},"Getting Started")," guide to familiarize yourself with the product: ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://docs.datadoghq.com/fr/getting_started"}),"https://docs.datadoghq.com/fr/getting_started"),"."))}p.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),o=a.n(n),r=a(463),i=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return o.a.createElement("div",{className:i()(a,"alert","alert--"+l,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||c))}),t)}},468:function(e,t,a){var n=a(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||a(10)&&n(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),o=a.n(n),r=a(464);t.a=function(e){var t=e.children,a=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),o=a(0),r=a.n(o),i=a(39),l=a(474),c=a(20),s=a.n(c);t.a=function(e){var t,a=e.to,c=e.href,u=a||c,d=Object(l.a)(u),b=Object(o.useRef)(!1),m=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!m&&d&&window.docusaurus.prefetch(u),function(){m&&t&&t.disconnect()}}),[u,m,d]),u&&d?r.a.createElement(i.b,Object(n.a)({},e,{onMouseEnter:function(){b.current||(window.docusaurus.preload(u),b.current=!0)},innerRef:function(e){var a,n;m&&e&&d&&(a=e,n=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:u})):r.a.createElement("a",Object(n.a)({},e,{href:u}))}},472:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=(a(463),a(471)),i=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,c={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},s="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(c),u=Object(n.useState)(null),d=u[0],b=u[1];return o.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!d&&o.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",o.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return b("yes")}},"Yes"),"\xa0\xa0",o.a.createElement("a",{href:s,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==d&&o.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",o.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=a(470),i=a(463),l=a.n(i);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,i=e.leftIcon,c=e.rightIcon,s=e.size,u=e.target,d=e.to,b=l()("jump-to","jump-to--"+s,a),m=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},i&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+i})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(c||"chevron-right")+" arrow"}))));return u?o.a.createElement("a",{href:d,target:u,className:b},m):o.a.createElement(r.a,{to:d,className:b},m)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),o=(a(481),a(478),a(52),a(29),a(22),a(21),a(0)),r=a.n(o),i=a(483),l=a(463),c=a.n(l),s=a(471),u=a.n(s),d=a(482),b=37,m=39;function p(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,s=e.values,u=e.selectedValue,d=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",o,{"tabs--block":t}),style:l},s.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return d.push(e)},onKeyDown:function(e){return i(d,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,o=e.size,l=e.values,c=l;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:l.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,i=e.groupId,l=e.label,c=e.placeholder,s=e.select,g=e.size,y=(e.style,e.values),f=e.urlKey,v=Object(d.a)(),j=v.tabGroupChoices,O=v.setTabGroupChoices,w=Object(o.useState)(a),N=w[0],D=w[1];if(null!=i){var k=j[i];null!=k&&k!==N&&D(k)}var E=function(e){D(e),null!=i&&O(i,e)},C=[],I=function(e,t,a){switch(a.keyCode){case m:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case b:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=u.a.parse(window.location.search);e[f]&&D(e[f])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(g||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),y.length>1&&(s?r.a.createElement(h,Object(n.a)({changeSelectedValue:E,handleKeydown:I,placeholder:c,selectedValue:N,size:g,tabRefs:C},e)):r.a.createElement(p,Object(n.a)({changeSelectedValue:E,handleKeydown:I,selectedValue:N,tabRefs:C},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},479:function(e,t,a){"use strict";var n=a(0),o=a.n(n);t.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/b5eab6bb.ed7dd98d.js b/b5eab6bb.ed7dd98d.js new file mode 100644 index 0000000000..a42a0ff6dd --- /dev/null +++ b/b5eab6bb.ed7dd98d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[218],{369:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return u})),a.d(t,"metadata",(function(){return d})),a.d(t,"rightToc",(function(){return b})),a.d(t,"default",(function(){return p}));var n=a(1),o=a(9),r=(a(0),a(465)),i=a(472),l=a(477),c=a(478),s=(a(464),a(469)),u=(a(473),{last_modified_on:"2024-11-30",$schema:"/.meta/.schemas/guides.json",title:"Kubernetes observability and monitoring with Datadog",description:"How to integrate Datadog with Kubernetes on Qovery.",author_github:"https://github.com/acarranoqovery",tags:["type: tutorial","technology: qovery"],hide_pagination:!0}),d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Kubernetes observability and monitoring with Datadog",description:"How to integrate Datadog with Kubernetes on Qovery.",permalink:"/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog",readingTime:"5 min read",source:"@site/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Kubernetes observability and monitoring with Datadog",truncated:!1,prevItem:{title:"Integrate your application logs to Cloudwatch",permalink:"/guides/tutorial/cloudwatch-integration"},nextItem:{title:"Managing Environment Variables in React (create-react-app)",permalink:"/guides/tutorial/managing-env-variables-in-create-react-app"}},b=[{value:"Installation",id:"installation",children:[]},{value:"Conclusion",id:"conclusion",children:[]}],m={rightToc:b};function p(e){var t=e.components,a=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},m,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"While Qovery will soon provide basic metrics on apps resources usage, you might need a more advanced view on what happens on your infrastructure. There are many solutions on the market, one of them being Datadog.\nDatadog is one of the leading platforms for monitoring and observability, and it is pretty easy to integrate it with Qovery."),Object(r.b)(s.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have a Qovery cluster running"),Object(r.b)("li",{parentName:"ul"},"You have a dedicated Qovery project and environment to deploy Datadog (example: Project=Tooling, Environment=Production)"),Object(r.b)("li",{parentName:"ul"},"You have a Datadog account"),Object(r.b)("li",{parentName:"ul"},"You have already created a ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://docs.datadoghq.com/account_management/api-app-keys/#api-keys"}),"Datadog API Key")))),Object(r.b)("h2",{id:"installation"},"Installation"),Object(r.b)("p",null,"In this tutorial, we will install the Datadog agent on a Qovery cluster to gather metrics about infrastructure and applications."),Object(r.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(r.b)("ol",null,Object(r.b)("li",null,Object(r.b)("h4",{id:"add-the-datadog-helm-repository"},"Add the Datadog helm repository"),Object(r.b)("p",null,"Add the Datadog helm repository in your Qovery settings by following ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/organization/helm-repository/"}),"this documentation")),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Repository name: ",Object(r.b)("inlineCode",{parentName:"li"},"Datadog")),Object(r.b)("li",{parentName:"ul"},"Kind: ",Object(r.b)("inlineCode",{parentName:"li"},"HTTPS")),Object(r.b)("li",{parentName:"ul"},"Repository URL: ",Object(r.b)("inlineCode",{parentName:"li"},"https://helm.datadoghq.com")))),Object(r.b)("li",null,Object(r.b)("h4",{id:"create-the-datadog-service-within-qovery"},"Create the datadog service within Qovery"),Object(r.b)("p",null,"Create the Datadog helm service in the Qovery environment of your choice (preferrably within a dedicated Tooling project) by following ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/helm/"}),"this documentation")," and these values:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"General:",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Application name: ",Object(r.b)("inlineCode",{parentName:"li"},"Datadog")),Object(r.b)("li",{parentName:"ul"},"Source:",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Helm source: ",Object(r.b)("inlineCode",{parentName:"li"},"Helm repository")),Object(r.b)("li",{parentName:"ul"},"Repository: ",Object(r.b)("inlineCode",{parentName:"li"},"Datadog")," (the name given during the datadog helm repository added in the previous step)"),Object(r.b)("li",{parentName:"ul"},"Chart name: ",Object(r.b)("inlineCode",{parentName:"li"},"datadog")),Object(r.b)("li",{parentName:"ul"},"Version: ",Object(r.b)("inlineCode",{parentName:"li"},"3.49.5")," (this is the version we used for this setup, update it based on the chosen version)"),Object(r.b)("li",{parentName:"ul"},"Allow cluster-wide resources \u2714\ufe0f"))))),Object(r.b)("li",{parentName:"ul"},"Values",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Values override as file:"),Object(r.b)("li",{parentName:"ul"},"File source: ",Object(r.b)("inlineCode",{parentName:"li"},"Raw YAML")),Object(r.b)("li",{parentName:"ul"},"Raw YAML:")))),Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"default",placeholder:"Select your cluster type",select:!1,size:null,values:[{group:"Cluster",label:"Default",value:"default"},{group:"Cluster",label:"AWS with Karpenter",value:"karpenter"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"default",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"# The following YAML contains the minimum configuration required to deploy the Datadog Agent\n# on your cluster. Update it accordingly to your needs\ndatadog:\n # here we use a Qovery secret to retrieve the Datadog API Key (See next step)\n apiKey: qovery.env.DD_API_KEY\n # Update the site depending on where you want to store your data in Datadog\n site: datadoghq.eu\n # Update the cluster name with the name of your choice\n clusterName: qoverycluster\n"))),Object(r.b)(c.a,{value:"EKS with karpenter",mdxType:"TabItem"},Object(r.b)("p",null,"To ensure every node created by Karpenter is monitored by Datadog, we need to configure a priority class."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'# The following YAML contains the minimum configuration required to deploy the Datadog Agent\n# on your cluster. Update it accordingly to your needs\ndatadog:\n # here we use a Qovery secret to retrieve the Datadog API Key (See next step)\n apiKey: qovery.env.DD_API_KEY\n # Update the site depending on where you want to store your data in Datadog\n site: datadoghq.eu\n # Update the cluster name with the name of your choice\n clusterName: qoverycluster\nagents:\n tolerations:\n - operator: Exists\n affinity:\n nodeAffinity:\n requiredDuringSchedulingIgnoredDuringExecution:\n nodeSelectorTerms:\n - matchExpressions:\n - key: eks.amazonaws.com/compute-type\n operator: NotIn\n values:\n - fargate\n priorityClassCreate: true\n # Update the priority class name as you want\n priorityClassName: "datadog-karpenter-priorityclass"\n priorityClassValue: 1000\n')))),Object(r.b)("p",null,"There are many other values you can set and modify the Datadog agent behaviour. For advanced usage, check: ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Datadog/helm-charts/blob/main/charts/datadog/values.yaml"}),"https://github.com/Datadog/helm-charts/blob/main/charts/datadog/values.yaml")),Object(r.b)("p",null,"Now get to the last step and just ",Object(r.b)("inlineCode",{parentName:"p"},"Create")," the service on Qovery.")),Object(r.b)("li",null,Object(r.b)("h4",{id:"store-the-datadog-api-key-as-secret"},"Store the Datadog API Key as secret"),Object(r.b)("p",null,"In the previous step we have assigned the macro ",Object(r.b)("inlineCode",{parentName:"p"},"qovery.env.DD_API_KEY")," to the API Key value. In this step we will create this secret within the Qovery console."),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Open the service overview of the created Datadog service"),Object(r.b)("li",{parentName:"ul"},"Enter the ",Object(r.b)("inlineCode",{parentName:"li"},"Variables")," section"),Object(r.b)("li",{parentName:"ul"},"Add a new Variable with:",Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"Variable = DD_API_KEY"),Object(r.b)("li",{parentName:"ul"},"Value = "),Object(r.b)("li",{parentName:"ul"},"Scope = Service (so that it is accessible only to this service)"),Object(r.b)("li",{parentName:"ul"},"Secret variable \u2714\ufe0f")))),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/datadog-secret.png",alt:"Datadog - API Key"})),Object(r.b)("p",null,"If you need more information on how to manage your environment variables, have a look at ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"this documentation"))),Object(r.b)("li",null,Object(r.b)("h4",{id:"deploy-your-chart"},"Deploy your chart"),Object(r.b)("p",null,"Open the ",Object(r.b)("inlineCode",{parentName:"p"},"Play")," button and trigger the deployment of your chart (see point 1 in the picture below)."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/deploy.png",alt:"Datadog - Deploy"})),Object(r.b)("p",null,"You can follow the deployment and access the deployment logs by pressing the ",Object(r.b)("inlineCode",{parentName:"p"},"Log")," button (see point 2 in the picutre above)."),Object(r.b)("p",null,"Once the deployment is completed, you should see the Datadog agent pods and their status directly within the Qovery console."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/datadog-pods.png",alt:"Datadog - Pods"})),Object(r.b)("p",null,"You can also look at the Pod logs by pressing the ",Object(r.b)("inlineCode",{parentName:"p"},"Log")," button.")),Object(r.b)("li",null,Object(r.b)("h4",{id:"verify-the-setup-on-datadog"},"Verify the setup on Datadog"),Object(r.b)("p",null,"Access again your Datadog interface and access the Infrastructure > Containers > Kubernetes sections. You should now see the data coming from your Qovery cluster"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/kubernetes-observability-and-monitoring-with-datadog/datadog-console.png",alt:"Datadog - Console"}))))),Object(r.b)("h2",{id:"conclusion"},"Conclusion"),Object(r.b)("p",null,"You now have Datadog agent running on your Qovery cluster. You can check their ",Object(r.b)("inlineCode",{parentName:"p"},"Getting Started")," guide to familiarize yourself with the product: ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://docs.datadoghq.com/fr/getting_started"}),"https://docs.datadoghq.com/fr/getting_started"),"."))}p.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),o=a.n(n),r=a(463),i=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return o.a.createElement("div",{className:i()(a,"alert","alert--"+l,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||c))}),t)}},468:function(e,t,a){var n=a(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||a(10)&&n(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),o=a.n(n),r=a(464);t.a=function(e){var t=e.children,a=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),o=a(0),r=a.n(o),i=a(39),l=a(474),c=a(20),s=a.n(c);t.a=function(e){var t,a=e.to,c=e.href,u=a||c,d=Object(l.a)(u),b=Object(o.useRef)(!1),m=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!m&&d&&window.docusaurus.prefetch(u),function(){m&&t&&t.disconnect()}}),[u,m,d]),u&&d?r.a.createElement(i.b,Object(n.a)({},e,{onMouseEnter:function(){b.current||(window.docusaurus.preload(u),b.current=!0)},innerRef:function(e){var a,n;m&&e&&d&&(a=e,n=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:u})):r.a.createElement("a",Object(n.a)({},e,{href:u}))}},472:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=(a(463),a(471)),i=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,c={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},s="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(c),u=Object(n.useState)(null),d=u[0],b=u[1];return o.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!d&&o.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",o.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return b("yes")}},"Yes"),"\xa0\xa0",o.a.createElement("a",{href:s,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==d&&o.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",o.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=a(470),i=a(463),l=a.n(i);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,i=e.leftIcon,c=e.rightIcon,s=e.size,u=e.target,d=e.to,b=l()("jump-to","jump-to--"+s,a),m=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},i&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+i})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(c||"chevron-right")+" arrow"}))));return u?o.a.createElement("a",{href:d,target:u,className:b},m):o.a.createElement(r.a,{to:d,className:b},m)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),o=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),r=a.n(o),i=a(483),l=a(463),c=a.n(l),s=a(471),u=a.n(s),d=a(482),b=37,m=39;function p(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,s=e.values,u=e.selectedValue,d=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",o,{"tabs--block":t}),style:l},s.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return d.push(e)},onKeyDown:function(e){return i(d,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,o=e.size,l=e.values,c=l;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:l.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,i=e.groupId,l=e.label,c=e.placeholder,s=e.select,g=e.size,y=(e.style,e.values),f=e.urlKey,v=Object(d.a)(),j=v.tabGroupChoices,O=v.setTabGroupChoices,w=Object(o.useState)(a),N=w[0],D=w[1];if(null!=i){var k=j[i];null!=k&&k!==N&&D(k)}var E=function(e){D(e),null!=i&&O(i,e)},C=[],I=function(e,t,a){switch(a.keyCode){case m:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case b:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=u.a.parse(window.location.search);e[f]&&D(e[f])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(g||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),y.length>1&&(s?r.a.createElement(h,Object(n.a)({changeSelectedValue:E,handleKeydown:I,placeholder:c,selectedValue:N,size:g,tabRefs:C},e)):r.a.createElement(p,Object(n.a)({changeSelectedValue:E,handleKeydown:I,selectedValue:N,tabRefs:C},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},478:function(e,t,a){"use strict";var n=a(0),o=a.n(n);t.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/bb89e1a0.28e1ae7a.js b/bb89e1a0.bc1fed25.js similarity index 98% rename from bb89e1a0.28e1ae7a.js rename to bb89e1a0.bc1fed25.js index 10bf47680d..e3b055654c 100644 --- a/bb89e1a0.28e1ae7a.js +++ b/bb89e1a0.bc1fed25.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[229],{380:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return u})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return d}));var n=a(1),o=a(9),r=(a(0),a(465)),l=a(477),c=a(479),i=a(464),s=a(469),b=(a(473),{last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0}),u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",permalink:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli",readingTime:"5 min read",source:"@site/guides/tutorial/import-your-environment-variables-with-the-qovery-cli.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Import your environment variables with the Qovery CLI",truncated:!1,prevItem:{title:"How to write a Dockerfile",permalink:"/guides/tutorial/how-to-write-a-dockerfile"},nextItem:{title:"Integrate your application logs to Cloudwatch",permalink:"/guides/tutorial/cloudwatch-integration"}},m=[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Set your context",id:"set-your-context",children:[]},{value:"Import",id:"import",children:[{value:"Environment Variables",id:"environment-variables",children:[]},{value:"Secrets",id:"secrets",children:[]}]},{value:"Check",id:"check",children:[]}],p={rightToc:m};function d(e){var t=e.components,a=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},p,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The Qovery Web Interface support ",Object(r.b)("inlineCode",{parentName:"p"},".env")," (dot env) file import now. ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#import-environment-variables"}),"Check out the documentation"))),Object(r.b)("p",null,"When dealing with dozens of environment variables, it can be tedious to import them one by one. This is where the Qovery CLI with the env vars import feature helps. In this tutorial, you will learn how to import your environment variables and secrets via the Qovery CLI."),Object(r.b)(s.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Your dotenv (",Object(r.b)("inlineCode",{parentName:"li"},".env"),") file is ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://smartmob-rfc.readthedocs.io/en/latest/2-dotenv.html"}),"compliant to the following specs")),Object(r.b)("li",{parentName:"ul"},"You have created your application in Qovery"))),Object(r.b)("h2",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(c.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),"."))),Object(r.b)("h2",{id:"set-your-context"},"Set your context"),Object(r.b)("p",null,"Once you are authenticated with ",Object(r.b)("inlineCode",{parentName:"p"},"qovery auth"),", you must choose the application where you want to set the environment variables with the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery context set"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="connect to qovery"',title:'"connect',to:!0,'qovery"':!0}),"$ qovery auth\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="set the context"',title:'"set',the:!0,'context"':!0}),"~/Desktop $ qovery context set\nQovery: Current context:\nOrganization | Qovery Community\nProject | posthog\nEnvironment | prod\nApplication | proxy\n\nQovery: Select new context\nOrganization:\n\u2714 Qovery Realm\nProject:\n\u2714 Posthog\nEnvironment:\n\u2714 prod\nApplication:\n\u2714 nginx-proxy\n\nQovery: New context:\nOrganization | Qovery Realm\nProject | Posthog\nEnvironment | prod\nApplication | nginx-proxy\n")),Object(r.b)("h2",{id:"import"},"Import"),Object(r.b)("p",null,"With Qovery, you make the distinction between Environment Variables and Secrets. Basically, the value of a Secret is encrypted and cannot be revealed."),Object(r.b)("p",null,"Let's say that we have the following dotenv file ",Object(r.b)("inlineCode",{parentName:"p"},".env.development")," that we want to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-text",metastring:"title=.env.development",title:".env.development"}),"STRAPI_API_KEY=x.xxyyyzzz\nCOLOR_BACKGROUND=fff\nAUTH0_API_KEY_SECRET=0xb33f\nAPI_URL=https://api.mytld.com\n")),Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"STRAPI_API_KEY")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AUTH0_API_KEY_SECRET")," are Secrets. ",Object(r.b)("inlineCode",{parentName:"p"},"COLOR_BACKGROUND")," and ",Object(r.b)("inlineCode",{parentName:"p"},"API_URL")," are Environment Variables."),Object(r.b)("h3",{id:"environment-variables"},"Environment Variables"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Environment Variables works.")),Object(r.b)("p",null,"To import the Environment Variables from this file we run the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and we select the environment variables to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] COLOR_BACKGROUND=fff\n [ ] AUTH0_API_KEY_SECRET=0xb33f\n> [x] API_URL=https://api.mytld.com\n [ ] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? COLOR_BACKGROUND=fff, API_URL=https://api.mytld.com\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)("p",null,"If during the import something goes wrong, you will see the errors and why it failed."),Object(r.b)("h3",{id:"secrets"},"Secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Secrets works.")),Object(r.b)("p",null,"To import the Secrets, you need to run the same command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and select the secrets to import."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Secrets\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [ ] COLOR_BACKGROUND=fff\n [x] AUTH0_API_KEY_SECRET=0xb33f\n [ ] API_URL=https://api.mytld.com\n> [x] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? STRAPI_API_KEY=x.xxyyyzzz, AUTH0_API_KEY_SECRET=0xb33\nQovery: \u2705 Secrets successfully imported!\n")),Object(r.b)("h2",{id:"check"},"Check"),Object(r.b)("p",null,"Open your environment variables console to check that everything has been set correctly."))}d.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),o=a.n(n),r=a(463),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,i=null;switch(c){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return o.a.createElement("div",{className:l()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:l()("feather","icon-"+(r||i))}),t)}},468:function(e,t,a){var n=a(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||a(10)&&n(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),o=a.n(n),r=a(464);t.a=function(e){var t=e.children,a=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),o=a(0),r=a.n(o),l=a(39),c=a(474),i=a(20),s=a.n(i);t.a=function(e){var t,a=e.to,i=e.href,b=a||i,u=Object(c.a)(b),m=Object(o.useRef)(!1),p=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!p&&u&&window.docusaurus.prefetch(b),function(){p&&t&&t.disconnect()}}),[b,p,u]),b&&u?r.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){m.current||(window.docusaurus.preload(b),m.current=!0)},innerRef:function(e){var a,n;p&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},473:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=a(470),l=a(463),c=a.n(l);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,i=e.rightIcon,s=e.size,b=e.target,u=e.to,m=c()("jump-to","jump-to--"+s,a),p=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},l&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+l})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(i||"chevron-right")+" arrow"}))));return b?o.a.createElement("a",{href:u,target:b,className:m},p):o.a.createElement(r.a,{to:u,className:m},p)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),o=(a(481),a(478),a(52),a(29),a(22),a(21),a(0)),r=a.n(o),l=a(483),c=a(463),i=a.n(c),s=a(471),b=a.n(s),u=a(482),m=37,p=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,o=e.className,l=e.handleKeydown,c=e.style,s=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",o,{"tabs--block":t}),style:c},s.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:i()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return l(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function v(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,o=e.size,c=e.values,i=c;if(i[0].group){var s=_.groupBy(i,"group");i=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:i,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,c=e.label,i=e.placeholder,s=e.select,h=e.size,y=(e.style,e.values),O=e.urlKey,f=Object(u.a)(),j=f.tabGroupChoices,g=f.setTabGroupChoices,w=Object(o.useState)(a),N=w[0],x=w[1];if(null!=l){var I=j[l];null!=I&&I!==N&&x(I)}var T=function(e){x(e),null!=l&&g(l,e)},C=[],E=function(e,t,a){switch(a.keyCode){case p:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&x(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),y.length>1&&(s?r.a.createElement(v,Object(n.a)({changeSelectedValue:T,handleKeydown:E,placeholder:i,selectedValue:N,size:h,tabRefs:C},e)):r.a.createElement(d,Object(n.a)({changeSelectedValue:T,handleKeydown:E,selectedValue:N,tabRefs:C},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},479:function(e,t,a){"use strict";var n=a(0),o=a.n(n);t.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[229],{380:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return u})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return d}));var n=a(1),o=a(9),r=(a(0),a(465)),l=a(477),c=a(478),i=a(464),s=a(469),b=(a(473),{last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0}),u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",permalink:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli",readingTime:"5 min read",source:"@site/guides/tutorial/import-your-environment-variables-with-the-qovery-cli.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Import your environment variables with the Qovery CLI",truncated:!1,prevItem:{title:"How to write a Dockerfile",permalink:"/guides/tutorial/how-to-write-a-dockerfile"},nextItem:{title:"Integrate your application logs to Cloudwatch",permalink:"/guides/tutorial/cloudwatch-integration"}},m=[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Set your context",id:"set-your-context",children:[]},{value:"Import",id:"import",children:[{value:"Environment Variables",id:"environment-variables",children:[]},{value:"Secrets",id:"secrets",children:[]}]},{value:"Check",id:"check",children:[]}],p={rightToc:m};function d(e){var t=e.components,a=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},p,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The Qovery Web Interface support ",Object(r.b)("inlineCode",{parentName:"p"},".env")," (dot env) file import now. ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#import-environment-variables"}),"Check out the documentation"))),Object(r.b)("p",null,"When dealing with dozens of environment variables, it can be tedious to import them one by one. This is where the Qovery CLI with the env vars import feature helps. In this tutorial, you will learn how to import your environment variables and secrets via the Qovery CLI."),Object(r.b)(s.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Your dotenv (",Object(r.b)("inlineCode",{parentName:"li"},".env"),") file is ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://smartmob-rfc.readthedocs.io/en/latest/2-dotenv.html"}),"compliant to the following specs")),Object(r.b)("li",{parentName:"ul"},"You have created your application in Qovery"))),Object(r.b)("h2",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(c.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),"."))),Object(r.b)("h2",{id:"set-your-context"},"Set your context"),Object(r.b)("p",null,"Once you are authenticated with ",Object(r.b)("inlineCode",{parentName:"p"},"qovery auth"),", you must choose the application where you want to set the environment variables with the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery context set"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="connect to qovery"',title:'"connect',to:!0,'qovery"':!0}),"$ qovery auth\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="set the context"',title:'"set',the:!0,'context"':!0}),"~/Desktop $ qovery context set\nQovery: Current context:\nOrganization | Qovery Community\nProject | posthog\nEnvironment | prod\nApplication | proxy\n\nQovery: Select new context\nOrganization:\n\u2714 Qovery Realm\nProject:\n\u2714 Posthog\nEnvironment:\n\u2714 prod\nApplication:\n\u2714 nginx-proxy\n\nQovery: New context:\nOrganization | Qovery Realm\nProject | Posthog\nEnvironment | prod\nApplication | nginx-proxy\n")),Object(r.b)("h2",{id:"import"},"Import"),Object(r.b)("p",null,"With Qovery, you make the distinction between Environment Variables and Secrets. Basically, the value of a Secret is encrypted and cannot be revealed."),Object(r.b)("p",null,"Let's say that we have the following dotenv file ",Object(r.b)("inlineCode",{parentName:"p"},".env.development")," that we want to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-text",metastring:"title=.env.development",title:".env.development"}),"STRAPI_API_KEY=x.xxyyyzzz\nCOLOR_BACKGROUND=fff\nAUTH0_API_KEY_SECRET=0xb33f\nAPI_URL=https://api.mytld.com\n")),Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"STRAPI_API_KEY")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AUTH0_API_KEY_SECRET")," are Secrets. ",Object(r.b)("inlineCode",{parentName:"p"},"COLOR_BACKGROUND")," and ",Object(r.b)("inlineCode",{parentName:"p"},"API_URL")," are Environment Variables."),Object(r.b)("h3",{id:"environment-variables"},"Environment Variables"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Environment Variables works.")),Object(r.b)("p",null,"To import the Environment Variables from this file we run the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and we select the environment variables to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] COLOR_BACKGROUND=fff\n [ ] AUTH0_API_KEY_SECRET=0xb33f\n> [x] API_URL=https://api.mytld.com\n [ ] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? COLOR_BACKGROUND=fff, API_URL=https://api.mytld.com\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)("p",null,"If during the import something goes wrong, you will see the errors and why it failed."),Object(r.b)("h3",{id:"secrets"},"Secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Secrets works.")),Object(r.b)("p",null,"To import the Secrets, you need to run the same command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and select the secrets to import."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Secrets\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [ ] COLOR_BACKGROUND=fff\n [x] AUTH0_API_KEY_SECRET=0xb33f\n [ ] API_URL=https://api.mytld.com\n> [x] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? STRAPI_API_KEY=x.xxyyyzzz, AUTH0_API_KEY_SECRET=0xb33\nQovery: \u2705 Secrets successfully imported!\n")),Object(r.b)("h2",{id:"check"},"Check"),Object(r.b)("p",null,"Open your environment variables console to check that everything has been set correctly."))}d.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),o=a.n(n),r=a(463),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,i=null;switch(c){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return o.a.createElement("div",{className:l()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:l()("feather","icon-"+(r||i))}),t)}},468:function(e,t,a){var n=a(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||a(10)&&n(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),o=a.n(n),r=a(464);t.a=function(e){var t=e.children,a=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),o=a(0),r=a.n(o),l=a(39),c=a(474),i=a(20),s=a.n(i);t.a=function(e){var t,a=e.to,i=e.href,b=a||i,u=Object(c.a)(b),m=Object(o.useRef)(!1),p=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!p&&u&&window.docusaurus.prefetch(b),function(){p&&t&&t.disconnect()}}),[b,p,u]),b&&u?r.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){m.current||(window.docusaurus.preload(b),m.current=!0)},innerRef:function(e){var a,n;p&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},473:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=a(470),l=a(463),c=a.n(l);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,i=e.rightIcon,s=e.size,b=e.target,u=e.to,m=c()("jump-to","jump-to--"+s,a),p=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},l&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+l})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(i||"chevron-right")+" arrow"}))));return b?o.a.createElement("a",{href:u,target:b,className:m},p):o.a.createElement(r.a,{to:u,className:m},p)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),o=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),r=a.n(o),l=a(483),c=a(463),i=a.n(c),s=a(471),b=a.n(s),u=a(482),m=37,p=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,o=e.className,l=e.handleKeydown,c=e.style,s=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",o,{"tabs--block":t}),style:c},s.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:i()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return l(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function v(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,o=e.size,c=e.values,i=c;if(i[0].group){var s=_.groupBy(i,"group");i=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:i,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,c=e.label,i=e.placeholder,s=e.select,h=e.size,y=(e.style,e.values),O=e.urlKey,f=Object(u.a)(),j=f.tabGroupChoices,g=f.setTabGroupChoices,w=Object(o.useState)(a),N=w[0],x=w[1];if(null!=l){var I=j[l];null!=I&&I!==N&&x(I)}var T=function(e){x(e),null!=l&&g(l,e)},C=[],E=function(e,t,a){switch(a.keyCode){case p:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&x(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),y.length>1&&(s?r.a.createElement(v,Object(n.a)({changeSelectedValue:T,handleKeydown:E,placeholder:i,selectedValue:N,size:h,tabRefs:C},e)):r.a.createElement(d,Object(n.a)({changeSelectedValue:T,handleKeydown:E,selectedValue:N,tabRefs:C},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},478:function(e,t,a){"use strict";var n=a(0),o=a.n(n);t.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/c4f5d8e4.9549eb87.js b/c4f5d8e4.653cca23.js similarity index 99% rename from c4f5d8e4.9549eb87.js rename to c4f5d8e4.653cca23.js index 03e55dba0c..d23a88e238 100644 --- a/c4f5d8e4.9549eb87.js +++ b/c4f5d8e4.653cca23.js @@ -1,2 +1,2 @@ -/*! For license information please see c4f5d8e4.9549eb87.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[242],{393:function(e,t,a){"use strict";a.r(t);var n=a(0),r=a.n(n),i=a(490),l=a(487),o=a(602);Object(i.a)("h2");t.default=function(){return r.a.createElement(l.a,{title:"Qovery Hub | Documentation, Guides, Tutorials",description:"Qovery is an Internal Developer Platform Helping Platform Engineers and Developers To Ship Faster."},r.a.createElement("header",{className:"hero"},r.a.createElement("div",{className:"container container--fluid"},r.a.createElement("h1",null,"Qovery Hub Resources"),r.a.createElement(o.a,{buttonClass:"highlight",description:"Qovery is a DevOps Automation Platform that eliminates your DevOps hiring needs. Provision and maintain a secure and compliant infrastructure in hours - not months!.",center:!0,size:"lg"}))),r.a.createElement("main",null,r.a.createElement("section",null,r.a.createElement("div",{className:"container"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"docs",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-book"})),r.a.createElement("div",{className:"panel--title"},"Documentation"),r.a.createElement("div",{className:"panel--description"},"Read our product documentation"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"guides",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-layers"})),r.a.createElement("div",{className:"panel--title"},"Guides"),r.a.createElement("div",{className:"panel--description"},"Get started using Qovery smoothly"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"guides/tutorial",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-bookmark"})),r.a.createElement("div",{className:"panel--title"},"Tutorials"),r.a.createElement("div",{className:"panel--description"},"Check out our community tutorials"))))),r.a.createElement("div",{className:"container",style:{marginTop:"10px"}},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://roadmap.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-flag"})),r.a.createElement("div",{className:"panel--title"},"Roadmap"),r.a.createElement("div",{className:"panel--description"},"Check out our public Roadmap"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://discuss.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-message-circle"})),r.a.createElement("div",{className:"panel--title"},"Forum"),r.a.createElement("div",{className:"panel--description"},"Join our community on Discourse"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://github.com/Qovery",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-github"})),r.a.createElement("div",{className:"panel--title"},"Github"),r.a.createElement("div",{className:"panel--description"},"Issues, code, and development"))))))))}},463:function(e,t,a){var n;!function(){"use strict";var a={}.hasOwnProperty;function r(){for(var e=[],t=0;t0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(u.a,{className:"navbar__logo",src:f,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),c.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(z,e))}))):null)}))),(m||l)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:M.a.footerLogoLink},r.a.createElement(P,{alt:m.alt,url:d})):r.a.createElement(P,{alt:m.alt,url:d})),r.a.createElement("small",null,l),r.a.createElement("br",null))))},R=a(502),q=a(503),F=a(3);a(138);t.a=function(e){var t=Object(p.a)().siteConfig,a=void 0===t?{}:t,n=a.title,o=a.themeConfig.image,c=a.url,s=e.children,m=e.title,u=e.noFooter,d=e.description,f=e.image,h=e.keywords,g=e.version,v=m?m+" | "+n:n,b=f||o,E=c+Object(_.a)(b),y=Object(F.h)(),w=y?"https://docs.qovery.com"+(y.pathname.endsWith("/")?y.pathname:y.pathname+"/"):null;return r.a.createElement(q.a,null,r.a.createElement(R.a,null,r.a.createElement(l.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),v&&r.a.createElement("title",null,v),v&&r.a.createElement("meta",{property:"og:title",content:v}),r.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),r.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),r.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),r.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),r.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),r.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),d&&r.a.createElement("meta",{name:"description",content:d}),d&&r.a.createElement("meta",{property:"og:description",content:d}),g&&r.a.createElement("meta",{name:"docsearch:version",content:g}),h&&h.length&&r.a.createElement("meta",{name:"keywords",content:h.join(",")}),b&&r.a.createElement("meta",{property:"og:image",content:E}),b&&r.a.createElement("meta",{property:"twitter:image",content:E}),b&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+v}),w&&r.a.createElement("meta",{property:"og:url",content:w}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),w&&r.a.createElement("link",{rel:"canonical",href:w})),r.a.createElement(i.a,null),r.a.createElement(S,null),r.a.createElement("div",{className:"main-wrapper"},s),!u&&r.a.createElement(Q,null)))}},490:function(e,t,a){"use strict";var n=a(9),r=a(0),i=a.n(r),l=a(463),o=a.n(l),c=a(476),s=(a(139),a(140)),m=a.n(s);t.a=function(e){return function(t){var a,r=t.id,l=Object(n.a)(t,["id"]),s=Object(c.a)().siteConfig,u=(s=void 0===s?{}:s).themeConfig,d=(u=void 0===u?{}:u).navbar,f=(d=void 0===d?{}:d).hideOnScroll,p=void 0!==f&&f;return r?i.a.createElement(e,l,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:o()("anchor",(a={},a[m.a.enhancedAnchor]=!p,a)),id:r}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),l.children):i.a.createElement(e,l)}}},494:function(e,t,a){"use strict";var n=a(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=r},519:function(e,t){var a,n,r=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function l(){throw new Error("clearTimeout has not been defined")}function o(e){if(a===setTimeout)return setTimeout(e,0);if((a===i||!a)&&setTimeout)return a=setTimeout,setTimeout(e,0);try{return a(e,0)}catch(t){try{return a.call(null,e,0)}catch(t){return a.call(this,e,0)}}}!function(){try{a="function"==typeof setTimeout?setTimeout:i}catch(e){a=i}try{n="function"==typeof clearTimeout?clearTimeout:l}catch(e){n=l}}();var c,s=[],m=!1,u=-1;function d(){m&&c&&(m=!1,c.length?s=c.concat(s):u=-1,s.length&&f())}function f(){if(!m){var e=o(d);m=!0;for(var t=s.length;t;){for(c=s,s=[];++u1)for(var a=1;a=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(e){}}(),t.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],t.formatters.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},t.enable(r())}).call(this,a(519))},596:function(e,t,a){var n;function r(e){function a(){if(a.enabled){var e=a,r=+new Date,i=r-(n||r);e.diff=i,e.prev=n,e.curr=r,n=r;for(var l=new Array(arguments.length),o=0;o0)return function(e){if((e=String(e)).length>100)return;var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(!t)return;var l=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*l;case"days":case"day":case"d":return l*i;case"hours":case"hour":case"hrs":case"hr":case"h":return l*r;case"minutes":case"minute":case"mins":case"min":case"m":return l*n;case"seconds":case"second":case"secs":case"sec":case"s":return l*a;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return l;default:return}}(e);if("number"===c&&!1===isNaN(e))return t.long?l(o=e,i,"day")||l(o,r,"hour")||l(o,n,"minute")||l(o,a,"second")||o+" ms":function(e){if(e>=i)return Math.round(e/i)+"d";if(e>=r)return Math.round(e/r)+"h";if(e>=n)return Math.round(e/n)+"m";if(e>=a)return Math.round(e/a)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},598:function(e,t,a){"use strict";var n=/^[-!#$%&'*+\/0-9=?A-Z^_a-z{|}~](\.?[-!#$%&'*+\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\.?[a-zA-Z0-9])*\.[a-zA-Z](-?[a-zA-Z0-9])+$/;t.validate=function(e){if(!e)return!1;if(e.length>254)return!1;if(!n.test(e))return!1;var t=e.split("@");return!(t[0].length>64)&&!t[1].split(".").some((function(e){return e.length>63}))}},602:function(e,t,a){"use strict";a(488),a(489);var n=a(0),r=a.n(n),i=a(463),l=a.n(i),o=(a(58),a(21),a(594)),c=a.n(o),s=a(598),m=function(e){return new Promise((function(t,a){return c()(e,{param:"c",timeout:3500},(function(e,n){e&&a(e),n&&t(n)}))}))},u=function(e){var t="";for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var n="group["===a.substring(0,6)?a:a.toUpperCase();t=t.concat("&"+n+"="+e[a])}return t},d=function(e,t,a){var n=Object(s.validate)(e),r=encodeURIComponent(e);if(!n)return Promise.resolve({result:"error",msg:"The email you entered is not valid."});var i="https://qovery.us4.list-manage.com/subscribe/post-json?u=3c76e7a2087d5bc4020348c46&id=63bd993879";arguments.length<3&&"string"==typeof t?i=t:"string"==typeof a&&(i=a);var l="&EMAIL="+r+u(t),o=""+i+l;return m(o)};a(152),t.a=function(e){var t,a=e.block,i=e.buttonClass,o=e.center,c=e.description,s=e.subscriptionEnabled,m=e.size,u=e.width,f=Object(n.useState)(""),p=f[0],h=f[1],g=Object(n.useState)(!1),v=g[0],b=g[1],E=Object(n.useState)(!1),y=E[0],w=E[1],N=Object(n.useState)("Could not subscribe :("),k=N[0],_=N[1];return r.a.createElement("div",{className:l()("mailing-list",(t={"mailing-list--block":a,"mailing-list--center":o},t["mailing-list--"+m]=m,t))},!1!==c&&r.a.createElement("div",{className:"mailing-list--description"},c),s&&!v&&r.a.createElement("form",{onSubmit:function(e){return function(e){e.preventDefault(),d(p).then((function(e){"success"===e.result?(b(!0),y&&w(!1)):(w(!0),e.msg.includes(p+" is already subscribed")?_("This email is already subscribed to the newsletter"):_("Could not subscribe :("))})).catch((function(e){w(!0)}))}(e)},className:l()("mailing-list--form")},r.a.createElement("input",{onChange:function(e){return h(e.target.value)},className:l()("input","input--"+m),name:"email",placeholder:"you@email.com",type:"email",style:{width:u}}),r.a.createElement("button",{className:l()("button","button--"+(i||"primary"),"button--"+m),type:"submit"},"Subscribe")),y&&r.a.createElement("span",{className:"badge badge--secondary"},k),r.a.createElement("div",{style:{textAlign:"center"}},s&&v&&r.a.createElement("span",{className:"badge badge--primary"},"Subscribed!")))}}}]); \ No newline at end of file +/*! For license information please see c4f5d8e4.653cca23.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[242],{393:function(e,t,a){"use strict";a.r(t);var n=a(0),r=a.n(n),i=a(490),l=a(487),o=a(602);Object(i.a)("h2");t.default=function(){return r.a.createElement(l.a,{title:"Qovery Hub | Documentation, Guides, Tutorials",description:"Qovery is an Internal Developer Platform Helping Platform Engineers and Developers To Ship Faster."},r.a.createElement("header",{className:"hero"},r.a.createElement("div",{className:"container container--fluid"},r.a.createElement("h1",null,"Qovery Hub Resources"),r.a.createElement(o.a,{buttonClass:"highlight",description:"Qovery is a DevOps Automation Platform that eliminates your DevOps hiring needs. Provision and maintain a secure and compliant infrastructure in hours - not months!.",center:!0,size:"lg"}))),r.a.createElement("main",null,r.a.createElement("section",null,r.a.createElement("div",{className:"container"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"docs",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-book"})),r.a.createElement("div",{className:"panel--title"},"Documentation"),r.a.createElement("div",{className:"panel--description"},"Read our product documentation"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"guides",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-layers"})),r.a.createElement("div",{className:"panel--title"},"Guides"),r.a.createElement("div",{className:"panel--description"},"Get started using Qovery smoothly"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"guides/tutorial",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-bookmark"})),r.a.createElement("div",{className:"panel--title"},"Tutorials"),r.a.createElement("div",{className:"panel--description"},"Check out our community tutorials"))))),r.a.createElement("div",{className:"container",style:{marginTop:"10px"}},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://roadmap.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-flag"})),r.a.createElement("div",{className:"panel--title"},"Roadmap"),r.a.createElement("div",{className:"panel--description"},"Check out our public Roadmap"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://discuss.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-message-circle"})),r.a.createElement("div",{className:"panel--title"},"Forum"),r.a.createElement("div",{className:"panel--description"},"Join our community on Discourse"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://github.com/Qovery",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-github"})),r.a.createElement("div",{className:"panel--title"},"Github"),r.a.createElement("div",{className:"panel--description"},"Issues, code, and development"))))))))}},463:function(e,t,a){var n;!function(){"use strict";var a={}.hasOwnProperty;function r(){for(var e=[],t=0;t0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(u.a,{className:"navbar__logo",src:f,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),c.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(z,e))}))):null)}))),(m||l)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:M.a.footerLogoLink},r.a.createElement(P,{alt:m.alt,url:d})):r.a.createElement(P,{alt:m.alt,url:d})),r.a.createElement("small",null,l),r.a.createElement("br",null))))},R=a(502),q=a(503),F=a(3);a(138);t.a=function(e){var t=Object(p.a)().siteConfig,a=void 0===t?{}:t,n=a.title,o=a.themeConfig.image,c=a.url,s=e.children,m=e.title,u=e.noFooter,d=e.description,f=e.image,h=e.keywords,g=e.version,v=m?m+" | "+n:n,b=f||o,E=c+Object(_.a)(b),y=Object(F.h)(),w=y?"https://docs.qovery.com"+(y.pathname.endsWith("/")?y.pathname:y.pathname+"/"):null;return r.a.createElement(q.a,null,r.a.createElement(R.a,null,r.a.createElement(l.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),v&&r.a.createElement("title",null,v),v&&r.a.createElement("meta",{property:"og:title",content:v}),r.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),r.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),r.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),r.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),r.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),r.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),r.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),d&&r.a.createElement("meta",{name:"description",content:d}),d&&r.a.createElement("meta",{property:"og:description",content:d}),g&&r.a.createElement("meta",{name:"docsearch:version",content:g}),h&&h.length&&r.a.createElement("meta",{name:"keywords",content:h.join(",")}),b&&r.a.createElement("meta",{property:"og:image",content:E}),b&&r.a.createElement("meta",{property:"twitter:image",content:E}),b&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+v}),w&&r.a.createElement("meta",{property:"og:url",content:w}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),w&&r.a.createElement("link",{rel:"canonical",href:w})),r.a.createElement(i.a,null),r.a.createElement(S,null),r.a.createElement("div",{className:"main-wrapper"},s),!u&&r.a.createElement(Q,null)))}},490:function(e,t,a){"use strict";var n=a(9),r=a(0),i=a.n(r),l=a(463),o=a.n(l),c=a(476),s=(a(139),a(140)),m=a.n(s);t.a=function(e){return function(t){var a,r=t.id,l=Object(n.a)(t,["id"]),s=Object(c.a)().siteConfig,u=(s=void 0===s?{}:s).themeConfig,d=(u=void 0===u?{}:u).navbar,f=(d=void 0===d?{}:d).hideOnScroll,p=void 0!==f&&f;return r?i.a.createElement(e,l,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:o()("anchor",(a={},a[m.a.enhancedAnchor]=!p,a)),id:r}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),l.children):i.a.createElement(e,l)}}},494:function(e,t,a){"use strict";var n=a(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=r},519:function(e,t){var a,n,r=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function l(){throw new Error("clearTimeout has not been defined")}function o(e){if(a===setTimeout)return setTimeout(e,0);if((a===i||!a)&&setTimeout)return a=setTimeout,setTimeout(e,0);try{return a(e,0)}catch(t){try{return a.call(null,e,0)}catch(t){return a.call(this,e,0)}}}!function(){try{a="function"==typeof setTimeout?setTimeout:i}catch(e){a=i}try{n="function"==typeof clearTimeout?clearTimeout:l}catch(e){n=l}}();var c,s=[],m=!1,u=-1;function d(){m&&c&&(m=!1,c.length?s=c.concat(s):u=-1,s.length&&f())}function f(){if(!m){var e=o(d);m=!0;for(var t=s.length;t;){for(c=s,s=[];++u1)for(var a=1;a=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(e){}}(),t.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],t.formatters.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},t.enable(r())}).call(this,a(519))},596:function(e,t,a){var n;function r(e){function a(){if(a.enabled){var e=a,r=+new Date,i=r-(n||r);e.diff=i,e.prev=n,e.curr=r,n=r;for(var l=new Array(arguments.length),o=0;o0)return function(e){if((e=String(e)).length>100)return;var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(!t)return;var l=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*l;case"days":case"day":case"d":return l*i;case"hours":case"hour":case"hrs":case"hr":case"h":return l*r;case"minutes":case"minute":case"mins":case"min":case"m":return l*n;case"seconds":case"second":case"secs":case"sec":case"s":return l*a;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return l;default:return}}(e);if("number"===c&&!1===isNaN(e))return t.long?l(o=e,i,"day")||l(o,r,"hour")||l(o,n,"minute")||l(o,a,"second")||o+" ms":function(e){if(e>=i)return Math.round(e/i)+"d";if(e>=r)return Math.round(e/r)+"h";if(e>=n)return Math.round(e/n)+"m";if(e>=a)return Math.round(e/a)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},598:function(e,t,a){"use strict";var n=/^[-!#$%&'*+\/0-9=?A-Z^_a-z{|}~](\.?[-!#$%&'*+\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\.?[a-zA-Z0-9])*\.[a-zA-Z](-?[a-zA-Z0-9])+$/;t.validate=function(e){if(!e)return!1;if(e.length>254)return!1;if(!n.test(e))return!1;var t=e.split("@");return!(t[0].length>64)&&!t[1].split(".").some((function(e){return e.length>63}))}},602:function(e,t,a){"use strict";a(488),a(489);var n=a(0),r=a.n(n),i=a(463),l=a.n(i),o=(a(58),a(21),a(594)),c=a.n(o),s=a(598),m=function(e){return new Promise((function(t,a){return c()(e,{param:"c",timeout:3500},(function(e,n){e&&a(e),n&&t(n)}))}))},u=function(e){var t="";for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var n="group["===a.substring(0,6)?a:a.toUpperCase();t=t.concat("&"+n+"="+e[a])}return t},d=function(e,t,a){var n=Object(s.validate)(e),r=encodeURIComponent(e);if(!n)return Promise.resolve({result:"error",msg:"The email you entered is not valid."});var i="https://qovery.us4.list-manage.com/subscribe/post-json?u=3c76e7a2087d5bc4020348c46&id=63bd993879";arguments.length<3&&"string"==typeof t?i=t:"string"==typeof a&&(i=a);var l="&EMAIL="+r+u(t),o=""+i+l;return m(o)};a(152),t.a=function(e){var t,a=e.block,i=e.buttonClass,o=e.center,c=e.description,s=e.subscriptionEnabled,m=e.size,u=e.width,f=Object(n.useState)(""),p=f[0],h=f[1],g=Object(n.useState)(!1),v=g[0],b=g[1],E=Object(n.useState)(!1),y=E[0],w=E[1],N=Object(n.useState)("Could not subscribe :("),k=N[0],_=N[1];return r.a.createElement("div",{className:l()("mailing-list",(t={"mailing-list--block":a,"mailing-list--center":o},t["mailing-list--"+m]=m,t))},!1!==c&&r.a.createElement("div",{className:"mailing-list--description"},c),s&&!v&&r.a.createElement("form",{onSubmit:function(e){return function(e){e.preventDefault(),d(p).then((function(e){"success"===e.result?(b(!0),y&&w(!1)):(w(!0),e.msg.includes(p+" is already subscribed")?_("This email is already subscribed to the newsletter"):_("Could not subscribe :("))})).catch((function(e){w(!0)}))}(e)},className:l()("mailing-list--form")},r.a.createElement("input",{onChange:function(e){return h(e.target.value)},className:l()("input","input--"+m),name:"email",placeholder:"you@email.com",type:"email",style:{width:u}}),r.a.createElement("button",{className:l()("button","button--"+(i||"primary"),"button--"+m),type:"submit"},"Subscribe")),y&&r.a.createElement("span",{className:"badge badge--secondary"},k),r.a.createElement("div",{style:{textAlign:"center"}},s&&v&&r.a.createElement("span",{className:"badge badge--primary"},"Subscribed!")))}}}]); \ No newline at end of file diff --git a/83e9e333.3e8358e1.js.LICENSE.txt b/c4f5d8e4.653cca23.js.LICENSE.txt similarity index 100% rename from 83e9e333.3e8358e1.js.LICENSE.txt rename to c4f5d8e4.653cca23.js.LICENSE.txt diff --git a/c4f5d8e4.9549eb87.js.LICENSE.txt b/c4f5d8e4.9549eb87.js.LICENSE.txt deleted file mode 100644 index bae6dd8e22..0000000000 --- a/c4f5d8e4.9549eb87.js.LICENSE.txt +++ /dev/null @@ -1,5 +0,0 @@ -/*! - Copyright (c) 2017 Jed Watson. - Licensed under the MIT License (MIT), see - http://jedwatson.github.io/classnames -*/ diff --git a/c6d06197.8258414f.js b/c6d06197.b383b794.js similarity index 99% rename from c6d06197.8258414f.js rename to c6d06197.b383b794.js index 1d988b244b..8bd1c39b2e 100644 --- a/c6d06197.8258414f.js +++ b/c6d06197.b383b794.js @@ -1,2 +1,2 @@ -/*! For license information please see c6d06197.8258414f.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[245],{396:function(t,e,n){"use strict";n.r(e);n(488),n(489),n(513),n(481),n(29),n(22),n(21),n(52),n(468);var r=n(0),o=n.n(r),i=n(543),u=n(556),a=n(490),c=n(487),l=n(470),f=n(544),s=n.n(f),p=(n(397),Object(a.a)("h2"));function v(t){var e=t.filtering,n=t.items;if(0==n.length)return o.a.createElement(i.a,{text:"no guides found"});if(e)return o.a.createElement(u.a,{items:n});var r=n.filter((function(t){return"getting-started"==t.content.metadata.categories[0].name})),a=n.filter((function(t){return"installation-guide"==t.content.metadata.categories[0].name})),c=a[0].content.metadata.categories[0],l=n.filter((function(t){return"advanced"==t.content.metadata.categories[0].name})),f=l[0].content.metadata.categories[0],s=n.filter((function(t){return"tutorial"==t.content.metadata.categories[0].name})),v=s[0].content.metadata.categories[0];return o.a.createElement(o.a.Fragment,null,o.a.createElement("section",null,o.a.createElement(u.a,{items:r,staggered:!0})),o.a.createElement("section",null,o.a.createElement(p,{id:c.permalink},c.title),c.description&&o.a.createElement("div",{className:"sub-title"},c.description),o.a.createElement(u.a,{items:a,large:!1})),o.a.createElement("section",null,o.a.createElement(p,{id:f.permalink},f.title),f.description&&o.a.createElement("div",{className:"sub-title"},f.description),o.a.createElement(u.a,{items:l,large:!1})),o.a.createElement("section",null,o.a.createElement(p,{id:v.permalink},v.title),v.description&&o.a.createElement("div",{className:"sub-title"},v.description),o.a.createElement(u.a,{items:s,large:!1})))}e.default=function(t){t.metadata;var e=t.items,n=t.location?s.a.parse(t.location.search,{ignoreQueryPrefix:!0}):{},i=Object(r.useState)(n.search),u=i[0],a=i[1],f=!1,p=e.filter((function(t){var e=t.content.metadata.tags,n=e.some((function(t){return t.label.startsWith("platform: ")})),r=e.some((function(t){return t.label.startsWith("source: ")})),o=e.some((function(t){return t.label.startsWith("sink: ")}));return!((n||r)&&o)}));return u&&(f=!0,p=p.filter((function(t){var e=u.toLowerCase(),n=(t.content.frontMatter,t.content.metadata);return!!n.coverLabel.toLowerCase().includes(e)||!!n.tags.some((function(t){return t.label.toLowerCase().includes(e)}))}))),o.a.createElement(c.a,{title:"Guides",description:"Guides, tutorials, and education."},o.a.createElement("header",{className:"hero hero--clean"},o.a.createElement("div",{className:"container"},o.a.createElement("h1",null,"Qovery Guides"),o.a.createElement("div",{className:"hero--subtitle"},"Thoughtful guides to help you get the most out of Qovery. Created and curated by the ",o.a.createElement(l.a,{to:"https://www.qovery.com/team"},"Qovery team"),"."),o.a.createElement("div",{className:"hero--search"},o.a.createElement("input",{type:"text",className:"input--text input--xl",onChange:function(t){return a(t.currentTarget.value)},placeholder:"\ud83d\udd0d Search by language, installation guides, database or tag..."})))),o.a.createElement("main",{className:"container container--s"},o.a.createElement(v,{filtering:f,items:p})))}},463:function(t,e,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var t=[],e=0;e1?arguments[1]:void 0)}}),n(74)("find")},481:function(t,e,n){"use strict";var r=n(8),o=n(526),i=n(55);n(56)("search",1,(function(t,e,n,u){return[function(n){var r=t(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,r):new RegExp(n)[e](String(r))},function(t){var e=u(n,t,this);if(e.done)return e.value;var a=r(t),c=String(this),l=a.lastIndex;o(l,0)||(a.lastIndex=0);var f=i(a,c);return o(a.lastIndex,l)||(a.lastIndex=l),null===f?-1:f.index}]}))},487:function(t,e,n){"use strict";n(497);var r=n(0),o=n.n(r),i=n(498),u=n(486),a=n(1),c=(n(488),n(489),n(499),n(470)),l=n(500),f=n(484),s=n.n(f),p=n(501),v=n.n(p),d=n(476),h=n(463),y=n.n(h),g=n(135),m=n.n(g),D=function(){return o.a.createElement("span",{className:y()(m.a.toggle,m.a.moon)})},_=function(){return o.a.createElement("span",{className:y()(m.a.toggle,m.a.sun)})},b=function(t){var e=Object(d.a)().isClient;return o.a.createElement(v.a,Object(a.a)({disabled:!e,icons:{checked:o.a.createElement(D,null),unchecked:o.a.createElement(_,null)}},t))};function E(){var t=Object(d.a)().siteConfig,e=(void 0===t?{}:t).customFields.metadata.latest_post,n=Date.parse(e.date),r=new Date,o=Math.abs(r-n),i=Math.ceil(o/864e5),u=null;return"undefined"!=typeof window&&(u=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!u||u0&&o.a.createElement("div",{className:"row footer__links"},o.a.createElement("div",{className:"col col--5 footer__col"},o.a.createElement("div",{className:"margin-bottom--md"},o.a.createElement(s.a,{className:"navbar__logo",src:v,alt:"Qovery",width:"150",height:"auto"})),o.a.createElement("div",{className:"margin-bottom--md"},o.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),o.a.createElement("div",null,o.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},o.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",o.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},o.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",o.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},o.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),c.map((function(t,e){return o.a.createElement("div",{key:e,className:"col footer__col"},null!=t.title?o.a.createElement("h4",{className:"footer__title"},t.title):null,null!=t.items&&Array.isArray(t.items)&&t.items.length>0?o.a.createElement("ul",{className:"footer__items"},t.items.map((function(t,e){return t.html?o.a.createElement("li",{key:e,className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):o.a.createElement("li",{key:t.href||t.to,className:"footer__item"},o.a.createElement(B,t))}))):null)}))),(f||u)&&o.a.createElement("div",{className:"text--center"},f&&f.src&&o.a.createElement("div",{className:"margin-bottom--sm"},f.href?o.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:R.a.footerLogoLink},o.a.createElement(L,{alt:f.alt,url:p})):o.a.createElement(L,{alt:f.alt,url:p})),o.a.createElement("small",null,u),o.a.createElement("br",null))))},M=n(502),W=n(503),U=n(3);n(138);e.a=function(t){var e=Object(d.a)().siteConfig,n=void 0===e?{}:e,r=n.title,a=n.themeConfig.image,c=n.url,l=t.children,f=t.title,s=t.noFooter,p=t.description,v=t.image,h=t.keywords,y=t.version,g=f?f+" | "+r:r,m=v||a,D=c+Object(F.a)(m),_=Object(U.h)(),b=_?"https://docs.qovery.com"+(_.pathname.endsWith("/")?_.pathname:_.pathname+"/"):null;return o.a.createElement(W.a,null,o.a.createElement(M.a,null,o.a.createElement(u.a,null,o.a.createElement("html",{lang:"en"}),o.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),g&&o.a.createElement("title",null,g),g&&o.a.createElement("meta",{property:"og:title",content:g}),o.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),o.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),o.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),o.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),o.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),o.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),o.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),o.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),p&&o.a.createElement("meta",{name:"description",content:p}),p&&o.a.createElement("meta",{property:"og:description",content:p}),y&&o.a.createElement("meta",{name:"docsearch:version",content:y}),h&&h.length&&o.a.createElement("meta",{name:"keywords",content:h.join(",")}),m&&o.a.createElement("meta",{property:"og:image",content:D}),m&&o.a.createElement("meta",{property:"twitter:image",content:D}),m&&o.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+g}),b&&o.a.createElement("meta",{property:"og:url",content:b}),o.a.createElement("meta",{name:"twitter:card",content:"summary"}),b&&o.a.createElement("link",{rel:"canonical",href:b})),o.a.createElement(i.a,null),o.a.createElement(N,null),o.a.createElement("div",{className:"main-wrapper"},l),!s&&o.a.createElement(T,null)))}},490:function(t,e,n){"use strict";var r=n(9),o=n(0),i=n.n(o),u=n(463),a=n.n(u),c=n(476),l=(n(139),n(140)),f=n.n(l);e.a=function(t){return function(e){var n,o=e.id,u=Object(r.a)(e,["id"]),l=Object(c.a)().siteConfig,s=(l=void 0===l?{}:l).themeConfig,p=(s=void 0===s?{}:s).navbar,v=(p=void 0===p?{}:p).hideOnScroll,d=void 0!==v&&v;return o?i.a.createElement(t,u,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:a()("anchor",(n={},n[f.a.enhancedAnchor]=!d,n)),id:o}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+o,title:"Direct link to heading"},"#"),u.children):i.a.createElement(t,u)}}},491:function(t,e,n){(function(t,r){var o;(function(){var i="Expected a function",u="__lodash_placeholder__",a=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",f="[object Boolean]",s="[object Date]",p="[object Error]",v="[object Function]",d="[object GeneratorFunction]",h="[object Map]",y="[object Number]",g="[object Object]",m="[object RegExp]",D="[object Set]",_="[object String]",b="[object Symbol]",E="[object WeakMap]",w="[object ArrayBuffer]",F="[object DataView]",A="[object Float32Array]",j="[object Float64Array]",x="[object Int8Array]",O="[object Int16Array]",S="[object Int32Array]",k="[object Uint8Array]",C="[object Uint16Array]",N="[object Uint32Array]",P=/\b__p \+= '';/g,I=/\b(__p \+=) '' \+/g,R=/(__e\(.*?\)|\b__t\)) \+\n'';/g,B=/&(?:amp|lt|gt|quot|#39);/g,L=/[&<>"']/g,T=RegExp(B.source),M=RegExp(L.source),W=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,z=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,q=/^\w*$/,G=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,V=/[\\^$.*+?()[\]{}|]/g,H=RegExp(V.source),Q=/^\s+|\s+$/g,J=/^\s+/,Z=/\s+$/,K=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,tt=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,et=/\\(\\)?/g,nt=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,rt=/\w*$/,ot=/^[-+]0x[0-9a-f]+$/i,it=/^0b[01]+$/i,ut=/^\[object .+?Constructor\]$/,at=/^0o[0-7]+$/i,ct=/^(?:0|[1-9]\d*)$/,lt=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ft=/($^)/,st=/['\n\r\u2028\u2029\\]/g,pt="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",vt="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",dt="[\\ud800-\\udfff]",ht="["+vt+"]",yt="["+pt+"]",gt="\\d+",mt="[\\u2700-\\u27bf]",Dt="[a-z\\xdf-\\xf6\\xf8-\\xff]",_t="[^\\ud800-\\udfff"+vt+gt+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",bt="\\ud83c[\\udffb-\\udfff]",Et="[^\\ud800-\\udfff]",wt="(?:\\ud83c[\\udde6-\\uddff]){2}",Ft="[\\ud800-\\udbff][\\udc00-\\udfff]",At="[A-Z\\xc0-\\xd6\\xd8-\\xde]",jt="(?:"+Dt+"|"+_t+")",xt="(?:"+At+"|"+_t+")",Ot="(?:"+yt+"|"+bt+")"+"?",St="[\\ufe0e\\ufe0f]?"+Ot+("(?:\\u200d(?:"+[Et,wt,Ft].join("|")+")[\\ufe0e\\ufe0f]?"+Ot+")*"),kt="(?:"+[mt,wt,Ft].join("|")+")"+St,Ct="(?:"+[Et+yt+"?",yt,wt,Ft,dt].join("|")+")",Nt=RegExp("['\u2019]","g"),Pt=RegExp(yt,"g"),It=RegExp(bt+"(?="+bt+")|"+Ct+St,"g"),Rt=RegExp([At+"?"+Dt+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[ht,At,"$"].join("|")+")",xt+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[ht,At+jt,"$"].join("|")+")",At+"?"+jt+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",At+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",gt,kt].join("|"),"g"),Bt=RegExp("[\\u200d\\ud800-\\udfff"+pt+"\\ufe0e\\ufe0f]"),Lt=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Tt=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Mt=-1,Wt={};Wt[A]=Wt[j]=Wt[x]=Wt[O]=Wt[S]=Wt[k]=Wt["[object Uint8ClampedArray]"]=Wt[C]=Wt[N]=!0,Wt[c]=Wt[l]=Wt[w]=Wt[f]=Wt[F]=Wt[s]=Wt[p]=Wt[v]=Wt[h]=Wt[y]=Wt[g]=Wt[m]=Wt[D]=Wt[_]=Wt[E]=!1;var Ut={};Ut[c]=Ut[l]=Ut[w]=Ut[F]=Ut[f]=Ut[s]=Ut[A]=Ut[j]=Ut[x]=Ut[O]=Ut[S]=Ut[h]=Ut[y]=Ut[g]=Ut[m]=Ut[D]=Ut[_]=Ut[b]=Ut[k]=Ut["[object Uint8ClampedArray]"]=Ut[C]=Ut[N]=!0,Ut[p]=Ut[v]=Ut[E]=!1;var zt={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},$t=parseFloat,qt=parseInt,Gt="object"==typeof t&&t&&t.Object===Object&&t,Vt="object"==typeof self&&self&&self.Object===Object&&self,Ht=Gt||Vt||Function("return this")(),Qt=e&&!e.nodeType&&e,Jt=Qt&&"object"==typeof r&&r&&!r.nodeType&&r,Zt=Jt&&Jt.exports===Qt,Kt=Zt&&Gt.process,Yt=function(){try{var t=Jt&&Jt.require&&Jt.require("util").types;return t||Kt&&Kt.binding&&Kt.binding("util")}catch(e){}}(),Xt=Yt&&Yt.isArrayBuffer,te=Yt&&Yt.isDate,ee=Yt&&Yt.isMap,ne=Yt&&Yt.isRegExp,re=Yt&&Yt.isSet,oe=Yt&&Yt.isTypedArray;function ie(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function ue(t,e,n,r){for(var o=-1,i=null==t?0:t.length;++o-1}function pe(t,e,n){for(var r=-1,o=null==t?0:t.length;++r-1;);return n}function Ie(t,e){for(var n=t.length;n--&&be(e,t[n],0)>-1;);return n}function Re(t,e){for(var n=t.length,r=0;n--;)t[n]===e&&++r;return r}var Be=je({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Le=je({"&":"&","<":"<",">":">",'"':""","'":"'"});function Te(t){return"\\"+zt[t]}function Me(t){return Bt.test(t)}function We(t){var e=-1,n=Array(t.size);return t.forEach((function(t,r){n[++e]=[r,t]})),n}function Ue(t,e){return function(n){return t(e(n))}}function ze(t,e){for(var n=-1,r=t.length,o=0,i=[];++n",""":'"',"'":"'"});var Qe=function t(e){var n,r=(e=null==e?Ht:Qe.defaults(Ht.Object(),e,Qe.pick(Ht,Tt))).Array,o=e.Date,pt=e.Error,vt=e.Function,dt=e.Math,ht=e.Object,yt=e.RegExp,gt=e.String,mt=e.TypeError,Dt=r.prototype,_t=vt.prototype,bt=ht.prototype,Et=e["__core-js_shared__"],wt=_t.toString,Ft=bt.hasOwnProperty,At=0,jt=(n=/[^.]+$/.exec(Et&&Et.keys&&Et.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",xt=bt.toString,Ot=wt.call(ht),St=Ht._,kt=yt("^"+wt.call(Ft).replace(V,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ct=Zt?e.Buffer:void 0,It=e.Symbol,Bt=e.Uint8Array,zt=Ct?Ct.allocUnsafe:void 0,Gt=Ue(ht.getPrototypeOf,ht),Vt=ht.create,Qt=bt.propertyIsEnumerable,Jt=Dt.splice,Kt=It?It.isConcatSpreadable:void 0,Yt=It?It.iterator:void 0,me=It?It.toStringTag:void 0,je=function(){try{var t=ti(ht,"defineProperty");return t({},"",{}),t}catch(e){}}(),Je=e.clearTimeout!==Ht.clearTimeout&&e.clearTimeout,Ze=o&&o.now!==Ht.Date.now&&o.now,Ke=e.setTimeout!==Ht.setTimeout&&e.setTimeout,Ye=dt.ceil,Xe=dt.floor,tn=ht.getOwnPropertySymbols,en=Ct?Ct.isBuffer:void 0,nn=e.isFinite,rn=Dt.join,on=Ue(ht.keys,ht),un=dt.max,an=dt.min,cn=o.now,ln=e.parseInt,fn=dt.random,sn=Dt.reverse,pn=ti(e,"DataView"),vn=ti(e,"Map"),dn=ti(e,"Promise"),hn=ti(e,"Set"),yn=ti(e,"WeakMap"),gn=ti(ht,"create"),mn=yn&&new yn,Dn={},_n=xi(pn),bn=xi(vn),En=xi(dn),wn=xi(hn),Fn=xi(yn),An=It?It.prototype:void 0,jn=An?An.valueOf:void 0,xn=An?An.toString:void 0;function On(t){if(qu(t)&&!Pu(t)&&!(t instanceof Nn)){if(t instanceof Cn)return t;if(Ft.call(t,"__wrapped__"))return Oi(t)}return new Cn(t)}var Sn=function(){function t(){}return function(e){if(!$u(e))return{};if(Vt)return Vt(e);t.prototype=e;var n=new t;return t.prototype=void 0,n}}();function kn(){}function Cn(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=void 0}function Nn(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Pn(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e=e?t:e)),t}function Zn(t,e,n,r,o,i){var u,a=1&e,l=2&e,p=4&e;if(n&&(u=o?n(t,r,o,i):n(t)),void 0!==u)return u;if(!$u(t))return t;var E=Pu(t);if(E){if(u=function(t){var e=t.length,n=new t.constructor(e);e&&"string"==typeof t[0]&&Ft.call(t,"index")&&(n.index=t.index,n.input=t.input);return n}(t),!a)return mo(t,u)}else{var P=ri(t),I=P==v||P==d;if(Lu(t))return so(t,a);if(P==g||P==c||I&&!o){if(u=l||I?{}:ii(t),!a)return l?function(t,e){return Do(t,ni(t),e)}(t,function(t,e){return t&&Do(e,ba(e),t)}(u,t)):function(t,e){return Do(t,ei(t),e)}(t,Vn(u,t))}else{if(!Ut[P])return o?t:{};u=function(t,e,n){var r=t.constructor;switch(e){case w:return po(t);case f:case s:return new r(+t);case F:return function(t,e){var n=e?po(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}(t,n);case A:case j:case x:case O:case S:case k:case"[object Uint8ClampedArray]":case C:case N:return vo(t,n);case h:return new r;case y:case _:return new r(t);case m:return function(t){var e=new t.constructor(t.source,rt.exec(t));return e.lastIndex=t.lastIndex,e}(t);case D:return new r;case b:return o=t,jn?ht(jn.call(o)):{}}var o}(t,P,a)}}i||(i=new Ln);var R=i.get(t);if(R)return R;i.set(t,u),Ju(t)?t.forEach((function(r){u.add(Zn(r,e,n,r,t,i))})):Gu(t)&&t.forEach((function(r,o){u.set(o,Zn(r,e,n,o,t,i))}));var B=E?void 0:(p?l?Ho:Vo:l?ba:_a)(t);return ae(B||t,(function(r,o){B&&(r=t[o=r]),$n(u,o,Zn(r,e,n,o,t,i))})),u}function Kn(t,e,n){var r=n.length;if(null==t)return!r;for(t=ht(t);r--;){var o=n[r],i=e[o],u=t[o];if(void 0===u&&!(o in t)||!i(u))return!1}return!0}function Yn(t,e,n){if("function"!=typeof t)throw new mt(i);return _i((function(){t.apply(void 0,n)}),e)}function Xn(t,e,n,r){var o=-1,i=se,u=!0,a=t.length,c=[],l=e.length;if(!a)return c;n&&(e=ve(e,ke(n))),r?(i=pe,u=!1):e.length>=200&&(i=Ne,u=!1,e=new Bn(e));t:for(;++o-1},In.prototype.set=function(t,e){var n=this.__data__,r=qn(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},Rn.prototype.clear=function(){this.size=0,this.__data__={hash:new Pn,map:new(vn||In),string:new Pn}},Rn.prototype.delete=function(t){var e=Yo(this,t).delete(t);return this.size-=e?1:0,e},Rn.prototype.get=function(t){return Yo(this,t).get(t)},Rn.prototype.has=function(t){return Yo(this,t).has(t)},Rn.prototype.set=function(t,e){var n=Yo(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},Bn.prototype.add=Bn.prototype.push=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this},Bn.prototype.has=function(t){return this.__data__.has(t)},Ln.prototype.clear=function(){this.__data__=new In,this.size=0},Ln.prototype.delete=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n},Ln.prototype.get=function(t){return this.__data__.get(t)},Ln.prototype.has=function(t){return this.__data__.has(t)},Ln.prototype.set=function(t,e){var n=this.__data__;if(n instanceof In){var r=n.__data__;if(!vn||r.length<199)return r.push([t,e]),this.size=++n.size,this;n=this.__data__=new Rn(r)}return n.set(t,e),this.size=n.size,this};var tr=Eo(cr),er=Eo(lr,!0);function nr(t,e){var n=!0;return tr(t,(function(t,r,o){return n=!!e(t,r,o)})),n}function rr(t,e,n){for(var r=-1,o=t.length;++r0&&n(a)?e>1?ir(a,e-1,n,r,o):de(o,a):r||(o[o.length]=a)}return o}var ur=wo(),ar=wo(!0);function cr(t,e){return t&&ur(t,e,_a)}function lr(t,e){return t&&ar(t,e,_a)}function fr(t,e){return fe(e,(function(e){return Wu(t[e])}))}function sr(t,e){for(var n=0,r=(e=ao(e,t)).length;null!=t&&ne}function hr(t,e){return null!=t&&Ft.call(t,e)}function yr(t,e){return null!=t&&e in ht(t)}function gr(t,e,n){for(var o=n?pe:se,i=t[0].length,u=t.length,a=u,c=r(u),l=1/0,f=[];a--;){var s=t[a];a&&e&&(s=ve(s,ke(e))),l=an(s.length,l),c[a]=!n&&(e||i>=120&&s.length>=120)?new Bn(a&&s):void 0}s=t[0];var p=-1,v=c[0];t:for(;++p=a)return c;var l=n[r];return c*("desc"==l?-1:1)}}return t.index-e.index}(t,e,n)}))}function Pr(t,e,n){for(var r=-1,o=e.length,i={};++r-1;)a!==t&&Jt.call(a,c,1),Jt.call(t,c,1);return t}function Rr(t,e){for(var n=t?e.length:0,r=n-1;n--;){var o=e[n];if(n==r||o!==i){var i=o;ai(o)?Jt.call(t,o,1):Xr(t,o)}}return t}function Br(t,e){return t+Xe(fn()*(e-t+1))}function Lr(t,e){var n="";if(!t||e<1||e>9007199254740991)return n;do{e%2&&(n+=t),(e=Xe(e/2))&&(t+=t)}while(e);return n}function Tr(t,e){return bi(hi(t,e,Va),t+"")}function Mr(t){return Mn(Sa(t))}function Wr(t,e){var n=Sa(t);return Fi(n,Jn(e,0,n.length))}function Ur(t,e,n,r){if(!$u(t))return t;for(var o=-1,i=(e=ao(e,t)).length,u=i-1,a=t;null!=a&&++oi?0:i+e),(n=n>i?i:n)<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var u=r(i);++o>>1,u=t[i];null!==u&&!Ku(u)&&(n?u<=e:u=200){var l=e?null:To(t);if(l)return $e(l);u=!1,o=Ne,c=new Bn}else c=e?[]:a;t:for(;++r=r?t:Gr(t,e,n)}var fo=Je||function(t){return Ht.clearTimeout(t)};function so(t,e){if(e)return t.slice();var n=t.length,r=zt?zt(n):new t.constructor(n);return t.copy(r),r}function po(t){var e=new t.constructor(t.byteLength);return new Bt(e).set(new Bt(t)),e}function vo(t,e){var n=e?po(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}function ho(t,e){if(t!==e){var n=void 0!==t,r=null===t,o=t==t,i=Ku(t),u=void 0!==e,a=null===e,c=e==e,l=Ku(e);if(!a&&!l&&!i&&t>e||i&&u&&c&&!a&&!l||r&&u&&c||!n&&c||!o)return 1;if(!r&&!i&&!l&&t1?n[o-1]:void 0,u=o>2?n[2]:void 0;for(i=t.length>3&&"function"==typeof i?(o--,i):void 0,u&&ci(n[0],n[1],u)&&(i=o<3?void 0:i,o=1),e=ht(e);++r-1?o[i?e[u]:u]:void 0}}function Oo(t){return Go((function(e){var n=e.length,r=n,o=Cn.prototype.thru;for(t&&e.reverse();r--;){var u=e[r];if("function"!=typeof u)throw new mt(i);if(o&&!a&&"wrapper"==Jo(u))var a=new Cn([],!0)}for(r=a?r:n;++r1&&D.reverse(),s&&la))return!1;var l=i.get(t);if(l&&i.get(e))return l==e;var f=-1,s=!0,p=2&n?new Bn:void 0;for(i.set(t,e),i.set(e,t);++f-1&&t%1==0&&t1?"& ":"")+e[r],e=e.join(n>2?", ":" "),t.replace(K,"{\n/* [wrapped with "+e+"] */\n")}(r,function(t,e){return ae(a,(function(n){var r="_."+n[0];e&n[1]&&!se(t,r)&&t.push(r)})),t.sort()}(function(t){var e=t.match(Y);return e?e[1].split(X):[]}(r),n)))}function wi(t){var e=0,n=0;return function(){var r=cn(),o=16-(r-n);if(n=r,o>0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}function Fi(t,e){var n=-1,r=t.length,o=r-1;for(e=void 0===e?r:e;++n1?t[e-1]:void 0;return n="function"==typeof n?(t.pop(),n):void 0,Qi(t,n)}));function eu(t){var e=On(t);return e.__chain__=!0,e}function nu(t,e){return e(t)}var ru=Go((function(t){var e=t.length,n=e?t[0]:0,r=this.__wrapped__,o=function(e){return Qn(e,t)};return!(e>1||this.__actions__.length)&&r instanceof Nn&&ai(n)?((r=r.slice(n,+n+(e?1:0))).__actions__.push({func:nu,args:[o],thisArg:void 0}),new Cn(r,this.__chain__).thru((function(t){return e&&!t.length&&t.push(void 0),t}))):this.thru(o)}));var ou=_o((function(t,e,n){Ft.call(t,n)?++t[n]:Hn(t,n,1)}));var iu=xo(Ni),uu=xo(Pi);function au(t,e){return(Pu(t)?ae:tr)(t,Ko(e,3))}function cu(t,e){return(Pu(t)?ce:er)(t,Ko(e,3))}var lu=_o((function(t,e,n){Ft.call(t,n)?t[n].push(e):Hn(t,n,[e])}));var fu=Tr((function(t,e,n){var o=-1,i="function"==typeof e,u=Ru(t)?r(t.length):[];return tr(t,(function(t){u[++o]=i?ie(e,t,n):mr(t,e,n)})),u})),su=_o((function(t,e,n){Hn(t,n,e)}));function pu(t,e){return(Pu(t)?ve:xr)(t,Ko(e,3))}var vu=_o((function(t,e,n){t[n?0:1].push(e)}),(function(){return[[],[]]}));var du=Tr((function(t,e){if(null==t)return[];var n=e.length;return n>1&&ci(t,e[0],e[1])?e=[]:n>2&&ci(e[0],e[1],e[2])&&(e=[e[0]]),Nr(t,ir(e,1),[])})),hu=Ze||function(){return Ht.Date.now()};function yu(t,e,n){return e=n?void 0:e,Wo(t,128,void 0,void 0,void 0,void 0,e=t&&null==e?t.length:e)}function gu(t,e){var n;if("function"!=typeof e)throw new mt(i);return t=ra(t),function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=void 0),n}}var mu=Tr((function(t,e,n){var r=1;if(n.length){var o=ze(n,Zo(mu));r|=32}return Wo(t,r,e,n,o)})),Du=Tr((function(t,e,n){var r=3;if(n.length){var o=ze(n,Zo(Du));r|=32}return Wo(e,r,t,n,o)}));function _u(t,e,n){var r,o,u,a,c,l,f=0,s=!1,p=!1,v=!0;if("function"!=typeof t)throw new mt(i);function d(e){var n=r,i=o;return r=o=void 0,f=e,a=t.apply(i,n)}function h(t){return f=t,c=_i(g,e),s?d(t):a}function y(t){var n=t-l;return void 0===l||n>=e||n<0||p&&t-f>=u}function g(){var t=hu();if(y(t))return m(t);c=_i(g,function(t){var n=e-(t-l);return p?an(n,u-(t-f)):n}(t))}function m(t){return c=void 0,v&&r?d(t):(r=o=void 0,a)}function D(){var t=hu(),n=y(t);if(r=arguments,o=this,l=t,n){if(void 0===c)return h(l);if(p)return fo(c),c=_i(g,e),d(l)}return void 0===c&&(c=_i(g,e)),a}return e=ia(e)||0,$u(n)&&(s=!!n.leading,u=(p="maxWait"in n)?un(ia(n.maxWait)||0,e):u,v="trailing"in n?!!n.trailing:v),D.cancel=function(){void 0!==c&&fo(c),f=0,r=l=o=c=void 0},D.flush=function(){return void 0===c?a:m(hu())},D}var bu=Tr((function(t,e){return Yn(t,1,e)})),Eu=Tr((function(t,e,n){return Yn(t,ia(e)||0,n)}));function wu(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new mt(i);var n=function(){var r=arguments,o=e?e.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var u=t.apply(this,r);return n.cache=i.set(o,u)||i,u};return n.cache=new(wu.Cache||Rn),n}function Fu(t){if("function"!=typeof t)throw new mt(i);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}wu.Cache=Rn;var Au=co((function(t,e){var n=(e=1==e.length&&Pu(e[0])?ve(e[0],ke(Ko())):ve(ir(e,1),ke(Ko()))).length;return Tr((function(r){for(var o=-1,i=an(r.length,n);++o=e})),Nu=Dr(function(){return arguments}())?Dr:function(t){return qu(t)&&Ft.call(t,"callee")&&!Qt.call(t,"callee")},Pu=r.isArray,Iu=Xt?ke(Xt):function(t){return qu(t)&&vr(t)==w};function Ru(t){return null!=t&&zu(t.length)&&!Wu(t)}function Bu(t){return qu(t)&&Ru(t)}var Lu=en||ic,Tu=te?ke(te):function(t){return qu(t)&&vr(t)==s};function Mu(t){if(!qu(t))return!1;var e=vr(t);return e==p||"[object DOMException]"==e||"string"==typeof t.message&&"string"==typeof t.name&&!Hu(t)}function Wu(t){if(!$u(t))return!1;var e=vr(t);return e==v||e==d||"[object AsyncFunction]"==e||"[object Proxy]"==e}function Uu(t){return"number"==typeof t&&t==ra(t)}function zu(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}function $u(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function qu(t){return null!=t&&"object"==typeof t}var Gu=ee?ke(ee):function(t){return qu(t)&&ri(t)==h};function Vu(t){return"number"==typeof t||qu(t)&&vr(t)==y}function Hu(t){if(!qu(t)||vr(t)!=g)return!1;var e=Gt(t);if(null===e)return!0;var n=Ft.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&wt.call(n)==Ot}var Qu=ne?ke(ne):function(t){return qu(t)&&vr(t)==m};var Ju=re?ke(re):function(t){return qu(t)&&ri(t)==D};function Zu(t){return"string"==typeof t||!Pu(t)&&qu(t)&&vr(t)==_}function Ku(t){return"symbol"==typeof t||qu(t)&&vr(t)==b}var Yu=oe?ke(oe):function(t){return qu(t)&&zu(t.length)&&!!Wt[vr(t)]};var Xu=Ro(jr),ta=Ro((function(t,e){return t<=e}));function ea(t){if(!t)return[];if(Ru(t))return Zu(t)?Ve(t):mo(t);if(Yt&&t[Yt])return function(t){for(var e,n=[];!(e=t.next()).done;)n.push(e.value);return n}(t[Yt]());var e=ri(t);return(e==h?We:e==D?$e:Sa)(t)}function na(t){return t?(t=ia(t))===1/0||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}function ra(t){var e=na(t),n=e%1;return e==e?n?e-n:e:0}function oa(t){return t?Jn(ra(t),0,4294967295):0}function ia(t){if("number"==typeof t)return t;if(Ku(t))return NaN;if($u(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=$u(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(Q,"");var n=it.test(t);return n||at.test(t)?qt(t.slice(2),n?2:8):ot.test(t)?NaN:+t}function ua(t){return Do(t,ba(t))}function aa(t){return null==t?"":Kr(t)}var ca=bo((function(t,e){if(pi(e)||Ru(e))Do(e,_a(e),t);else for(var n in e)Ft.call(e,n)&&$n(t,n,e[n])})),la=bo((function(t,e){Do(e,ba(e),t)})),fa=bo((function(t,e,n,r){Do(e,ba(e),t,r)})),sa=bo((function(t,e,n,r){Do(e,_a(e),t,r)})),pa=Go(Qn);var va=Tr((function(t,e){t=ht(t);var n=-1,r=e.length,o=r>2?e[2]:void 0;for(o&&ci(e[0],e[1],o)&&(r=1);++n1),e})),Do(t,Ho(t),n),r&&(n=Zn(n,7,$o));for(var o=e.length;o--;)Xr(n,e[o]);return n}));var Aa=Go((function(t,e){return null==t?{}:function(t,e){return Pr(t,e,(function(e,n){return ya(t,n)}))}(t,e)}));function ja(t,e){if(null==t)return{};var n=ve(Ho(t),(function(t){return[t]}));return e=Ko(e),Pr(t,n,(function(t,n){return e(t,n[0])}))}var xa=Mo(_a),Oa=Mo(ba);function Sa(t){return null==t?[]:Ce(t,_a(t))}var ka=Ao((function(t,e,n){return e=e.toLowerCase(),t+(n?Ca(e):e)}));function Ca(t){return Ma(aa(t).toLowerCase())}function Na(t){return(t=aa(t))&&t.replace(lt,Be).replace(Pt,"")}var Pa=Ao((function(t,e,n){return t+(n?"-":"")+e.toLowerCase()})),Ia=Ao((function(t,e,n){return t+(n?" ":"")+e.toLowerCase()})),Ra=Fo("toLowerCase");var Ba=Ao((function(t,e,n){return t+(n?"_":"")+e.toLowerCase()}));var La=Ao((function(t,e,n){return t+(n?" ":"")+Ma(e)}));var Ta=Ao((function(t,e,n){return t+(n?" ":"")+e.toUpperCase()})),Ma=Fo("toUpperCase");function Wa(t,e,n){return t=aa(t),void 0===(e=n?void 0:e)?function(t){return Lt.test(t)}(t)?function(t){return t.match(Rt)||[]}(t):function(t){return t.match(tt)||[]}(t):t.match(e)||[]}var Ua=Tr((function(t,e){try{return ie(t,void 0,e)}catch(n){return Mu(n)?n:new pt(n)}})),za=Go((function(t,e){return ae(e,(function(e){e=ji(e),Hn(t,e,mu(t[e],t))})),t}));function $a(t){return function(){return t}}var qa=Oo(),Ga=Oo(!0);function Va(t){return t}function Ha(t){return wr("function"==typeof t?t:Zn(t,1))}var Qa=Tr((function(t,e){return function(n){return mr(n,t,e)}})),Ja=Tr((function(t,e){return function(n){return mr(t,n,e)}}));function Za(t,e,n){var r=_a(e),o=fr(e,r);null!=n||$u(e)&&(o.length||!r.length)||(n=e,e=t,t=this,o=fr(e,_a(e)));var i=!($u(n)&&"chain"in n&&!n.chain),u=Wu(t);return ae(o,(function(n){var r=e[n];t[n]=r,u&&(t.prototype[n]=function(){var e=this.__chain__;if(i||e){var n=t(this.__wrapped__),o=n.__actions__=mo(this.__actions__);return o.push({func:r,args:arguments,thisArg:t}),n.__chain__=e,n}return r.apply(t,de([this.value()],arguments))})})),t}function Ka(){}var Ya=No(ve),Xa=No(le),tc=No(ge);function ec(t){return li(t)?Ae(ji(t)):function(t){return function(e){return sr(e,t)}}(t)}var nc=Io(),rc=Io(!0);function oc(){return[]}function ic(){return!1}var uc=Co((function(t,e){return t+e}),0),ac=Lo("ceil"),cc=Co((function(t,e){return t/e}),1),lc=Lo("floor");var fc,sc=Co((function(t,e){return t*e}),1),pc=Lo("round"),vc=Co((function(t,e){return t-e}),0);return On.after=function(t,e){if("function"!=typeof e)throw new mt(i);return t=ra(t),function(){if(--t<1)return e.apply(this,arguments)}},On.ary=yu,On.assign=ca,On.assignIn=la,On.assignInWith=fa,On.assignWith=sa,On.at=pa,On.before=gu,On.bind=mu,On.bindAll=za,On.bindKey=Du,On.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return Pu(t)?t:[t]},On.chain=eu,On.chunk=function(t,e,n){e=(n?ci(t,e,n):void 0===e)?1:un(ra(e),0);var o=null==t?0:t.length;if(!o||e<1)return[];for(var i=0,u=0,a=r(Ye(o/e));io?0:o+n),(r=void 0===r||r>o?o:ra(r))<0&&(r+=o),r=n>r?0:oa(r);n>>0)?(t=aa(t))&&("string"==typeof e||null!=e&&!Qu(e))&&!(e=Kr(e))&&Me(t)?lo(Ve(t),0,n):t.split(e,n):[]},On.spread=function(t,e){if("function"!=typeof t)throw new mt(i);return e=null==e?0:un(ra(e),0),Tr((function(n){var r=n[e],o=lo(n,0,e);return r&&de(o,r),ie(t,this,o)}))},On.tail=function(t){var e=null==t?0:t.length;return e?Gr(t,1,e):[]},On.take=function(t,e,n){return t&&t.length?Gr(t,0,(e=n||void 0===e?1:ra(e))<0?0:e):[]},On.takeRight=function(t,e,n){var r=null==t?0:t.length;return r?Gr(t,(e=r-(e=n||void 0===e?1:ra(e)))<0?0:e,r):[]},On.takeRightWhile=function(t,e){return t&&t.length?eo(t,Ko(e,3),!1,!0):[]},On.takeWhile=function(t,e){return t&&t.length?eo(t,Ko(e,3)):[]},On.tap=function(t,e){return e(t),t},On.throttle=function(t,e,n){var r=!0,o=!0;if("function"!=typeof t)throw new mt(i);return $u(n)&&(r="leading"in n?!!n.leading:r,o="trailing"in n?!!n.trailing:o),_u(t,e,{leading:r,maxWait:e,trailing:o})},On.thru=nu,On.toArray=ea,On.toPairs=xa,On.toPairsIn=Oa,On.toPath=function(t){return Pu(t)?ve(t,ji):Ku(t)?[t]:mo(Ai(aa(t)))},On.toPlainObject=ua,On.transform=function(t,e,n){var r=Pu(t),o=r||Lu(t)||Yu(t);if(e=Ko(e,4),null==n){var i=t&&t.constructor;n=o?r?new i:[]:$u(t)&&Wu(i)?Sn(Gt(t)):{}}return(o?ae:cr)(t,(function(t,r,o){return e(n,t,r,o)})),n},On.unary=function(t){return yu(t,1)},On.union=qi,On.unionBy=Gi,On.unionWith=Vi,On.uniq=function(t){return t&&t.length?Yr(t):[]},On.uniqBy=function(t,e){return t&&t.length?Yr(t,Ko(e,2)):[]},On.uniqWith=function(t,e){return e="function"==typeof e?e:void 0,t&&t.length?Yr(t,void 0,e):[]},On.unset=function(t,e){return null==t||Xr(t,e)},On.unzip=Hi,On.unzipWith=Qi,On.update=function(t,e,n){return null==t?t:to(t,e,uo(n))},On.updateWith=function(t,e,n,r){return r="function"==typeof r?r:void 0,null==t?t:to(t,e,uo(n),r)},On.values=Sa,On.valuesIn=function(t){return null==t?[]:Ce(t,ba(t))},On.without=Ji,On.words=Wa,On.wrap=function(t,e){return ju(uo(e),t)},On.xor=Zi,On.xorBy=Ki,On.xorWith=Yi,On.zip=Xi,On.zipObject=function(t,e){return oo(t||[],e||[],$n)},On.zipObjectDeep=function(t,e){return oo(t||[],e||[],Ur)},On.zipWith=tu,On.entries=xa,On.entriesIn=Oa,On.extend=la,On.extendWith=fa,Za(On,On),On.add=uc,On.attempt=Ua,On.camelCase=ka,On.capitalize=Ca,On.ceil=ac,On.clamp=function(t,e,n){return void 0===n&&(n=e,e=void 0),void 0!==n&&(n=(n=ia(n))==n?n:0),void 0!==e&&(e=(e=ia(e))==e?e:0),Jn(ia(t),e,n)},On.clone=function(t){return Zn(t,4)},On.cloneDeep=function(t){return Zn(t,5)},On.cloneDeepWith=function(t,e){return Zn(t,5,e="function"==typeof e?e:void 0)},On.cloneWith=function(t,e){return Zn(t,4,e="function"==typeof e?e:void 0)},On.conformsTo=function(t,e){return null==e||Kn(t,e,_a(e))},On.deburr=Na,On.defaultTo=function(t,e){return null==t||t!=t?e:t},On.divide=cc,On.endsWith=function(t,e,n){t=aa(t),e=Kr(e);var r=t.length,o=n=void 0===n?r:Jn(ra(n),0,r);return(n-=e.length)>=0&&t.slice(n,o)==e},On.eq=Su,On.escape=function(t){return(t=aa(t))&&M.test(t)?t.replace(L,Le):t},On.escapeRegExp=function(t){return(t=aa(t))&&H.test(t)?t.replace(V,"\\$&"):t},On.every=function(t,e,n){var r=Pu(t)?le:nr;return n&&ci(t,e,n)&&(e=void 0),r(t,Ko(e,3))},On.find=iu,On.findIndex=Ni,On.findKey=function(t,e){return De(t,Ko(e,3),cr)},On.findLast=uu,On.findLastIndex=Pi,On.findLastKey=function(t,e){return De(t,Ko(e,3),lr)},On.floor=lc,On.forEach=au,On.forEachRight=cu,On.forIn=function(t,e){return null==t?t:ur(t,Ko(e,3),ba)},On.forInRight=function(t,e){return null==t?t:ar(t,Ko(e,3),ba)},On.forOwn=function(t,e){return t&&cr(t,Ko(e,3))},On.forOwnRight=function(t,e){return t&&lr(t,Ko(e,3))},On.get=ha,On.gt=ku,On.gte=Cu,On.has=function(t,e){return null!=t&&oi(t,e,hr)},On.hasIn=ya,On.head=Ri,On.identity=Va,On.includes=function(t,e,n,r){t=Ru(t)?t:Sa(t),n=n&&!r?ra(n):0;var o=t.length;return n<0&&(n=un(o+n,0)),Zu(t)?n<=o&&t.indexOf(e,n)>-1:!!o&&be(t,e,n)>-1},On.indexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var o=null==n?0:ra(n);return o<0&&(o=un(r+o,0)),be(t,e,o)},On.inRange=function(t,e,n){return e=na(e),void 0===n?(n=e,e=0):n=na(n),function(t,e,n){return t>=an(e,n)&&t=-9007199254740991&&t<=9007199254740991},On.isSet=Ju,On.isString=Zu,On.isSymbol=Ku,On.isTypedArray=Yu,On.isUndefined=function(t){return void 0===t},On.isWeakMap=function(t){return qu(t)&&ri(t)==E},On.isWeakSet=function(t){return qu(t)&&"[object WeakSet]"==vr(t)},On.join=function(t,e){return null==t?"":rn.call(t,e)},On.kebabCase=Pa,On.last=Mi,On.lastIndexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var o=r;return void 0!==n&&(o=(o=ra(n))<0?un(r+o,0):an(o,r-1)),e==e?function(t,e,n){for(var r=n+1;r--;)if(t[r]===e)return r;return r}(t,e,o):_e(t,we,o,!0)},On.lowerCase=Ia,On.lowerFirst=Ra,On.lt=Xu,On.lte=ta,On.max=function(t){return t&&t.length?rr(t,Va,dr):void 0},On.maxBy=function(t,e){return t&&t.length?rr(t,Ko(e,2),dr):void 0},On.mean=function(t){return Fe(t,Va)},On.meanBy=function(t,e){return Fe(t,Ko(e,2))},On.min=function(t){return t&&t.length?rr(t,Va,jr):void 0},On.minBy=function(t,e){return t&&t.length?rr(t,Ko(e,2),jr):void 0},On.stubArray=oc,On.stubFalse=ic,On.stubObject=function(){return{}},On.stubString=function(){return""},On.stubTrue=function(){return!0},On.multiply=sc,On.nth=function(t,e){return t&&t.length?Cr(t,ra(e)):void 0},On.noConflict=function(){return Ht._===this&&(Ht._=St),this},On.noop=Ka,On.now=hu,On.pad=function(t,e,n){t=aa(t);var r=(e=ra(e))?Ge(t):0;if(!e||r>=e)return t;var o=(e-r)/2;return Po(Xe(o),n)+t+Po(Ye(o),n)},On.padEnd=function(t,e,n){t=aa(t);var r=(e=ra(e))?Ge(t):0;return e&&re){var r=t;t=e,e=r}if(n||t%1||e%1){var o=fn();return an(t+o*(e-t+$t("1e-"+((o+"").length-1))),e)}return Br(t,e)},On.reduce=function(t,e,n){var r=Pu(t)?he:xe,o=arguments.length<3;return r(t,Ko(e,4),n,o,tr)},On.reduceRight=function(t,e,n){var r=Pu(t)?ye:xe,o=arguments.length<3;return r(t,Ko(e,4),n,o,er)},On.repeat=function(t,e,n){return e=(n?ci(t,e,n):void 0===e)?1:ra(e),Lr(aa(t),e)},On.replace=function(){var t=arguments,e=aa(t[0]);return t.length<3?e:e.replace(t[1],t[2])},On.result=function(t,e,n){var r=-1,o=(e=ao(e,t)).length;for(o||(o=1,t=void 0);++r9007199254740991)return[];var n=4294967295,r=an(t,4294967295);t-=4294967295;for(var o=Se(r,e=Ko(e));++n=i)return t;var a=n-Ge(r);if(a<1)return r;var c=u?lo(u,0,a).join(""):t.slice(0,a);if(void 0===o)return c+r;if(u&&(a+=c.length-a),Qu(o)){if(t.slice(a).search(o)){var l,f=c;for(o.global||(o=yt(o.source,aa(rt.exec(o))+"g")),o.lastIndex=0;l=o.exec(f);)var s=l.index;c=c.slice(0,void 0===s?a:s)}}else if(t.indexOf(Kr(o),a)!=a){var p=c.lastIndexOf(o);p>-1&&(c=c.slice(0,p))}return c+r},On.unescape=function(t){return(t=aa(t))&&T.test(t)?t.replace(B,He):t},On.uniqueId=function(t){var e=++At;return aa(t)+e},On.upperCase=Ta,On.upperFirst=Ma,On.each=au,On.eachRight=cu,On.first=Ri,Za(On,(fc={},cr(On,(function(t,e){Ft.call(On.prototype,e)||(fc[e]=t)})),fc),{chain:!1}),On.VERSION="4.17.15",ae(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(t){On[t].placeholder=On})),ae(["drop","take"],(function(t,e){Nn.prototype[t]=function(n){n=void 0===n?1:un(ra(n),0);var r=this.__filtered__&&!e?new Nn(this):this.clone();return r.__filtered__?r.__takeCount__=an(n,r.__takeCount__):r.__views__.push({size:an(n,4294967295),type:t+(r.__dir__<0?"Right":"")}),r},Nn.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}})),ae(["filter","map","takeWhile"],(function(t,e){var n=e+1,r=1==n||3==n;Nn.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:Ko(t,3),type:n}),e.__filtered__=e.__filtered__||r,e}})),ae(["head","last"],(function(t,e){var n="take"+(e?"Right":"");Nn.prototype[t]=function(){return this[n](1).value()[0]}})),ae(["initial","tail"],(function(t,e){var n="drop"+(e?"":"Right");Nn.prototype[t]=function(){return this.__filtered__?new Nn(this):this[n](1)}})),Nn.prototype.compact=function(){return this.filter(Va)},Nn.prototype.find=function(t){return this.filter(t).head()},Nn.prototype.findLast=function(t){return this.reverse().find(t)},Nn.prototype.invokeMap=Tr((function(t,e){return"function"==typeof t?new Nn(this):this.map((function(n){return mr(n,t,e)}))})),Nn.prototype.reject=function(t){return this.filter(Fu(Ko(t)))},Nn.prototype.slice=function(t,e){t=ra(t);var n=this;return n.__filtered__&&(t>0||e<0)?new Nn(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),void 0!==e&&(n=(e=ra(e))<0?n.dropRight(-e):n.take(e-t)),n)},Nn.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},Nn.prototype.toArray=function(){return this.take(4294967295)},cr(Nn.prototype,(function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),r=/^(?:head|last)$/.test(e),o=On[r?"take"+("last"==e?"Right":""):e],i=r||/^find/.test(e);o&&(On.prototype[e]=function(){var e=this.__wrapped__,u=r?[1]:arguments,a=e instanceof Nn,c=u[0],l=a||Pu(e),f=function(t){var e=o.apply(On,de([t],u));return r&&s?e[0]:e};l&&n&&"function"==typeof c&&1!=c.length&&(a=l=!1);var s=this.__chain__,p=!!this.__actions__.length,v=i&&!s,d=a&&!p;if(!i&&l){e=d?e:new Nn(this);var h=t.apply(e,u);return h.__actions__.push({func:nu,args:[f],thisArg:void 0}),new Cn(h,s)}return v&&d?t.apply(this,u):(h=this.thru(f),v?r?h.value()[0]:h.value():h)})})),ae(["pop","push","shift","sort","splice","unshift"],(function(t){var e=Dt[t],n=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",r=/^(?:pop|shift)$/.test(t);On.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var o=this.value();return e.apply(Pu(o)?o:[],t)}return this[n]((function(n){return e.apply(Pu(n)?n:[],t)}))}})),cr(Nn.prototype,(function(t,e){var n=On[e];if(n){var r=n.name+"";Ft.call(Dn,r)||(Dn[r]=[]),Dn[r].push({name:e,func:n})}})),Dn[So(void 0,2).name]=[{name:"wrapper",func:void 0}],Nn.prototype.clone=function(){var t=new Nn(this.__wrapped__);return t.__actions__=mo(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=mo(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=mo(this.__views__),t},Nn.prototype.reverse=function(){if(this.__filtered__){var t=new Nn(this);t.__dir__=-1,t.__filtered__=!0}else(t=this.clone()).__dir__*=-1;return t},Nn.prototype.value=function(){var t=this.__wrapped__.value(),e=this.__dir__,n=Pu(t),r=e<0,o=n?t.length:0,i=function(t,e,n){var r=-1,o=n.length;for(;++r=this.__values__.length;return{done:t,value:t?void 0:this.__values__[this.__index__++]}},On.prototype.plant=function(t){for(var e,n=this;n instanceof kn;){var r=Oi(n);r.__index__=0,r.__values__=void 0,e?o.__wrapped__=r:e=r;var o=r;n=n.__wrapped__}return o.__wrapped__=t,e},On.prototype.reverse=function(){var t=this.__wrapped__;if(t instanceof Nn){var e=t;return this.__actions__.length&&(e=new Nn(this)),(e=e.reverse()).__actions__.push({func:nu,args:[$i],thisArg:void 0}),new Cn(e,this.__chain__)}return this.thru($i)},On.prototype.toJSON=On.prototype.valueOf=On.prototype.value=function(){return no(this.__wrapped__,this.__actions__)},On.prototype.first=On.prototype.head,Yt&&(On.prototype[Yt]=function(){return this}),On}();Ht._=Qe,void 0===(o=function(){return Qe}.call(e,n,e,r))||(r.exports=o)}).call(this)}).call(this,n(76),n(496)(t))},494:function(t,e,n){"use strict";var r=n(0),o=Object(r.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});e.a=o},495:function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));n(77),n(513),n(478),n(78);var r=n(515),o=n.n(r);function i(t,e){var n=new o.a;return t.map((function(t){var r=t;return"string"==typeof t&&(r={label:t,permalink:"/blog/tags/"+n.slug(t)}),function(t,e){var n=t.label.split(": ",2),r=n[0],o=n[1],i="primary";switch(e){case"blog":case"guides":i=function(t){switch(t){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(r)}return{category:r,count:t.count,label:t.label,permalink:t.permalink,style:i,value:o}}(r,e)}))}},496:function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},505:function(t,e,n){var r=n(30),o=n(54),i=n(27),u=n(26),a=n(506);t.exports=function(t,e){var n=1==t,c=2==t,l=3==t,f=4==t,s=6==t,p=5==t||s,v=e||a;return function(e,a,d){for(var h,y,g=i(e),m=o(g),D=r(a,d,3),_=u(m.length),b=0,E=n?v(e,_):c?v(e,0):void 0;_>b;b++)if((p||b in m)&&(y=D(h=m[b],b,g),t))if(n)E[b]=y;else if(y)switch(t){case 3:return!0;case 5:return h;case 6:return b;case 2:E.push(h)}else if(f)return!1;return s?-1:l||f?f:E}}},506:function(t,e,n){var r=n(507);t.exports=function(t,e){return new(r(t))(e)}},507:function(t,e,n){var r=n(13),o=n(508),i=n(2)("species");t.exports=function(t){var e;return o(t)&&("function"!=typeof(e=t.constructor)||e!==Array&&!o(e.prototype)||(e=void 0),r(e)&&null===(e=e[i])&&(e=void 0)),void 0===e?Array:e}},508:function(t,e,n){var r=n(23);t.exports=Array.isArray||function(t){return"Array"==r(t)}},509:function(t,e,n){"use strict";var r=SyntaxError,o=Function,i=TypeError,u=function(t){try{return o('"use strict"; return ('+t+").constructor;")()}catch(e){}},a=Object.getOwnPropertyDescriptor;if(a)try{a({},"")}catch(x){a=null}var c=function(){throw new i},l=a?function(){try{return c}catch(t){try{return a(arguments,"callee").get}catch(e){return c}}}():c,f=n(547)(),s=Object.getPrototypeOf||function(t){return t.__proto__},p={},v="undefined"==typeof Uint8Array?void 0:s(Uint8Array),d={"%AggregateError%":"undefined"==typeof AggregateError?void 0:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?void 0:ArrayBuffer,"%ArrayIteratorPrototype%":f?s([][Symbol.iterator]()):void 0,"%AsyncFromSyncIteratorPrototype%":void 0,"%AsyncFunction%":p,"%AsyncGenerator%":p,"%AsyncGeneratorFunction%":p,"%AsyncIteratorPrototype%":p,"%Atomics%":"undefined"==typeof Atomics?void 0:Atomics,"%BigInt%":"undefined"==typeof BigInt?void 0:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?void 0:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?void 0:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?void 0:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?void 0:FinalizationRegistry,"%Function%":o,"%GeneratorFunction%":p,"%Int8Array%":"undefined"==typeof Int8Array?void 0:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?void 0:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?void 0:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":f?s(s([][Symbol.iterator]())):void 0,"%JSON%":"object"==typeof JSON?JSON:void 0,"%Map%":"undefined"==typeof Map?void 0:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&f?s((new Map)[Symbol.iterator]()):void 0,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?void 0:Promise,"%Proxy%":"undefined"==typeof Proxy?void 0:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?void 0:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?void 0:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&f?s((new Set)[Symbol.iterator]()):void 0,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?void 0:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":f?s(""[Symbol.iterator]()):void 0,"%Symbol%":f?Symbol:void 0,"%SyntaxError%":r,"%ThrowTypeError%":l,"%TypedArray%":v,"%TypeError%":i,"%Uint8Array%":"undefined"==typeof Uint8Array?void 0:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?void 0:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?void 0:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?void 0:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?void 0:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?void 0:WeakSet},h={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},y=n(510),g=n(550),m=y.call(Function.call,Array.prototype.concat),D=y.call(Function.apply,Array.prototype.splice),_=y.call(Function.call,String.prototype.replace),b=y.call(Function.call,String.prototype.slice),E=y.call(Function.call,RegExp.prototype.exec),w=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,F=/\\(\\)?/g,A=function(t){var e=b(t,0,1),n=b(t,-1);if("%"===e&&"%"!==n)throw new r("invalid intrinsic syntax, expected closing `%`");if("%"===n&&"%"!==e)throw new r("invalid intrinsic syntax, expected opening `%`");var o=[];return _(t,w,(function(t,e,n,r){o[o.length]=n?_(r,F,"$1"):e||t})),o},j=function(t,e){var n,o=t;if(g(h,o)&&(o="%"+(n=h[o])[0]+"%"),g(d,o)){var a=d[o];if(a===p&&(a=function t(e){var n;if("%AsyncFunction%"===e)n=u("async function () {}");else if("%GeneratorFunction%"===e)n=u("function* () {}");else if("%AsyncGeneratorFunction%"===e)n=u("async function* () {}");else if("%AsyncGenerator%"===e){var r=t("%AsyncGeneratorFunction%");r&&(n=r.prototype)}else if("%AsyncIteratorPrototype%"===e){var o=t("%AsyncGenerator%");o&&(n=s(o.prototype))}return d[e]=n,n}(o)),void 0===a&&!e)throw new i("intrinsic "+t+" exists, but is not available. Please file an issue!");return{alias:n,name:o,value:a}}throw new r("intrinsic "+t+" does not exist!")};t.exports=function(t,e){if("string"!=typeof t||0===t.length)throw new i("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof e)throw new i('"allowMissing" argument must be a boolean');if(null===E(/^%?[^%]*%?$/,t))throw new r("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var n=A(t),o=n.length>0?n[0]:"",u=j("%"+o+"%",e),c=u.name,l=u.value,f=!1,s=u.alias;s&&(o=s[0],D(n,m([0,1],s)));for(var p=1,v=!0;p=n.length){var w=a(l,h);l=(v=!!w)&&"get"in w&&!("originalValue"in w.get)?w.get:l[h]}else v=g(l,h),l=l[h];v&&!f&&(d[c]=l)}}return l}},510:function(t,e,n){"use strict";var r=n(549);t.exports=Function.prototype.bind||r},511:function(t,e,n){"use strict";var r=String.prototype.replace,o=/%20/g,i="RFC1738",u="RFC3986";t.exports={default:u,formatters:{RFC1738:function(t){return r.call(t,o,"+")},RFC3986:function(t){return String(t)}},RFC1738:i,RFC3986:u}},514:function(t,e,n){"use strict";var r=n(0),o=n.n(r),i=n(470),u=n(463),a=n.n(u);e.a=function(t){var e=t.count,n=t.label,r=t.permalink,u=t.style,c=t.value,l=t.valueOnly;return o.a.createElement(i.a,{to:r+"/",className:a()("badge","badge--rounded","badge--"+u)},l?c:n,e&&o.a.createElement(o.a.Fragment,null," (",e,")"))}},515:function(t,e,n){var r=n(516);t.exports=a;var o=Object.hasOwnProperty,i=/\s/g,u=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function a(){if(!(this instanceof a))return new a;this.reset()}function c(t,e){return"string"!=typeof t?"":(e||(t=t.toLowerCase()),t.trim().replace(u,"").replace(r(),"").replace(i,"-"))}a.prototype.slug=function(t,e){for(var n=c(t,!0===e),r=n;o.call(this.occurrences,n);)this.occurrences[r]++,n=r+"-"+this.occurrences[r];return this.occurrences[n]=0,n},a.prototype.reset=function(){this.occurrences=Object.create(null)},a.slug=c},516:function(t,e){t.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},518:function(t,e,n){"use strict";var r=n(511),o=Object.prototype.hasOwnProperty,i=Array.isArray,u=function(){for(var t=[],e=0;e<256;++e)t.push("%"+((e<16?"0":"")+e.toString(16)).toUpperCase());return t}(),a=function(t,e){for(var n=e&&e.plainObjects?Object.create(null):{},r=0;r1;){var e=t.pop(),n=e.obj[e.prop];if(i(n)){for(var r=[],o=0;o=48&&f<=57||f>=65&&f<=90||f>=97&&f<=122||i===r.RFC1738&&(40===f||41===f)?c+=a.charAt(l):f<128?c+=u[f]:f<2048?c+=u[192|f>>6]+u[128|63&f]:f<55296||f>=57344?c+=u[224|f>>12]+u[128|f>>6&63]+u[128|63&f]:(l+=1,f=65536+((1023&f)<<10|1023&a.charCodeAt(l)),c+=u[240|f>>18]+u[128|f>>12&63]+u[128|f>>6&63]+u[128|63&f])}return c},isBuffer:function(t){return!(!t||"object"!=typeof t)&&!!(t.constructor&&t.constructor.isBuffer&&t.constructor.isBuffer(t))},isRegExp:function(t){return"[object RegExp]"===Object.prototype.toString.call(t)},maybeMap:function(t,e){if(i(t)){for(var n=[],r=0;r0?A.join(",")||null:void 0}];else if(c(v))I=v;else{var B=Object.keys(A);I=y?B.sort(y):B}for(var L=u&&c(A)&&1===A.length?n+"[]":n,T=0;T0?b+_:""}},546:function(t,e,n){"use strict";var r=n(509),o=n(551),i=n(553),u=r("%TypeError%"),a=r("%WeakMap%",!0),c=r("%Map%",!0),l=o("WeakMap.prototype.get",!0),f=o("WeakMap.prototype.set",!0),s=o("WeakMap.prototype.has",!0),p=o("Map.prototype.get",!0),v=o("Map.prototype.set",!0),d=o("Map.prototype.has",!0),h=function(t,e){for(var n,r=t;null!==(n=r.next);r=n)if(n.key===e)return r.next=n.next,n.next=t.next,t.next=n,n};t.exports=function(){var t,e,n,r={assert:function(t){if(!r.has(t))throw new u("Side channel does not contain "+i(t))},get:function(r){if(a&&r&&("object"==typeof r||"function"==typeof r)){if(t)return l(t,r)}else if(c){if(e)return p(e,r)}else if(n)return function(t,e){var n=h(t,e);return n&&n.value}(n,r)},has:function(r){if(a&&r&&("object"==typeof r||"function"==typeof r)){if(t)return s(t,r)}else if(c){if(e)return d(e,r)}else if(n)return function(t,e){return!!h(t,e)}(n,r);return!1},set:function(r,o){a&&r&&("object"==typeof r||"function"==typeof r)?(t||(t=new a),f(t,r,o)):c?(e||(e=new c),v(e,r,o)):(n||(n={key:{},next:null}),function(t,e,n){var r=h(t,e);r?r.value=n:t.next={key:e,next:t.next,value:n}}(n,r,o))}};return r}},547:function(t,e,n){"use strict";var r="undefined"!=typeof Symbol&&Symbol,o=n(548);t.exports=function(){return"function"==typeof r&&("function"==typeof Symbol&&("symbol"==typeof r("foo")&&("symbol"==typeof Symbol("bar")&&o())))}},548:function(t,e,n){"use strict";t.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var t={},e=Symbol("test"),n=Object(e);if("string"==typeof e)return!1;if("[object Symbol]"!==Object.prototype.toString.call(e))return!1;if("[object Symbol]"!==Object.prototype.toString.call(n))return!1;for(e in t[e]=42,t)return!1;if("function"==typeof Object.keys&&0!==Object.keys(t).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(t).length)return!1;var r=Object.getOwnPropertySymbols(t);if(1!==r.length||r[0]!==e)return!1;if(!Object.prototype.propertyIsEnumerable.call(t,e))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var o=Object.getOwnPropertyDescriptor(t,e);if(42!==o.value||!0!==o.enumerable)return!1}return!0}},549:function(t,e,n){"use strict";var r="Function.prototype.bind called on incompatible ",o=Array.prototype.slice,i=Object.prototype.toString;t.exports=function(t){var e=this;if("function"!=typeof e||"[object Function]"!==i.call(e))throw new TypeError(r+e);for(var n,u=o.call(arguments,1),a=function(){if(this instanceof n){var r=e.apply(this,u.concat(o.call(arguments)));return Object(r)===r?r:this}return e.apply(t,u.concat(o.call(arguments)))},c=Math.max(0,e.length-u.length),l=[],f=0;f-1?o(n):n}},552:function(t,e,n){"use strict";var r=n(510),o=n(509),i=o("%Function.prototype.apply%"),u=o("%Function.prototype.call%"),a=o("%Reflect.apply%",!0)||r.call(u,i),c=o("%Object.getOwnPropertyDescriptor%",!0),l=o("%Object.defineProperty%",!0),f=o("%Math.max%");if(l)try{l({},"a",{value:1})}catch(p){l=null}t.exports=function(t){var e=a(r,u,arguments);if(c&&l){var n=c(e,"length");n.configurable&&l(e,"length",{value:1+f(0,t.length-(arguments.length-1))})}return e};var s=function(){return a(r,i,arguments)};l?l(t.exports,"apply",{value:s}):t.exports.apply=s},553:function(t,e,n){var r="function"==typeof Map&&Map.prototype,o=Object.getOwnPropertyDescriptor&&r?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,i=r&&o&&"function"==typeof o.get?o.get:null,u=r&&Map.prototype.forEach,a="function"==typeof Set&&Set.prototype,c=Object.getOwnPropertyDescriptor&&a?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,l=a&&c&&"function"==typeof c.get?c.get:null,f=a&&Set.prototype.forEach,s="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,p="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,v="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,d=Boolean.prototype.valueOf,h=Object.prototype.toString,y=Function.prototype.toString,g=String.prototype.match,m=String.prototype.slice,D=String.prototype.replace,_=String.prototype.toUpperCase,b=String.prototype.toLowerCase,E=RegExp.prototype.test,w=Array.prototype.concat,F=Array.prototype.join,A=Array.prototype.slice,j=Math.floor,x="function"==typeof BigInt?BigInt.prototype.valueOf:null,O=Object.getOwnPropertySymbols,S="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,k="function"==typeof Symbol&&"object"==typeof Symbol.iterator,C="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===k||"symbol")?Symbol.toStringTag:null,N=Object.prototype.propertyIsEnumerable,P=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(t){return t.__proto__}:null);function I(t,e){if(t===1/0||t===-1/0||t!=t||t&&t>-1e3&&t<1e3||E.call(/e/,e))return e;var n=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof t){var r=t<0?-j(-t):j(t);if(r!==t){var o=String(r),i=m.call(e,o.length+1);return D.call(o,n,"$&_")+"."+D.call(D.call(i,/([0-9]{3})/g,"$&_"),/_$/,"")}}return D.call(e,n,"$&_")}var R=n(554),B=R.custom,L=z(B)?B:null;function T(t,e,n){var r="double"===(n.quoteStyle||e)?'"':"'";return r+t+r}function M(t){return D.call(String(t),/"/g,""")}function W(t){return!("[object Array]"!==G(t)||C&&"object"==typeof t&&C in t)}function U(t){return!("[object RegExp]"!==G(t)||C&&"object"==typeof t&&C in t)}function z(t){if(k)return t&&"object"==typeof t&&t instanceof Symbol;if("symbol"==typeof t)return!0;if(!t||"object"!=typeof t||!S)return!1;try{return S.call(t),!0}catch(e){}return!1}t.exports=function t(e,n,r,o){var a=n||{};if(q(a,"quoteStyle")&&"single"!==a.quoteStyle&&"double"!==a.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(q(a,"maxStringLength")&&("number"==typeof a.maxStringLength?a.maxStringLength<0&&a.maxStringLength!==1/0:null!==a.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var c=!q(a,"customInspect")||a.customInspect;if("boolean"!=typeof c&&"symbol"!==c)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(q(a,"indent")&&null!==a.indent&&"\t"!==a.indent&&!(parseInt(a.indent,10)===a.indent&&a.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(q(a,"numericSeparator")&&"boolean"!=typeof a.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var h=a.numericSeparator;if(void 0===e)return"undefined";if(null===e)return"null";if("boolean"==typeof e)return e?"true":"false";if("string"==typeof e)return function t(e,n){if(e.length>n.maxStringLength){var r=e.length-n.maxStringLength,o="... "+r+" more character"+(r>1?"s":"");return t(m.call(e,0,n.maxStringLength),n)+o}return T(D.call(D.call(e,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,H),"single",n)}(e,a);if("number"==typeof e){if(0===e)return 1/0/e>0?"0":"-0";var _=String(e);return h?I(e,_):_}if("bigint"==typeof e){var E=String(e)+"n";return h?I(e,E):E}var j=void 0===a.depth?5:a.depth;if(void 0===r&&(r=0),r>=j&&j>0&&"object"==typeof e)return W(e)?"[Array]":"[Object]";var O=function(t,e){var n;if("\t"===t.indent)n="\t";else{if(!("number"==typeof t.indent&&t.indent>0))return null;n=F.call(Array(t.indent+1)," ")}return{base:n,prev:F.call(Array(e+1),n)}}(a,r);if(void 0===o)o=[];else if(V(o,e)>=0)return"[Circular]";function B(e,n,i){if(n&&(o=A.call(o)).push(n),i){var u={depth:a.depth};return q(a,"quoteStyle")&&(u.quoteStyle=a.quoteStyle),t(e,u,r+1,o)}return t(e,a,r+1,o)}if("function"==typeof e&&!U(e)){var $=function(t){if(t.name)return t.name;var e=g.call(y.call(t),/^function\s*([\w$]+)/);if(e)return e[1];return null}(e),X=Y(e,B);return"[Function"+($?": "+$:" (anonymous)")+"]"+(X.length>0?" { "+F.call(X,", ")+" }":"")}if(z(e)){var tt=k?D.call(String(e),/^(Symbol\(.*\))_[^)]*$/,"$1"):S.call(e);return"object"!=typeof e||k?tt:Q(tt)}if(function(t){if(!t||"object"!=typeof t)return!1;if("undefined"!=typeof HTMLElement&&t instanceof HTMLElement)return!0;return"string"==typeof t.nodeName&&"function"==typeof t.getAttribute}(e)){for(var et="<"+b.call(String(e.nodeName)),nt=e.attributes||[],rt=0;rt"}if(W(e)){if(0===e.length)return"[]";var ot=Y(e,B);return O&&!function(t){for(var e=0;e=0)return!1;return!0}(ot)?"["+K(ot,O)+"]":"[ "+F.call(ot,", ")+" ]"}if(function(t){return!("[object Error]"!==G(t)||C&&"object"==typeof t&&C in t)}(e)){var it=Y(e,B);return"cause"in Error.prototype||!("cause"in e)||N.call(e,"cause")?0===it.length?"["+String(e)+"]":"{ ["+String(e)+"] "+F.call(it,", ")+" }":"{ ["+String(e)+"] "+F.call(w.call("[cause]: "+B(e.cause),it),", ")+" }"}if("object"==typeof e&&c){if(L&&"function"==typeof e[L]&&R)return R(e,{depth:j-r});if("symbol"!==c&&"function"==typeof e.inspect)return e.inspect()}if(function(t){if(!i||!t||"object"!=typeof t)return!1;try{i.call(t);try{l.call(t)}catch(et){return!0}return t instanceof Map}catch(e){}return!1}(e)){var ut=[];return u.call(e,(function(t,n){ut.push(B(n,e,!0)+" => "+B(t,e))})),Z("Map",i.call(e),ut,O)}if(function(t){if(!l||!t||"object"!=typeof t)return!1;try{l.call(t);try{i.call(t)}catch(e){return!0}return t instanceof Set}catch(n){}return!1}(e)){var at=[];return f.call(e,(function(t){at.push(B(t,e))})),Z("Set",l.call(e),at,O)}if(function(t){if(!s||!t||"object"!=typeof t)return!1;try{s.call(t,s);try{p.call(t,p)}catch(et){return!0}return t instanceof WeakMap}catch(e){}return!1}(e))return J("WeakMap");if(function(t){if(!p||!t||"object"!=typeof t)return!1;try{p.call(t,p);try{s.call(t,s)}catch(et){return!0}return t instanceof WeakSet}catch(e){}return!1}(e))return J("WeakSet");if(function(t){if(!v||!t||"object"!=typeof t)return!1;try{return v.call(t),!0}catch(e){}return!1}(e))return J("WeakRef");if(function(t){return!("[object Number]"!==G(t)||C&&"object"==typeof t&&C in t)}(e))return Q(B(Number(e)));if(function(t){if(!t||"object"!=typeof t||!x)return!1;try{return x.call(t),!0}catch(e){}return!1}(e))return Q(B(x.call(e)));if(function(t){return!("[object Boolean]"!==G(t)||C&&"object"==typeof t&&C in t)}(e))return Q(d.call(e));if(function(t){return!("[object String]"!==G(t)||C&&"object"==typeof t&&C in t)}(e))return Q(B(String(e)));if(!function(t){return!("[object Date]"!==G(t)||C&&"object"==typeof t&&C in t)}(e)&&!U(e)){var ct=Y(e,B),lt=P?P(e)===Object.prototype:e instanceof Object||e.constructor===Object,ft=e instanceof Object?"":"null prototype",st=!lt&&C&&Object(e)===e&&C in e?m.call(G(e),8,-1):ft?"Object":"",pt=(lt||"function"!=typeof e.constructor?"":e.constructor.name?e.constructor.name+" ":"")+(st||ft?"["+F.call(w.call([],st||[],ft||[]),": ")+"] ":"");return 0===ct.length?pt+"{}":O?pt+"{"+K(ct,O)+"}":pt+"{ "+F.call(ct,", ")+" }"}return String(e)};var $=Object.prototype.hasOwnProperty||function(t){return t in this};function q(t,e){return $.call(t,e)}function G(t){return h.call(t)}function V(t,e){if(t.indexOf)return t.indexOf(e);for(var n=0,r=t.length;n-1?t.split(","):t},l=function(t,e,n,r){if(t){var i=n.allowDots?t.replace(/\.([^.[]+)/g,"[$1]"):t,u=/(\[[^[\]]*])/g,a=n.depth>0&&/(\[[^[\]]*])/.exec(i),l=a?i.slice(0,a.index):i,f=[];if(l){if(!n.plainObjects&&o.call(Object.prototype,l)&&!n.allowPrototypes)return;f.push(l)}for(var s=0;n.depth>0&&null!==(a=u.exec(i))&&s=0;--i){var u,a=t[i];if("[]"===a&&n.parseArrays)u=[].concat(o);else{u=n.plainObjects?Object.create(null):{};var l="["===a.charAt(0)&&"]"===a.charAt(a.length-1)?a.slice(1,-1):a,f=parseInt(l,10);n.parseArrays||""!==l?!isNaN(f)&&a!==l&&String(f)===l&&f>=0&&n.parseArrays&&f<=n.arrayLimit?(u=[])[f]=o:"__proto__"!==l&&(u[l]=o):u={0:o}}o=u}return o}(f,e,n,r)}};t.exports=function(t,e){var n=function(t){if(!t)return u;if(null!==t.decoder&&void 0!==t.decoder&&"function"!=typeof t.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==t.charset&&"utf-8"!==t.charset&&"iso-8859-1"!==t.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var e=void 0===t.charset?u.charset:t.charset;return{allowDots:void 0===t.allowDots?u.allowDots:!!t.allowDots,allowPrototypes:"boolean"==typeof t.allowPrototypes?t.allowPrototypes:u.allowPrototypes,allowSparse:"boolean"==typeof t.allowSparse?t.allowSparse:u.allowSparse,arrayLimit:"number"==typeof t.arrayLimit?t.arrayLimit:u.arrayLimit,charset:e,charsetSentinel:"boolean"==typeof t.charsetSentinel?t.charsetSentinel:u.charsetSentinel,comma:"boolean"==typeof t.comma?t.comma:u.comma,decoder:"function"==typeof t.decoder?t.decoder:u.decoder,delimiter:"string"==typeof t.delimiter||r.isRegExp(t.delimiter)?t.delimiter:u.delimiter,depth:"number"==typeof t.depth||!1===t.depth?+t.depth:u.depth,ignoreQueryPrefix:!0===t.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof t.interpretNumericEntities?t.interpretNumericEntities:u.interpretNumericEntities,parameterLimit:"number"==typeof t.parameterLimit?t.parameterLimit:u.parameterLimit,parseArrays:!1!==t.parseArrays,plainObjects:"boolean"==typeof t.plainObjects?t.plainObjects:u.plainObjects,strictNullHandling:"boolean"==typeof t.strictNullHandling?t.strictNullHandling:u.strictNullHandling}}(e);if(""===t||null==t)return n.plainObjects?Object.create(null):{};for(var f="string"==typeof t?function(t,e){var n,l={},f=e.ignoreQueryPrefix?t.replace(/^\?/,""):t,s=e.parameterLimit===1/0?void 0:e.parameterLimit,p=f.split(e.delimiter,s),v=-1,d=e.charset;if(e.charsetSentinel)for(n=0;n-1&&(y=i(y)?[y]:y),o.call(l,h)?l[h]=r.combine(l[h],y):l[h]=y}return l}(t,n):t,s=n.plainObjects?Object.create(null):{},p=Object.keys(f),v=0;v1?arguments[1]:void 0)}}),n(74)("find")},480:function(t,e,n){"use strict";var r=n(8),o=n(526),i=n(55);n(56)("search",1,(function(t,e,n,u){return[function(n){var r=t(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,r):new RegExp(n)[e](String(r))},function(t){var e=u(n,t,this);if(e.done)return e.value;var a=r(t),c=String(this),l=a.lastIndex;o(l,0)||(a.lastIndex=0);var f=i(a,c);return o(a.lastIndex,l)||(a.lastIndex=l),null===f?-1:f.index}]}))},487:function(t,e,n){"use strict";n(497);var r=n(0),o=n.n(r),i=n(498),u=n(486),a=n(1),c=(n(488),n(489),n(499),n(470)),l=n(500),f=n(484),s=n.n(f),p=n(501),v=n.n(p),d=n(476),h=n(463),y=n.n(h),g=n(135),m=n.n(g),D=function(){return o.a.createElement("span",{className:y()(m.a.toggle,m.a.moon)})},_=function(){return o.a.createElement("span",{className:y()(m.a.toggle,m.a.sun)})},b=function(t){var e=Object(d.a)().isClient;return o.a.createElement(v.a,Object(a.a)({disabled:!e,icons:{checked:o.a.createElement(D,null),unchecked:o.a.createElement(_,null)}},t))};function E(){var t=Object(d.a)().siteConfig,e=(void 0===t?{}:t).customFields.metadata.latest_post,n=Date.parse(e.date),r=new Date,o=Math.abs(r-n),i=Math.ceil(o/864e5),u=null;return"undefined"!=typeof window&&(u=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!u||u0&&o.a.createElement("div",{className:"row footer__links"},o.a.createElement("div",{className:"col col--5 footer__col"},o.a.createElement("div",{className:"margin-bottom--md"},o.a.createElement(s.a,{className:"navbar__logo",src:v,alt:"Qovery",width:"150",height:"auto"})),o.a.createElement("div",{className:"margin-bottom--md"},o.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),o.a.createElement("div",null,o.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},o.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",o.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},o.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",o.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},o.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),c.map((function(t,e){return o.a.createElement("div",{key:e,className:"col footer__col"},null!=t.title?o.a.createElement("h4",{className:"footer__title"},t.title):null,null!=t.items&&Array.isArray(t.items)&&t.items.length>0?o.a.createElement("ul",{className:"footer__items"},t.items.map((function(t,e){return t.html?o.a.createElement("li",{key:e,className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):o.a.createElement("li",{key:t.href||t.to,className:"footer__item"},o.a.createElement(B,t))}))):null)}))),(f||u)&&o.a.createElement("div",{className:"text--center"},f&&f.src&&o.a.createElement("div",{className:"margin-bottom--sm"},f.href?o.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:R.a.footerLogoLink},o.a.createElement(L,{alt:f.alt,url:p})):o.a.createElement(L,{alt:f.alt,url:p})),o.a.createElement("small",null,u),o.a.createElement("br",null))))},M=n(502),W=n(503),U=n(3);n(138);e.a=function(t){var e=Object(d.a)().siteConfig,n=void 0===e?{}:e,r=n.title,a=n.themeConfig.image,c=n.url,l=t.children,f=t.title,s=t.noFooter,p=t.description,v=t.image,h=t.keywords,y=t.version,g=f?f+" | "+r:r,m=v||a,D=c+Object(F.a)(m),_=Object(U.h)(),b=_?"https://docs.qovery.com"+(_.pathname.endsWith("/")?_.pathname:_.pathname+"/"):null;return o.a.createElement(W.a,null,o.a.createElement(M.a,null,o.a.createElement(u.a,null,o.a.createElement("html",{lang:"en"}),o.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),g&&o.a.createElement("title",null,g),g&&o.a.createElement("meta",{property:"og:title",content:g}),o.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),o.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),o.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),o.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),o.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),o.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),o.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),o.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),p&&o.a.createElement("meta",{name:"description",content:p}),p&&o.a.createElement("meta",{property:"og:description",content:p}),y&&o.a.createElement("meta",{name:"docsearch:version",content:y}),h&&h.length&&o.a.createElement("meta",{name:"keywords",content:h.join(",")}),m&&o.a.createElement("meta",{property:"og:image",content:D}),m&&o.a.createElement("meta",{property:"twitter:image",content:D}),m&&o.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+g}),b&&o.a.createElement("meta",{property:"og:url",content:b}),o.a.createElement("meta",{name:"twitter:card",content:"summary"}),b&&o.a.createElement("link",{rel:"canonical",href:b})),o.a.createElement(i.a,null),o.a.createElement(N,null),o.a.createElement("div",{className:"main-wrapper"},l),!s&&o.a.createElement(T,null)))}},490:function(t,e,n){"use strict";var r=n(9),o=n(0),i=n.n(o),u=n(463),a=n.n(u),c=n(476),l=(n(139),n(140)),f=n.n(l);e.a=function(t){return function(e){var n,o=e.id,u=Object(r.a)(e,["id"]),l=Object(c.a)().siteConfig,s=(l=void 0===l?{}:l).themeConfig,p=(s=void 0===s?{}:s).navbar,v=(p=void 0===p?{}:p).hideOnScroll,d=void 0!==v&&v;return o?i.a.createElement(t,u,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:a()("anchor",(n={},n[f.a.enhancedAnchor]=!d,n)),id:o}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+o,title:"Direct link to heading"},"#"),u.children):i.a.createElement(t,u)}}},491:function(t,e,n){(function(t,r){var o;(function(){var i="Expected a function",u="__lodash_placeholder__",a=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",f="[object Boolean]",s="[object Date]",p="[object Error]",v="[object Function]",d="[object GeneratorFunction]",h="[object Map]",y="[object Number]",g="[object Object]",m="[object RegExp]",D="[object Set]",_="[object String]",b="[object Symbol]",E="[object WeakMap]",w="[object ArrayBuffer]",F="[object DataView]",A="[object Float32Array]",j="[object Float64Array]",x="[object Int8Array]",O="[object Int16Array]",S="[object Int32Array]",k="[object Uint8Array]",C="[object Uint16Array]",N="[object Uint32Array]",P=/\b__p \+= '';/g,I=/\b(__p \+=) '' \+/g,R=/(__e\(.*?\)|\b__t\)) \+\n'';/g,B=/&(?:amp|lt|gt|quot|#39);/g,L=/[&<>"']/g,T=RegExp(B.source),M=RegExp(L.source),W=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,z=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,q=/^\w*$/,G=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,V=/[\\^$.*+?()[\]{}|]/g,H=RegExp(V.source),Q=/^\s+|\s+$/g,J=/^\s+/,Z=/\s+$/,K=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,tt=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,et=/\\(\\)?/g,nt=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,rt=/\w*$/,ot=/^[-+]0x[0-9a-f]+$/i,it=/^0b[01]+$/i,ut=/^\[object .+?Constructor\]$/,at=/^0o[0-7]+$/i,ct=/^(?:0|[1-9]\d*)$/,lt=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ft=/($^)/,st=/['\n\r\u2028\u2029\\]/g,pt="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",vt="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",dt="[\\ud800-\\udfff]",ht="["+vt+"]",yt="["+pt+"]",gt="\\d+",mt="[\\u2700-\\u27bf]",Dt="[a-z\\xdf-\\xf6\\xf8-\\xff]",_t="[^\\ud800-\\udfff"+vt+gt+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",bt="\\ud83c[\\udffb-\\udfff]",Et="[^\\ud800-\\udfff]",wt="(?:\\ud83c[\\udde6-\\uddff]){2}",Ft="[\\ud800-\\udbff][\\udc00-\\udfff]",At="[A-Z\\xc0-\\xd6\\xd8-\\xde]",jt="(?:"+Dt+"|"+_t+")",xt="(?:"+At+"|"+_t+")",Ot="(?:"+yt+"|"+bt+")"+"?",St="[\\ufe0e\\ufe0f]?"+Ot+("(?:\\u200d(?:"+[Et,wt,Ft].join("|")+")[\\ufe0e\\ufe0f]?"+Ot+")*"),kt="(?:"+[mt,wt,Ft].join("|")+")"+St,Ct="(?:"+[Et+yt+"?",yt,wt,Ft,dt].join("|")+")",Nt=RegExp("['\u2019]","g"),Pt=RegExp(yt,"g"),It=RegExp(bt+"(?="+bt+")|"+Ct+St,"g"),Rt=RegExp([At+"?"+Dt+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[ht,At,"$"].join("|")+")",xt+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[ht,At+jt,"$"].join("|")+")",At+"?"+jt+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",At+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",gt,kt].join("|"),"g"),Bt=RegExp("[\\u200d\\ud800-\\udfff"+pt+"\\ufe0e\\ufe0f]"),Lt=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Tt=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Mt=-1,Wt={};Wt[A]=Wt[j]=Wt[x]=Wt[O]=Wt[S]=Wt[k]=Wt["[object Uint8ClampedArray]"]=Wt[C]=Wt[N]=!0,Wt[c]=Wt[l]=Wt[w]=Wt[f]=Wt[F]=Wt[s]=Wt[p]=Wt[v]=Wt[h]=Wt[y]=Wt[g]=Wt[m]=Wt[D]=Wt[_]=Wt[E]=!1;var Ut={};Ut[c]=Ut[l]=Ut[w]=Ut[F]=Ut[f]=Ut[s]=Ut[A]=Ut[j]=Ut[x]=Ut[O]=Ut[S]=Ut[h]=Ut[y]=Ut[g]=Ut[m]=Ut[D]=Ut[_]=Ut[b]=Ut[k]=Ut["[object Uint8ClampedArray]"]=Ut[C]=Ut[N]=!0,Ut[p]=Ut[v]=Ut[E]=!1;var zt={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},$t=parseFloat,qt=parseInt,Gt="object"==typeof t&&t&&t.Object===Object&&t,Vt="object"==typeof self&&self&&self.Object===Object&&self,Ht=Gt||Vt||Function("return this")(),Qt=e&&!e.nodeType&&e,Jt=Qt&&"object"==typeof r&&r&&!r.nodeType&&r,Zt=Jt&&Jt.exports===Qt,Kt=Zt&&Gt.process,Yt=function(){try{var t=Jt&&Jt.require&&Jt.require("util").types;return t||Kt&&Kt.binding&&Kt.binding("util")}catch(e){}}(),Xt=Yt&&Yt.isArrayBuffer,te=Yt&&Yt.isDate,ee=Yt&&Yt.isMap,ne=Yt&&Yt.isRegExp,re=Yt&&Yt.isSet,oe=Yt&&Yt.isTypedArray;function ie(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function ue(t,e,n,r){for(var o=-1,i=null==t?0:t.length;++o-1}function pe(t,e,n){for(var r=-1,o=null==t?0:t.length;++r-1;);return n}function Ie(t,e){for(var n=t.length;n--&&be(e,t[n],0)>-1;);return n}function Re(t,e){for(var n=t.length,r=0;n--;)t[n]===e&&++r;return r}var Be=je({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Le=je({"&":"&","<":"<",">":">",'"':""","'":"'"});function Te(t){return"\\"+zt[t]}function Me(t){return Bt.test(t)}function We(t){var e=-1,n=Array(t.size);return t.forEach((function(t,r){n[++e]=[r,t]})),n}function Ue(t,e){return function(n){return t(e(n))}}function ze(t,e){for(var n=-1,r=t.length,o=0,i=[];++n",""":'"',"'":"'"});var Qe=function t(e){var n,r=(e=null==e?Ht:Qe.defaults(Ht.Object(),e,Qe.pick(Ht,Tt))).Array,o=e.Date,pt=e.Error,vt=e.Function,dt=e.Math,ht=e.Object,yt=e.RegExp,gt=e.String,mt=e.TypeError,Dt=r.prototype,_t=vt.prototype,bt=ht.prototype,Et=e["__core-js_shared__"],wt=_t.toString,Ft=bt.hasOwnProperty,At=0,jt=(n=/[^.]+$/.exec(Et&&Et.keys&&Et.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",xt=bt.toString,Ot=wt.call(ht),St=Ht._,kt=yt("^"+wt.call(Ft).replace(V,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ct=Zt?e.Buffer:void 0,It=e.Symbol,Bt=e.Uint8Array,zt=Ct?Ct.allocUnsafe:void 0,Gt=Ue(ht.getPrototypeOf,ht),Vt=ht.create,Qt=bt.propertyIsEnumerable,Jt=Dt.splice,Kt=It?It.isConcatSpreadable:void 0,Yt=It?It.iterator:void 0,me=It?It.toStringTag:void 0,je=function(){try{var t=ti(ht,"defineProperty");return t({},"",{}),t}catch(e){}}(),Je=e.clearTimeout!==Ht.clearTimeout&&e.clearTimeout,Ze=o&&o.now!==Ht.Date.now&&o.now,Ke=e.setTimeout!==Ht.setTimeout&&e.setTimeout,Ye=dt.ceil,Xe=dt.floor,tn=ht.getOwnPropertySymbols,en=Ct?Ct.isBuffer:void 0,nn=e.isFinite,rn=Dt.join,on=Ue(ht.keys,ht),un=dt.max,an=dt.min,cn=o.now,ln=e.parseInt,fn=dt.random,sn=Dt.reverse,pn=ti(e,"DataView"),vn=ti(e,"Map"),dn=ti(e,"Promise"),hn=ti(e,"Set"),yn=ti(e,"WeakMap"),gn=ti(ht,"create"),mn=yn&&new yn,Dn={},_n=xi(pn),bn=xi(vn),En=xi(dn),wn=xi(hn),Fn=xi(yn),An=It?It.prototype:void 0,jn=An?An.valueOf:void 0,xn=An?An.toString:void 0;function On(t){if(qu(t)&&!Pu(t)&&!(t instanceof Nn)){if(t instanceof Cn)return t;if(Ft.call(t,"__wrapped__"))return Oi(t)}return new Cn(t)}var Sn=function(){function t(){}return function(e){if(!$u(e))return{};if(Vt)return Vt(e);t.prototype=e;var n=new t;return t.prototype=void 0,n}}();function kn(){}function Cn(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=void 0}function Nn(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Pn(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e=e?t:e)),t}function Zn(t,e,n,r,o,i){var u,a=1&e,l=2&e,p=4&e;if(n&&(u=o?n(t,r,o,i):n(t)),void 0!==u)return u;if(!$u(t))return t;var E=Pu(t);if(E){if(u=function(t){var e=t.length,n=new t.constructor(e);e&&"string"==typeof t[0]&&Ft.call(t,"index")&&(n.index=t.index,n.input=t.input);return n}(t),!a)return mo(t,u)}else{var P=ri(t),I=P==v||P==d;if(Lu(t))return so(t,a);if(P==g||P==c||I&&!o){if(u=l||I?{}:ii(t),!a)return l?function(t,e){return Do(t,ni(t),e)}(t,function(t,e){return t&&Do(e,ba(e),t)}(u,t)):function(t,e){return Do(t,ei(t),e)}(t,Vn(u,t))}else{if(!Ut[P])return o?t:{};u=function(t,e,n){var r=t.constructor;switch(e){case w:return po(t);case f:case s:return new r(+t);case F:return function(t,e){var n=e?po(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}(t,n);case A:case j:case x:case O:case S:case k:case"[object Uint8ClampedArray]":case C:case N:return vo(t,n);case h:return new r;case y:case _:return new r(t);case m:return function(t){var e=new t.constructor(t.source,rt.exec(t));return e.lastIndex=t.lastIndex,e}(t);case D:return new r;case b:return o=t,jn?ht(jn.call(o)):{}}var o}(t,P,a)}}i||(i=new Ln);var R=i.get(t);if(R)return R;i.set(t,u),Ju(t)?t.forEach((function(r){u.add(Zn(r,e,n,r,t,i))})):Gu(t)&&t.forEach((function(r,o){u.set(o,Zn(r,e,n,o,t,i))}));var B=E?void 0:(p?l?Ho:Vo:l?ba:_a)(t);return ae(B||t,(function(r,o){B&&(r=t[o=r]),$n(u,o,Zn(r,e,n,o,t,i))})),u}function Kn(t,e,n){var r=n.length;if(null==t)return!r;for(t=ht(t);r--;){var o=n[r],i=e[o],u=t[o];if(void 0===u&&!(o in t)||!i(u))return!1}return!0}function Yn(t,e,n){if("function"!=typeof t)throw new mt(i);return _i((function(){t.apply(void 0,n)}),e)}function Xn(t,e,n,r){var o=-1,i=se,u=!0,a=t.length,c=[],l=e.length;if(!a)return c;n&&(e=ve(e,ke(n))),r?(i=pe,u=!1):e.length>=200&&(i=Ne,u=!1,e=new Bn(e));t:for(;++o-1},In.prototype.set=function(t,e){var n=this.__data__,r=qn(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},Rn.prototype.clear=function(){this.size=0,this.__data__={hash:new Pn,map:new(vn||In),string:new Pn}},Rn.prototype.delete=function(t){var e=Yo(this,t).delete(t);return this.size-=e?1:0,e},Rn.prototype.get=function(t){return Yo(this,t).get(t)},Rn.prototype.has=function(t){return Yo(this,t).has(t)},Rn.prototype.set=function(t,e){var n=Yo(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},Bn.prototype.add=Bn.prototype.push=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this},Bn.prototype.has=function(t){return this.__data__.has(t)},Ln.prototype.clear=function(){this.__data__=new In,this.size=0},Ln.prototype.delete=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n},Ln.prototype.get=function(t){return this.__data__.get(t)},Ln.prototype.has=function(t){return this.__data__.has(t)},Ln.prototype.set=function(t,e){var n=this.__data__;if(n instanceof In){var r=n.__data__;if(!vn||r.length<199)return r.push([t,e]),this.size=++n.size,this;n=this.__data__=new Rn(r)}return n.set(t,e),this.size=n.size,this};var tr=Eo(cr),er=Eo(lr,!0);function nr(t,e){var n=!0;return tr(t,(function(t,r,o){return n=!!e(t,r,o)})),n}function rr(t,e,n){for(var r=-1,o=t.length;++r0&&n(a)?e>1?ir(a,e-1,n,r,o):de(o,a):r||(o[o.length]=a)}return o}var ur=wo(),ar=wo(!0);function cr(t,e){return t&&ur(t,e,_a)}function lr(t,e){return t&&ar(t,e,_a)}function fr(t,e){return fe(e,(function(e){return Wu(t[e])}))}function sr(t,e){for(var n=0,r=(e=ao(e,t)).length;null!=t&&ne}function hr(t,e){return null!=t&&Ft.call(t,e)}function yr(t,e){return null!=t&&e in ht(t)}function gr(t,e,n){for(var o=n?pe:se,i=t[0].length,u=t.length,a=u,c=r(u),l=1/0,f=[];a--;){var s=t[a];a&&e&&(s=ve(s,ke(e))),l=an(s.length,l),c[a]=!n&&(e||i>=120&&s.length>=120)?new Bn(a&&s):void 0}s=t[0];var p=-1,v=c[0];t:for(;++p=a)return c;var l=n[r];return c*("desc"==l?-1:1)}}return t.index-e.index}(t,e,n)}))}function Pr(t,e,n){for(var r=-1,o=e.length,i={};++r-1;)a!==t&&Jt.call(a,c,1),Jt.call(t,c,1);return t}function Rr(t,e){for(var n=t?e.length:0,r=n-1;n--;){var o=e[n];if(n==r||o!==i){var i=o;ai(o)?Jt.call(t,o,1):Xr(t,o)}}return t}function Br(t,e){return t+Xe(fn()*(e-t+1))}function Lr(t,e){var n="";if(!t||e<1||e>9007199254740991)return n;do{e%2&&(n+=t),(e=Xe(e/2))&&(t+=t)}while(e);return n}function Tr(t,e){return bi(hi(t,e,Va),t+"")}function Mr(t){return Mn(Sa(t))}function Wr(t,e){var n=Sa(t);return Fi(n,Jn(e,0,n.length))}function Ur(t,e,n,r){if(!$u(t))return t;for(var o=-1,i=(e=ao(e,t)).length,u=i-1,a=t;null!=a&&++oi?0:i+e),(n=n>i?i:n)<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var u=r(i);++o>>1,u=t[i];null!==u&&!Ku(u)&&(n?u<=e:u=200){var l=e?null:To(t);if(l)return $e(l);u=!1,o=Ne,c=new Bn}else c=e?[]:a;t:for(;++r=r?t:Gr(t,e,n)}var fo=Je||function(t){return Ht.clearTimeout(t)};function so(t,e){if(e)return t.slice();var n=t.length,r=zt?zt(n):new t.constructor(n);return t.copy(r),r}function po(t){var e=new t.constructor(t.byteLength);return new Bt(e).set(new Bt(t)),e}function vo(t,e){var n=e?po(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}function ho(t,e){if(t!==e){var n=void 0!==t,r=null===t,o=t==t,i=Ku(t),u=void 0!==e,a=null===e,c=e==e,l=Ku(e);if(!a&&!l&&!i&&t>e||i&&u&&c&&!a&&!l||r&&u&&c||!n&&c||!o)return 1;if(!r&&!i&&!l&&t1?n[o-1]:void 0,u=o>2?n[2]:void 0;for(i=t.length>3&&"function"==typeof i?(o--,i):void 0,u&&ci(n[0],n[1],u)&&(i=o<3?void 0:i,o=1),e=ht(e);++r-1?o[i?e[u]:u]:void 0}}function Oo(t){return Go((function(e){var n=e.length,r=n,o=Cn.prototype.thru;for(t&&e.reverse();r--;){var u=e[r];if("function"!=typeof u)throw new mt(i);if(o&&!a&&"wrapper"==Jo(u))var a=new Cn([],!0)}for(r=a?r:n;++r1&&D.reverse(),s&&la))return!1;var l=i.get(t);if(l&&i.get(e))return l==e;var f=-1,s=!0,p=2&n?new Bn:void 0;for(i.set(t,e),i.set(e,t);++f-1&&t%1==0&&t1?"& ":"")+e[r],e=e.join(n>2?", ":" "),t.replace(K,"{\n/* [wrapped with "+e+"] */\n")}(r,function(t,e){return ae(a,(function(n){var r="_."+n[0];e&n[1]&&!se(t,r)&&t.push(r)})),t.sort()}(function(t){var e=t.match(Y);return e?e[1].split(X):[]}(r),n)))}function wi(t){var e=0,n=0;return function(){var r=cn(),o=16-(r-n);if(n=r,o>0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}function Fi(t,e){var n=-1,r=t.length,o=r-1;for(e=void 0===e?r:e;++n1?t[e-1]:void 0;return n="function"==typeof n?(t.pop(),n):void 0,Qi(t,n)}));function eu(t){var e=On(t);return e.__chain__=!0,e}function nu(t,e){return e(t)}var ru=Go((function(t){var e=t.length,n=e?t[0]:0,r=this.__wrapped__,o=function(e){return Qn(e,t)};return!(e>1||this.__actions__.length)&&r instanceof Nn&&ai(n)?((r=r.slice(n,+n+(e?1:0))).__actions__.push({func:nu,args:[o],thisArg:void 0}),new Cn(r,this.__chain__).thru((function(t){return e&&!t.length&&t.push(void 0),t}))):this.thru(o)}));var ou=_o((function(t,e,n){Ft.call(t,n)?++t[n]:Hn(t,n,1)}));var iu=xo(Ni),uu=xo(Pi);function au(t,e){return(Pu(t)?ae:tr)(t,Ko(e,3))}function cu(t,e){return(Pu(t)?ce:er)(t,Ko(e,3))}var lu=_o((function(t,e,n){Ft.call(t,n)?t[n].push(e):Hn(t,n,[e])}));var fu=Tr((function(t,e,n){var o=-1,i="function"==typeof e,u=Ru(t)?r(t.length):[];return tr(t,(function(t){u[++o]=i?ie(e,t,n):mr(t,e,n)})),u})),su=_o((function(t,e,n){Hn(t,n,e)}));function pu(t,e){return(Pu(t)?ve:xr)(t,Ko(e,3))}var vu=_o((function(t,e,n){t[n?0:1].push(e)}),(function(){return[[],[]]}));var du=Tr((function(t,e){if(null==t)return[];var n=e.length;return n>1&&ci(t,e[0],e[1])?e=[]:n>2&&ci(e[0],e[1],e[2])&&(e=[e[0]]),Nr(t,ir(e,1),[])})),hu=Ze||function(){return Ht.Date.now()};function yu(t,e,n){return e=n?void 0:e,Wo(t,128,void 0,void 0,void 0,void 0,e=t&&null==e?t.length:e)}function gu(t,e){var n;if("function"!=typeof e)throw new mt(i);return t=ra(t),function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=void 0),n}}var mu=Tr((function(t,e,n){var r=1;if(n.length){var o=ze(n,Zo(mu));r|=32}return Wo(t,r,e,n,o)})),Du=Tr((function(t,e,n){var r=3;if(n.length){var o=ze(n,Zo(Du));r|=32}return Wo(e,r,t,n,o)}));function _u(t,e,n){var r,o,u,a,c,l,f=0,s=!1,p=!1,v=!0;if("function"!=typeof t)throw new mt(i);function d(e){var n=r,i=o;return r=o=void 0,f=e,a=t.apply(i,n)}function h(t){return f=t,c=_i(g,e),s?d(t):a}function y(t){var n=t-l;return void 0===l||n>=e||n<0||p&&t-f>=u}function g(){var t=hu();if(y(t))return m(t);c=_i(g,function(t){var n=e-(t-l);return p?an(n,u-(t-f)):n}(t))}function m(t){return c=void 0,v&&r?d(t):(r=o=void 0,a)}function D(){var t=hu(),n=y(t);if(r=arguments,o=this,l=t,n){if(void 0===c)return h(l);if(p)return fo(c),c=_i(g,e),d(l)}return void 0===c&&(c=_i(g,e)),a}return e=ia(e)||0,$u(n)&&(s=!!n.leading,u=(p="maxWait"in n)?un(ia(n.maxWait)||0,e):u,v="trailing"in n?!!n.trailing:v),D.cancel=function(){void 0!==c&&fo(c),f=0,r=l=o=c=void 0},D.flush=function(){return void 0===c?a:m(hu())},D}var bu=Tr((function(t,e){return Yn(t,1,e)})),Eu=Tr((function(t,e,n){return Yn(t,ia(e)||0,n)}));function wu(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new mt(i);var n=function(){var r=arguments,o=e?e.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var u=t.apply(this,r);return n.cache=i.set(o,u)||i,u};return n.cache=new(wu.Cache||Rn),n}function Fu(t){if("function"!=typeof t)throw new mt(i);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}wu.Cache=Rn;var Au=co((function(t,e){var n=(e=1==e.length&&Pu(e[0])?ve(e[0],ke(Ko())):ve(ir(e,1),ke(Ko()))).length;return Tr((function(r){for(var o=-1,i=an(r.length,n);++o=e})),Nu=Dr(function(){return arguments}())?Dr:function(t){return qu(t)&&Ft.call(t,"callee")&&!Qt.call(t,"callee")},Pu=r.isArray,Iu=Xt?ke(Xt):function(t){return qu(t)&&vr(t)==w};function Ru(t){return null!=t&&zu(t.length)&&!Wu(t)}function Bu(t){return qu(t)&&Ru(t)}var Lu=en||ic,Tu=te?ke(te):function(t){return qu(t)&&vr(t)==s};function Mu(t){if(!qu(t))return!1;var e=vr(t);return e==p||"[object DOMException]"==e||"string"==typeof t.message&&"string"==typeof t.name&&!Hu(t)}function Wu(t){if(!$u(t))return!1;var e=vr(t);return e==v||e==d||"[object AsyncFunction]"==e||"[object Proxy]"==e}function Uu(t){return"number"==typeof t&&t==ra(t)}function zu(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}function $u(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function qu(t){return null!=t&&"object"==typeof t}var Gu=ee?ke(ee):function(t){return qu(t)&&ri(t)==h};function Vu(t){return"number"==typeof t||qu(t)&&vr(t)==y}function Hu(t){if(!qu(t)||vr(t)!=g)return!1;var e=Gt(t);if(null===e)return!0;var n=Ft.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&wt.call(n)==Ot}var Qu=ne?ke(ne):function(t){return qu(t)&&vr(t)==m};var Ju=re?ke(re):function(t){return qu(t)&&ri(t)==D};function Zu(t){return"string"==typeof t||!Pu(t)&&qu(t)&&vr(t)==_}function Ku(t){return"symbol"==typeof t||qu(t)&&vr(t)==b}var Yu=oe?ke(oe):function(t){return qu(t)&&zu(t.length)&&!!Wt[vr(t)]};var Xu=Ro(jr),ta=Ro((function(t,e){return t<=e}));function ea(t){if(!t)return[];if(Ru(t))return Zu(t)?Ve(t):mo(t);if(Yt&&t[Yt])return function(t){for(var e,n=[];!(e=t.next()).done;)n.push(e.value);return n}(t[Yt]());var e=ri(t);return(e==h?We:e==D?$e:Sa)(t)}function na(t){return t?(t=ia(t))===1/0||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}function ra(t){var e=na(t),n=e%1;return e==e?n?e-n:e:0}function oa(t){return t?Jn(ra(t),0,4294967295):0}function ia(t){if("number"==typeof t)return t;if(Ku(t))return NaN;if($u(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=$u(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(Q,"");var n=it.test(t);return n||at.test(t)?qt(t.slice(2),n?2:8):ot.test(t)?NaN:+t}function ua(t){return Do(t,ba(t))}function aa(t){return null==t?"":Kr(t)}var ca=bo((function(t,e){if(pi(e)||Ru(e))Do(e,_a(e),t);else for(var n in e)Ft.call(e,n)&&$n(t,n,e[n])})),la=bo((function(t,e){Do(e,ba(e),t)})),fa=bo((function(t,e,n,r){Do(e,ba(e),t,r)})),sa=bo((function(t,e,n,r){Do(e,_a(e),t,r)})),pa=Go(Qn);var va=Tr((function(t,e){t=ht(t);var n=-1,r=e.length,o=r>2?e[2]:void 0;for(o&&ci(e[0],e[1],o)&&(r=1);++n1),e})),Do(t,Ho(t),n),r&&(n=Zn(n,7,$o));for(var o=e.length;o--;)Xr(n,e[o]);return n}));var Aa=Go((function(t,e){return null==t?{}:function(t,e){return Pr(t,e,(function(e,n){return ya(t,n)}))}(t,e)}));function ja(t,e){if(null==t)return{};var n=ve(Ho(t),(function(t){return[t]}));return e=Ko(e),Pr(t,n,(function(t,n){return e(t,n[0])}))}var xa=Mo(_a),Oa=Mo(ba);function Sa(t){return null==t?[]:Ce(t,_a(t))}var ka=Ao((function(t,e,n){return e=e.toLowerCase(),t+(n?Ca(e):e)}));function Ca(t){return Ma(aa(t).toLowerCase())}function Na(t){return(t=aa(t))&&t.replace(lt,Be).replace(Pt,"")}var Pa=Ao((function(t,e,n){return t+(n?"-":"")+e.toLowerCase()})),Ia=Ao((function(t,e,n){return t+(n?" ":"")+e.toLowerCase()})),Ra=Fo("toLowerCase");var Ba=Ao((function(t,e,n){return t+(n?"_":"")+e.toLowerCase()}));var La=Ao((function(t,e,n){return t+(n?" ":"")+Ma(e)}));var Ta=Ao((function(t,e,n){return t+(n?" ":"")+e.toUpperCase()})),Ma=Fo("toUpperCase");function Wa(t,e,n){return t=aa(t),void 0===(e=n?void 0:e)?function(t){return Lt.test(t)}(t)?function(t){return t.match(Rt)||[]}(t):function(t){return t.match(tt)||[]}(t):t.match(e)||[]}var Ua=Tr((function(t,e){try{return ie(t,void 0,e)}catch(n){return Mu(n)?n:new pt(n)}})),za=Go((function(t,e){return ae(e,(function(e){e=ji(e),Hn(t,e,mu(t[e],t))})),t}));function $a(t){return function(){return t}}var qa=Oo(),Ga=Oo(!0);function Va(t){return t}function Ha(t){return wr("function"==typeof t?t:Zn(t,1))}var Qa=Tr((function(t,e){return function(n){return mr(n,t,e)}})),Ja=Tr((function(t,e){return function(n){return mr(t,n,e)}}));function Za(t,e,n){var r=_a(e),o=fr(e,r);null!=n||$u(e)&&(o.length||!r.length)||(n=e,e=t,t=this,o=fr(e,_a(e)));var i=!($u(n)&&"chain"in n&&!n.chain),u=Wu(t);return ae(o,(function(n){var r=e[n];t[n]=r,u&&(t.prototype[n]=function(){var e=this.__chain__;if(i||e){var n=t(this.__wrapped__),o=n.__actions__=mo(this.__actions__);return o.push({func:r,args:arguments,thisArg:t}),n.__chain__=e,n}return r.apply(t,de([this.value()],arguments))})})),t}function Ka(){}var Ya=No(ve),Xa=No(le),tc=No(ge);function ec(t){return li(t)?Ae(ji(t)):function(t){return function(e){return sr(e,t)}}(t)}var nc=Io(),rc=Io(!0);function oc(){return[]}function ic(){return!1}var uc=Co((function(t,e){return t+e}),0),ac=Lo("ceil"),cc=Co((function(t,e){return t/e}),1),lc=Lo("floor");var fc,sc=Co((function(t,e){return t*e}),1),pc=Lo("round"),vc=Co((function(t,e){return t-e}),0);return On.after=function(t,e){if("function"!=typeof e)throw new mt(i);return t=ra(t),function(){if(--t<1)return e.apply(this,arguments)}},On.ary=yu,On.assign=ca,On.assignIn=la,On.assignInWith=fa,On.assignWith=sa,On.at=pa,On.before=gu,On.bind=mu,On.bindAll=za,On.bindKey=Du,On.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return Pu(t)?t:[t]},On.chain=eu,On.chunk=function(t,e,n){e=(n?ci(t,e,n):void 0===e)?1:un(ra(e),0);var o=null==t?0:t.length;if(!o||e<1)return[];for(var i=0,u=0,a=r(Ye(o/e));io?0:o+n),(r=void 0===r||r>o?o:ra(r))<0&&(r+=o),r=n>r?0:oa(r);n>>0)?(t=aa(t))&&("string"==typeof e||null!=e&&!Qu(e))&&!(e=Kr(e))&&Me(t)?lo(Ve(t),0,n):t.split(e,n):[]},On.spread=function(t,e){if("function"!=typeof t)throw new mt(i);return e=null==e?0:un(ra(e),0),Tr((function(n){var r=n[e],o=lo(n,0,e);return r&&de(o,r),ie(t,this,o)}))},On.tail=function(t){var e=null==t?0:t.length;return e?Gr(t,1,e):[]},On.take=function(t,e,n){return t&&t.length?Gr(t,0,(e=n||void 0===e?1:ra(e))<0?0:e):[]},On.takeRight=function(t,e,n){var r=null==t?0:t.length;return r?Gr(t,(e=r-(e=n||void 0===e?1:ra(e)))<0?0:e,r):[]},On.takeRightWhile=function(t,e){return t&&t.length?eo(t,Ko(e,3),!1,!0):[]},On.takeWhile=function(t,e){return t&&t.length?eo(t,Ko(e,3)):[]},On.tap=function(t,e){return e(t),t},On.throttle=function(t,e,n){var r=!0,o=!0;if("function"!=typeof t)throw new mt(i);return $u(n)&&(r="leading"in n?!!n.leading:r,o="trailing"in n?!!n.trailing:o),_u(t,e,{leading:r,maxWait:e,trailing:o})},On.thru=nu,On.toArray=ea,On.toPairs=xa,On.toPairsIn=Oa,On.toPath=function(t){return Pu(t)?ve(t,ji):Ku(t)?[t]:mo(Ai(aa(t)))},On.toPlainObject=ua,On.transform=function(t,e,n){var r=Pu(t),o=r||Lu(t)||Yu(t);if(e=Ko(e,4),null==n){var i=t&&t.constructor;n=o?r?new i:[]:$u(t)&&Wu(i)?Sn(Gt(t)):{}}return(o?ae:cr)(t,(function(t,r,o){return e(n,t,r,o)})),n},On.unary=function(t){return yu(t,1)},On.union=qi,On.unionBy=Gi,On.unionWith=Vi,On.uniq=function(t){return t&&t.length?Yr(t):[]},On.uniqBy=function(t,e){return t&&t.length?Yr(t,Ko(e,2)):[]},On.uniqWith=function(t,e){return e="function"==typeof e?e:void 0,t&&t.length?Yr(t,void 0,e):[]},On.unset=function(t,e){return null==t||Xr(t,e)},On.unzip=Hi,On.unzipWith=Qi,On.update=function(t,e,n){return null==t?t:to(t,e,uo(n))},On.updateWith=function(t,e,n,r){return r="function"==typeof r?r:void 0,null==t?t:to(t,e,uo(n),r)},On.values=Sa,On.valuesIn=function(t){return null==t?[]:Ce(t,ba(t))},On.without=Ji,On.words=Wa,On.wrap=function(t,e){return ju(uo(e),t)},On.xor=Zi,On.xorBy=Ki,On.xorWith=Yi,On.zip=Xi,On.zipObject=function(t,e){return oo(t||[],e||[],$n)},On.zipObjectDeep=function(t,e){return oo(t||[],e||[],Ur)},On.zipWith=tu,On.entries=xa,On.entriesIn=Oa,On.extend=la,On.extendWith=fa,Za(On,On),On.add=uc,On.attempt=Ua,On.camelCase=ka,On.capitalize=Ca,On.ceil=ac,On.clamp=function(t,e,n){return void 0===n&&(n=e,e=void 0),void 0!==n&&(n=(n=ia(n))==n?n:0),void 0!==e&&(e=(e=ia(e))==e?e:0),Jn(ia(t),e,n)},On.clone=function(t){return Zn(t,4)},On.cloneDeep=function(t){return Zn(t,5)},On.cloneDeepWith=function(t,e){return Zn(t,5,e="function"==typeof e?e:void 0)},On.cloneWith=function(t,e){return Zn(t,4,e="function"==typeof e?e:void 0)},On.conformsTo=function(t,e){return null==e||Kn(t,e,_a(e))},On.deburr=Na,On.defaultTo=function(t,e){return null==t||t!=t?e:t},On.divide=cc,On.endsWith=function(t,e,n){t=aa(t),e=Kr(e);var r=t.length,o=n=void 0===n?r:Jn(ra(n),0,r);return(n-=e.length)>=0&&t.slice(n,o)==e},On.eq=Su,On.escape=function(t){return(t=aa(t))&&M.test(t)?t.replace(L,Le):t},On.escapeRegExp=function(t){return(t=aa(t))&&H.test(t)?t.replace(V,"\\$&"):t},On.every=function(t,e,n){var r=Pu(t)?le:nr;return n&&ci(t,e,n)&&(e=void 0),r(t,Ko(e,3))},On.find=iu,On.findIndex=Ni,On.findKey=function(t,e){return De(t,Ko(e,3),cr)},On.findLast=uu,On.findLastIndex=Pi,On.findLastKey=function(t,e){return De(t,Ko(e,3),lr)},On.floor=lc,On.forEach=au,On.forEachRight=cu,On.forIn=function(t,e){return null==t?t:ur(t,Ko(e,3),ba)},On.forInRight=function(t,e){return null==t?t:ar(t,Ko(e,3),ba)},On.forOwn=function(t,e){return t&&cr(t,Ko(e,3))},On.forOwnRight=function(t,e){return t&&lr(t,Ko(e,3))},On.get=ha,On.gt=ku,On.gte=Cu,On.has=function(t,e){return null!=t&&oi(t,e,hr)},On.hasIn=ya,On.head=Ri,On.identity=Va,On.includes=function(t,e,n,r){t=Ru(t)?t:Sa(t),n=n&&!r?ra(n):0;var o=t.length;return n<0&&(n=un(o+n,0)),Zu(t)?n<=o&&t.indexOf(e,n)>-1:!!o&&be(t,e,n)>-1},On.indexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var o=null==n?0:ra(n);return o<0&&(o=un(r+o,0)),be(t,e,o)},On.inRange=function(t,e,n){return e=na(e),void 0===n?(n=e,e=0):n=na(n),function(t,e,n){return t>=an(e,n)&&t=-9007199254740991&&t<=9007199254740991},On.isSet=Ju,On.isString=Zu,On.isSymbol=Ku,On.isTypedArray=Yu,On.isUndefined=function(t){return void 0===t},On.isWeakMap=function(t){return qu(t)&&ri(t)==E},On.isWeakSet=function(t){return qu(t)&&"[object WeakSet]"==vr(t)},On.join=function(t,e){return null==t?"":rn.call(t,e)},On.kebabCase=Pa,On.last=Mi,On.lastIndexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var o=r;return void 0!==n&&(o=(o=ra(n))<0?un(r+o,0):an(o,r-1)),e==e?function(t,e,n){for(var r=n+1;r--;)if(t[r]===e)return r;return r}(t,e,o):_e(t,we,o,!0)},On.lowerCase=Ia,On.lowerFirst=Ra,On.lt=Xu,On.lte=ta,On.max=function(t){return t&&t.length?rr(t,Va,dr):void 0},On.maxBy=function(t,e){return t&&t.length?rr(t,Ko(e,2),dr):void 0},On.mean=function(t){return Fe(t,Va)},On.meanBy=function(t,e){return Fe(t,Ko(e,2))},On.min=function(t){return t&&t.length?rr(t,Va,jr):void 0},On.minBy=function(t,e){return t&&t.length?rr(t,Ko(e,2),jr):void 0},On.stubArray=oc,On.stubFalse=ic,On.stubObject=function(){return{}},On.stubString=function(){return""},On.stubTrue=function(){return!0},On.multiply=sc,On.nth=function(t,e){return t&&t.length?Cr(t,ra(e)):void 0},On.noConflict=function(){return Ht._===this&&(Ht._=St),this},On.noop=Ka,On.now=hu,On.pad=function(t,e,n){t=aa(t);var r=(e=ra(e))?Ge(t):0;if(!e||r>=e)return t;var o=(e-r)/2;return Po(Xe(o),n)+t+Po(Ye(o),n)},On.padEnd=function(t,e,n){t=aa(t);var r=(e=ra(e))?Ge(t):0;return e&&re){var r=t;t=e,e=r}if(n||t%1||e%1){var o=fn();return an(t+o*(e-t+$t("1e-"+((o+"").length-1))),e)}return Br(t,e)},On.reduce=function(t,e,n){var r=Pu(t)?he:xe,o=arguments.length<3;return r(t,Ko(e,4),n,o,tr)},On.reduceRight=function(t,e,n){var r=Pu(t)?ye:xe,o=arguments.length<3;return r(t,Ko(e,4),n,o,er)},On.repeat=function(t,e,n){return e=(n?ci(t,e,n):void 0===e)?1:ra(e),Lr(aa(t),e)},On.replace=function(){var t=arguments,e=aa(t[0]);return t.length<3?e:e.replace(t[1],t[2])},On.result=function(t,e,n){var r=-1,o=(e=ao(e,t)).length;for(o||(o=1,t=void 0);++r9007199254740991)return[];var n=4294967295,r=an(t,4294967295);t-=4294967295;for(var o=Se(r,e=Ko(e));++n=i)return t;var a=n-Ge(r);if(a<1)return r;var c=u?lo(u,0,a).join(""):t.slice(0,a);if(void 0===o)return c+r;if(u&&(a+=c.length-a),Qu(o)){if(t.slice(a).search(o)){var l,f=c;for(o.global||(o=yt(o.source,aa(rt.exec(o))+"g")),o.lastIndex=0;l=o.exec(f);)var s=l.index;c=c.slice(0,void 0===s?a:s)}}else if(t.indexOf(Kr(o),a)!=a){var p=c.lastIndexOf(o);p>-1&&(c=c.slice(0,p))}return c+r},On.unescape=function(t){return(t=aa(t))&&T.test(t)?t.replace(B,He):t},On.uniqueId=function(t){var e=++At;return aa(t)+e},On.upperCase=Ta,On.upperFirst=Ma,On.each=au,On.eachRight=cu,On.first=Ri,Za(On,(fc={},cr(On,(function(t,e){Ft.call(On.prototype,e)||(fc[e]=t)})),fc),{chain:!1}),On.VERSION="4.17.15",ae(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(t){On[t].placeholder=On})),ae(["drop","take"],(function(t,e){Nn.prototype[t]=function(n){n=void 0===n?1:un(ra(n),0);var r=this.__filtered__&&!e?new Nn(this):this.clone();return r.__filtered__?r.__takeCount__=an(n,r.__takeCount__):r.__views__.push({size:an(n,4294967295),type:t+(r.__dir__<0?"Right":"")}),r},Nn.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}})),ae(["filter","map","takeWhile"],(function(t,e){var n=e+1,r=1==n||3==n;Nn.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:Ko(t,3),type:n}),e.__filtered__=e.__filtered__||r,e}})),ae(["head","last"],(function(t,e){var n="take"+(e?"Right":"");Nn.prototype[t]=function(){return this[n](1).value()[0]}})),ae(["initial","tail"],(function(t,e){var n="drop"+(e?"":"Right");Nn.prototype[t]=function(){return this.__filtered__?new Nn(this):this[n](1)}})),Nn.prototype.compact=function(){return this.filter(Va)},Nn.prototype.find=function(t){return this.filter(t).head()},Nn.prototype.findLast=function(t){return this.reverse().find(t)},Nn.prototype.invokeMap=Tr((function(t,e){return"function"==typeof t?new Nn(this):this.map((function(n){return mr(n,t,e)}))})),Nn.prototype.reject=function(t){return this.filter(Fu(Ko(t)))},Nn.prototype.slice=function(t,e){t=ra(t);var n=this;return n.__filtered__&&(t>0||e<0)?new Nn(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),void 0!==e&&(n=(e=ra(e))<0?n.dropRight(-e):n.take(e-t)),n)},Nn.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},Nn.prototype.toArray=function(){return this.take(4294967295)},cr(Nn.prototype,(function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),r=/^(?:head|last)$/.test(e),o=On[r?"take"+("last"==e?"Right":""):e],i=r||/^find/.test(e);o&&(On.prototype[e]=function(){var e=this.__wrapped__,u=r?[1]:arguments,a=e instanceof Nn,c=u[0],l=a||Pu(e),f=function(t){var e=o.apply(On,de([t],u));return r&&s?e[0]:e};l&&n&&"function"==typeof c&&1!=c.length&&(a=l=!1);var s=this.__chain__,p=!!this.__actions__.length,v=i&&!s,d=a&&!p;if(!i&&l){e=d?e:new Nn(this);var h=t.apply(e,u);return h.__actions__.push({func:nu,args:[f],thisArg:void 0}),new Cn(h,s)}return v&&d?t.apply(this,u):(h=this.thru(f),v?r?h.value()[0]:h.value():h)})})),ae(["pop","push","shift","sort","splice","unshift"],(function(t){var e=Dt[t],n=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",r=/^(?:pop|shift)$/.test(t);On.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var o=this.value();return e.apply(Pu(o)?o:[],t)}return this[n]((function(n){return e.apply(Pu(n)?n:[],t)}))}})),cr(Nn.prototype,(function(t,e){var n=On[e];if(n){var r=n.name+"";Ft.call(Dn,r)||(Dn[r]=[]),Dn[r].push({name:e,func:n})}})),Dn[So(void 0,2).name]=[{name:"wrapper",func:void 0}],Nn.prototype.clone=function(){var t=new Nn(this.__wrapped__);return t.__actions__=mo(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=mo(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=mo(this.__views__),t},Nn.prototype.reverse=function(){if(this.__filtered__){var t=new Nn(this);t.__dir__=-1,t.__filtered__=!0}else(t=this.clone()).__dir__*=-1;return t},Nn.prototype.value=function(){var t=this.__wrapped__.value(),e=this.__dir__,n=Pu(t),r=e<0,o=n?t.length:0,i=function(t,e,n){var r=-1,o=n.length;for(;++r=this.__values__.length;return{done:t,value:t?void 0:this.__values__[this.__index__++]}},On.prototype.plant=function(t){for(var e,n=this;n instanceof kn;){var r=Oi(n);r.__index__=0,r.__values__=void 0,e?o.__wrapped__=r:e=r;var o=r;n=n.__wrapped__}return o.__wrapped__=t,e},On.prototype.reverse=function(){var t=this.__wrapped__;if(t instanceof Nn){var e=t;return this.__actions__.length&&(e=new Nn(this)),(e=e.reverse()).__actions__.push({func:nu,args:[$i],thisArg:void 0}),new Cn(e,this.__chain__)}return this.thru($i)},On.prototype.toJSON=On.prototype.valueOf=On.prototype.value=function(){return no(this.__wrapped__,this.__actions__)},On.prototype.first=On.prototype.head,Yt&&(On.prototype[Yt]=function(){return this}),On}();Ht._=Qe,void 0===(o=function(){return Qe}.call(e,n,e,r))||(r.exports=o)}).call(this)}).call(this,n(76),n(496)(t))},494:function(t,e,n){"use strict";var r=n(0),o=Object(r.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});e.a=o},495:function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));n(77),n(513),n(479),n(78);var r=n(515),o=n.n(r);function i(t,e){var n=new o.a;return t.map((function(t){var r=t;return"string"==typeof t&&(r={label:t,permalink:"/blog/tags/"+n.slug(t)}),function(t,e){var n=t.label.split(": ",2),r=n[0],o=n[1],i="primary";switch(e){case"blog":case"guides":i=function(t){switch(t){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(r)}return{category:r,count:t.count,label:t.label,permalink:t.permalink,style:i,value:o}}(r,e)}))}},496:function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},505:function(t,e,n){var r=n(30),o=n(54),i=n(27),u=n(26),a=n(506);t.exports=function(t,e){var n=1==t,c=2==t,l=3==t,f=4==t,s=6==t,p=5==t||s,v=e||a;return function(e,a,d){for(var h,y,g=i(e),m=o(g),D=r(a,d,3),_=u(m.length),b=0,E=n?v(e,_):c?v(e,0):void 0;_>b;b++)if((p||b in m)&&(y=D(h=m[b],b,g),t))if(n)E[b]=y;else if(y)switch(t){case 3:return!0;case 5:return h;case 6:return b;case 2:E.push(h)}else if(f)return!1;return s?-1:l||f?f:E}}},506:function(t,e,n){var r=n(507);t.exports=function(t,e){return new(r(t))(e)}},507:function(t,e,n){var r=n(13),o=n(508),i=n(2)("species");t.exports=function(t){var e;return o(t)&&("function"!=typeof(e=t.constructor)||e!==Array&&!o(e.prototype)||(e=void 0),r(e)&&null===(e=e[i])&&(e=void 0)),void 0===e?Array:e}},508:function(t,e,n){var r=n(23);t.exports=Array.isArray||function(t){return"Array"==r(t)}},509:function(t,e,n){"use strict";var r=SyntaxError,o=Function,i=TypeError,u=function(t){try{return o('"use strict"; return ('+t+").constructor;")()}catch(e){}},a=Object.getOwnPropertyDescriptor;if(a)try{a({},"")}catch(x){a=null}var c=function(){throw new i},l=a?function(){try{return c}catch(t){try{return a(arguments,"callee").get}catch(e){return c}}}():c,f=n(547)(),s=Object.getPrototypeOf||function(t){return t.__proto__},p={},v="undefined"==typeof Uint8Array?void 0:s(Uint8Array),d={"%AggregateError%":"undefined"==typeof AggregateError?void 0:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?void 0:ArrayBuffer,"%ArrayIteratorPrototype%":f?s([][Symbol.iterator]()):void 0,"%AsyncFromSyncIteratorPrototype%":void 0,"%AsyncFunction%":p,"%AsyncGenerator%":p,"%AsyncGeneratorFunction%":p,"%AsyncIteratorPrototype%":p,"%Atomics%":"undefined"==typeof Atomics?void 0:Atomics,"%BigInt%":"undefined"==typeof BigInt?void 0:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?void 0:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?void 0:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?void 0:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?void 0:FinalizationRegistry,"%Function%":o,"%GeneratorFunction%":p,"%Int8Array%":"undefined"==typeof Int8Array?void 0:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?void 0:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?void 0:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":f?s(s([][Symbol.iterator]())):void 0,"%JSON%":"object"==typeof JSON?JSON:void 0,"%Map%":"undefined"==typeof Map?void 0:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&f?s((new Map)[Symbol.iterator]()):void 0,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?void 0:Promise,"%Proxy%":"undefined"==typeof Proxy?void 0:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?void 0:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?void 0:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&f?s((new Set)[Symbol.iterator]()):void 0,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?void 0:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":f?s(""[Symbol.iterator]()):void 0,"%Symbol%":f?Symbol:void 0,"%SyntaxError%":r,"%ThrowTypeError%":l,"%TypedArray%":v,"%TypeError%":i,"%Uint8Array%":"undefined"==typeof Uint8Array?void 0:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?void 0:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?void 0:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?void 0:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?void 0:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?void 0:WeakSet},h={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},y=n(510),g=n(550),m=y.call(Function.call,Array.prototype.concat),D=y.call(Function.apply,Array.prototype.splice),_=y.call(Function.call,String.prototype.replace),b=y.call(Function.call,String.prototype.slice),E=y.call(Function.call,RegExp.prototype.exec),w=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,F=/\\(\\)?/g,A=function(t){var e=b(t,0,1),n=b(t,-1);if("%"===e&&"%"!==n)throw new r("invalid intrinsic syntax, expected closing `%`");if("%"===n&&"%"!==e)throw new r("invalid intrinsic syntax, expected opening `%`");var o=[];return _(t,w,(function(t,e,n,r){o[o.length]=n?_(r,F,"$1"):e||t})),o},j=function(t,e){var n,o=t;if(g(h,o)&&(o="%"+(n=h[o])[0]+"%"),g(d,o)){var a=d[o];if(a===p&&(a=function t(e){var n;if("%AsyncFunction%"===e)n=u("async function () {}");else if("%GeneratorFunction%"===e)n=u("function* () {}");else if("%AsyncGeneratorFunction%"===e)n=u("async function* () {}");else if("%AsyncGenerator%"===e){var r=t("%AsyncGeneratorFunction%");r&&(n=r.prototype)}else if("%AsyncIteratorPrototype%"===e){var o=t("%AsyncGenerator%");o&&(n=s(o.prototype))}return d[e]=n,n}(o)),void 0===a&&!e)throw new i("intrinsic "+t+" exists, but is not available. Please file an issue!");return{alias:n,name:o,value:a}}throw new r("intrinsic "+t+" does not exist!")};t.exports=function(t,e){if("string"!=typeof t||0===t.length)throw new i("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof e)throw new i('"allowMissing" argument must be a boolean');if(null===E(/^%?[^%]*%?$/,t))throw new r("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var n=A(t),o=n.length>0?n[0]:"",u=j("%"+o+"%",e),c=u.name,l=u.value,f=!1,s=u.alias;s&&(o=s[0],D(n,m([0,1],s)));for(var p=1,v=!0;p=n.length){var w=a(l,h);l=(v=!!w)&&"get"in w&&!("originalValue"in w.get)?w.get:l[h]}else v=g(l,h),l=l[h];v&&!f&&(d[c]=l)}}return l}},510:function(t,e,n){"use strict";var r=n(549);t.exports=Function.prototype.bind||r},511:function(t,e,n){"use strict";var r=String.prototype.replace,o=/%20/g,i="RFC1738",u="RFC3986";t.exports={default:u,formatters:{RFC1738:function(t){return r.call(t,o,"+")},RFC3986:function(t){return String(t)}},RFC1738:i,RFC3986:u}},514:function(t,e,n){"use strict";var r=n(0),o=n.n(r),i=n(470),u=n(463),a=n.n(u);e.a=function(t){var e=t.count,n=t.label,r=t.permalink,u=t.style,c=t.value,l=t.valueOnly;return o.a.createElement(i.a,{to:r+"/",className:a()("badge","badge--rounded","badge--"+u)},l?c:n,e&&o.a.createElement(o.a.Fragment,null," (",e,")"))}},515:function(t,e,n){var r=n(516);t.exports=a;var o=Object.hasOwnProperty,i=/\s/g,u=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function a(){if(!(this instanceof a))return new a;this.reset()}function c(t,e){return"string"!=typeof t?"":(e||(t=t.toLowerCase()),t.trim().replace(u,"").replace(r(),"").replace(i,"-"))}a.prototype.slug=function(t,e){for(var n=c(t,!0===e),r=n;o.call(this.occurrences,n);)this.occurrences[r]++,n=r+"-"+this.occurrences[r];return this.occurrences[n]=0,n},a.prototype.reset=function(){this.occurrences=Object.create(null)},a.slug=c},516:function(t,e){t.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},518:function(t,e,n){"use strict";var r=n(511),o=Object.prototype.hasOwnProperty,i=Array.isArray,u=function(){for(var t=[],e=0;e<256;++e)t.push("%"+((e<16?"0":"")+e.toString(16)).toUpperCase());return t}(),a=function(t,e){for(var n=e&&e.plainObjects?Object.create(null):{},r=0;r1;){var e=t.pop(),n=e.obj[e.prop];if(i(n)){for(var r=[],o=0;o=48&&f<=57||f>=65&&f<=90||f>=97&&f<=122||i===r.RFC1738&&(40===f||41===f)?c+=a.charAt(l):f<128?c+=u[f]:f<2048?c+=u[192|f>>6]+u[128|63&f]:f<55296||f>=57344?c+=u[224|f>>12]+u[128|f>>6&63]+u[128|63&f]:(l+=1,f=65536+((1023&f)<<10|1023&a.charCodeAt(l)),c+=u[240|f>>18]+u[128|f>>12&63]+u[128|f>>6&63]+u[128|63&f])}return c},isBuffer:function(t){return!(!t||"object"!=typeof t)&&!!(t.constructor&&t.constructor.isBuffer&&t.constructor.isBuffer(t))},isRegExp:function(t){return"[object RegExp]"===Object.prototype.toString.call(t)},maybeMap:function(t,e){if(i(t)){for(var n=[],r=0;r0?A.join(",")||null:void 0}];else if(c(v))I=v;else{var B=Object.keys(A);I=y?B.sort(y):B}for(var L=u&&c(A)&&1===A.length?n+"[]":n,T=0;T0?b+_:""}},546:function(t,e,n){"use strict";var r=n(509),o=n(551),i=n(553),u=r("%TypeError%"),a=r("%WeakMap%",!0),c=r("%Map%",!0),l=o("WeakMap.prototype.get",!0),f=o("WeakMap.prototype.set",!0),s=o("WeakMap.prototype.has",!0),p=o("Map.prototype.get",!0),v=o("Map.prototype.set",!0),d=o("Map.prototype.has",!0),h=function(t,e){for(var n,r=t;null!==(n=r.next);r=n)if(n.key===e)return r.next=n.next,n.next=t.next,t.next=n,n};t.exports=function(){var t,e,n,r={assert:function(t){if(!r.has(t))throw new u("Side channel does not contain "+i(t))},get:function(r){if(a&&r&&("object"==typeof r||"function"==typeof r)){if(t)return l(t,r)}else if(c){if(e)return p(e,r)}else if(n)return function(t,e){var n=h(t,e);return n&&n.value}(n,r)},has:function(r){if(a&&r&&("object"==typeof r||"function"==typeof r)){if(t)return s(t,r)}else if(c){if(e)return d(e,r)}else if(n)return function(t,e){return!!h(t,e)}(n,r);return!1},set:function(r,o){a&&r&&("object"==typeof r||"function"==typeof r)?(t||(t=new a),f(t,r,o)):c?(e||(e=new c),v(e,r,o)):(n||(n={key:{},next:null}),function(t,e,n){var r=h(t,e);r?r.value=n:t.next={key:e,next:t.next,value:n}}(n,r,o))}};return r}},547:function(t,e,n){"use strict";var r="undefined"!=typeof Symbol&&Symbol,o=n(548);t.exports=function(){return"function"==typeof r&&("function"==typeof Symbol&&("symbol"==typeof r("foo")&&("symbol"==typeof Symbol("bar")&&o())))}},548:function(t,e,n){"use strict";t.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var t={},e=Symbol("test"),n=Object(e);if("string"==typeof e)return!1;if("[object Symbol]"!==Object.prototype.toString.call(e))return!1;if("[object Symbol]"!==Object.prototype.toString.call(n))return!1;for(e in t[e]=42,t)return!1;if("function"==typeof Object.keys&&0!==Object.keys(t).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(t).length)return!1;var r=Object.getOwnPropertySymbols(t);if(1!==r.length||r[0]!==e)return!1;if(!Object.prototype.propertyIsEnumerable.call(t,e))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var o=Object.getOwnPropertyDescriptor(t,e);if(42!==o.value||!0!==o.enumerable)return!1}return!0}},549:function(t,e,n){"use strict";var r="Function.prototype.bind called on incompatible ",o=Array.prototype.slice,i=Object.prototype.toString;t.exports=function(t){var e=this;if("function"!=typeof e||"[object Function]"!==i.call(e))throw new TypeError(r+e);for(var n,u=o.call(arguments,1),a=function(){if(this instanceof n){var r=e.apply(this,u.concat(o.call(arguments)));return Object(r)===r?r:this}return e.apply(t,u.concat(o.call(arguments)))},c=Math.max(0,e.length-u.length),l=[],f=0;f-1?o(n):n}},552:function(t,e,n){"use strict";var r=n(510),o=n(509),i=o("%Function.prototype.apply%"),u=o("%Function.prototype.call%"),a=o("%Reflect.apply%",!0)||r.call(u,i),c=o("%Object.getOwnPropertyDescriptor%",!0),l=o("%Object.defineProperty%",!0),f=o("%Math.max%");if(l)try{l({},"a",{value:1})}catch(p){l=null}t.exports=function(t){var e=a(r,u,arguments);if(c&&l){var n=c(e,"length");n.configurable&&l(e,"length",{value:1+f(0,t.length-(arguments.length-1))})}return e};var s=function(){return a(r,i,arguments)};l?l(t.exports,"apply",{value:s}):t.exports.apply=s},553:function(t,e,n){var r="function"==typeof Map&&Map.prototype,o=Object.getOwnPropertyDescriptor&&r?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,i=r&&o&&"function"==typeof o.get?o.get:null,u=r&&Map.prototype.forEach,a="function"==typeof Set&&Set.prototype,c=Object.getOwnPropertyDescriptor&&a?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,l=a&&c&&"function"==typeof c.get?c.get:null,f=a&&Set.prototype.forEach,s="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,p="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,v="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,d=Boolean.prototype.valueOf,h=Object.prototype.toString,y=Function.prototype.toString,g=String.prototype.match,m=String.prototype.slice,D=String.prototype.replace,_=String.prototype.toUpperCase,b=String.prototype.toLowerCase,E=RegExp.prototype.test,w=Array.prototype.concat,F=Array.prototype.join,A=Array.prototype.slice,j=Math.floor,x="function"==typeof BigInt?BigInt.prototype.valueOf:null,O=Object.getOwnPropertySymbols,S="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,k="function"==typeof Symbol&&"object"==typeof Symbol.iterator,C="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===k||"symbol")?Symbol.toStringTag:null,N=Object.prototype.propertyIsEnumerable,P=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(t){return t.__proto__}:null);function I(t,e){if(t===1/0||t===-1/0||t!=t||t&&t>-1e3&&t<1e3||E.call(/e/,e))return e;var n=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof t){var r=t<0?-j(-t):j(t);if(r!==t){var o=String(r),i=m.call(e,o.length+1);return D.call(o,n,"$&_")+"."+D.call(D.call(i,/([0-9]{3})/g,"$&_"),/_$/,"")}}return D.call(e,n,"$&_")}var R=n(554),B=R.custom,L=z(B)?B:null;function T(t,e,n){var r="double"===(n.quoteStyle||e)?'"':"'";return r+t+r}function M(t){return D.call(String(t),/"/g,""")}function W(t){return!("[object Array]"!==G(t)||C&&"object"==typeof t&&C in t)}function U(t){return!("[object RegExp]"!==G(t)||C&&"object"==typeof t&&C in t)}function z(t){if(k)return t&&"object"==typeof t&&t instanceof Symbol;if("symbol"==typeof t)return!0;if(!t||"object"!=typeof t||!S)return!1;try{return S.call(t),!0}catch(e){}return!1}t.exports=function t(e,n,r,o){var a=n||{};if(q(a,"quoteStyle")&&"single"!==a.quoteStyle&&"double"!==a.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(q(a,"maxStringLength")&&("number"==typeof a.maxStringLength?a.maxStringLength<0&&a.maxStringLength!==1/0:null!==a.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var c=!q(a,"customInspect")||a.customInspect;if("boolean"!=typeof c&&"symbol"!==c)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(q(a,"indent")&&null!==a.indent&&"\t"!==a.indent&&!(parseInt(a.indent,10)===a.indent&&a.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(q(a,"numericSeparator")&&"boolean"!=typeof a.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var h=a.numericSeparator;if(void 0===e)return"undefined";if(null===e)return"null";if("boolean"==typeof e)return e?"true":"false";if("string"==typeof e)return function t(e,n){if(e.length>n.maxStringLength){var r=e.length-n.maxStringLength,o="... "+r+" more character"+(r>1?"s":"");return t(m.call(e,0,n.maxStringLength),n)+o}return T(D.call(D.call(e,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,H),"single",n)}(e,a);if("number"==typeof e){if(0===e)return 1/0/e>0?"0":"-0";var _=String(e);return h?I(e,_):_}if("bigint"==typeof e){var E=String(e)+"n";return h?I(e,E):E}var j=void 0===a.depth?5:a.depth;if(void 0===r&&(r=0),r>=j&&j>0&&"object"==typeof e)return W(e)?"[Array]":"[Object]";var O=function(t,e){var n;if("\t"===t.indent)n="\t";else{if(!("number"==typeof t.indent&&t.indent>0))return null;n=F.call(Array(t.indent+1)," ")}return{base:n,prev:F.call(Array(e+1),n)}}(a,r);if(void 0===o)o=[];else if(V(o,e)>=0)return"[Circular]";function B(e,n,i){if(n&&(o=A.call(o)).push(n),i){var u={depth:a.depth};return q(a,"quoteStyle")&&(u.quoteStyle=a.quoteStyle),t(e,u,r+1,o)}return t(e,a,r+1,o)}if("function"==typeof e&&!U(e)){var $=function(t){if(t.name)return t.name;var e=g.call(y.call(t),/^function\s*([\w$]+)/);if(e)return e[1];return null}(e),X=Y(e,B);return"[Function"+($?": "+$:" (anonymous)")+"]"+(X.length>0?" { "+F.call(X,", ")+" }":"")}if(z(e)){var tt=k?D.call(String(e),/^(Symbol\(.*\))_[^)]*$/,"$1"):S.call(e);return"object"!=typeof e||k?tt:Q(tt)}if(function(t){if(!t||"object"!=typeof t)return!1;if("undefined"!=typeof HTMLElement&&t instanceof HTMLElement)return!0;return"string"==typeof t.nodeName&&"function"==typeof t.getAttribute}(e)){for(var et="<"+b.call(String(e.nodeName)),nt=e.attributes||[],rt=0;rt"}if(W(e)){if(0===e.length)return"[]";var ot=Y(e,B);return O&&!function(t){for(var e=0;e=0)return!1;return!0}(ot)?"["+K(ot,O)+"]":"[ "+F.call(ot,", ")+" ]"}if(function(t){return!("[object Error]"!==G(t)||C&&"object"==typeof t&&C in t)}(e)){var it=Y(e,B);return"cause"in Error.prototype||!("cause"in e)||N.call(e,"cause")?0===it.length?"["+String(e)+"]":"{ ["+String(e)+"] "+F.call(it,", ")+" }":"{ ["+String(e)+"] "+F.call(w.call("[cause]: "+B(e.cause),it),", ")+" }"}if("object"==typeof e&&c){if(L&&"function"==typeof e[L]&&R)return R(e,{depth:j-r});if("symbol"!==c&&"function"==typeof e.inspect)return e.inspect()}if(function(t){if(!i||!t||"object"!=typeof t)return!1;try{i.call(t);try{l.call(t)}catch(et){return!0}return t instanceof Map}catch(e){}return!1}(e)){var ut=[];return u.call(e,(function(t,n){ut.push(B(n,e,!0)+" => "+B(t,e))})),Z("Map",i.call(e),ut,O)}if(function(t){if(!l||!t||"object"!=typeof t)return!1;try{l.call(t);try{i.call(t)}catch(e){return!0}return t instanceof Set}catch(n){}return!1}(e)){var at=[];return f.call(e,(function(t){at.push(B(t,e))})),Z("Set",l.call(e),at,O)}if(function(t){if(!s||!t||"object"!=typeof t)return!1;try{s.call(t,s);try{p.call(t,p)}catch(et){return!0}return t instanceof WeakMap}catch(e){}return!1}(e))return J("WeakMap");if(function(t){if(!p||!t||"object"!=typeof t)return!1;try{p.call(t,p);try{s.call(t,s)}catch(et){return!0}return t instanceof WeakSet}catch(e){}return!1}(e))return J("WeakSet");if(function(t){if(!v||!t||"object"!=typeof t)return!1;try{return v.call(t),!0}catch(e){}return!1}(e))return J("WeakRef");if(function(t){return!("[object Number]"!==G(t)||C&&"object"==typeof t&&C in t)}(e))return Q(B(Number(e)));if(function(t){if(!t||"object"!=typeof t||!x)return!1;try{return x.call(t),!0}catch(e){}return!1}(e))return Q(B(x.call(e)));if(function(t){return!("[object Boolean]"!==G(t)||C&&"object"==typeof t&&C in t)}(e))return Q(d.call(e));if(function(t){return!("[object String]"!==G(t)||C&&"object"==typeof t&&C in t)}(e))return Q(B(String(e)));if(!function(t){return!("[object Date]"!==G(t)||C&&"object"==typeof t&&C in t)}(e)&&!U(e)){var ct=Y(e,B),lt=P?P(e)===Object.prototype:e instanceof Object||e.constructor===Object,ft=e instanceof Object?"":"null prototype",st=!lt&&C&&Object(e)===e&&C in e?m.call(G(e),8,-1):ft?"Object":"",pt=(lt||"function"!=typeof e.constructor?"":e.constructor.name?e.constructor.name+" ":"")+(st||ft?"["+F.call(w.call([],st||[],ft||[]),": ")+"] ":"");return 0===ct.length?pt+"{}":O?pt+"{"+K(ct,O)+"}":pt+"{ "+F.call(ct,", ")+" }"}return String(e)};var $=Object.prototype.hasOwnProperty||function(t){return t in this};function q(t,e){return $.call(t,e)}function G(t){return h.call(t)}function V(t,e){if(t.indexOf)return t.indexOf(e);for(var n=0,r=t.length;n-1?t.split(","):t},l=function(t,e,n,r){if(t){var i=n.allowDots?t.replace(/\.([^.[]+)/g,"[$1]"):t,u=/(\[[^[\]]*])/g,a=n.depth>0&&/(\[[^[\]]*])/.exec(i),l=a?i.slice(0,a.index):i,f=[];if(l){if(!n.plainObjects&&o.call(Object.prototype,l)&&!n.allowPrototypes)return;f.push(l)}for(var s=0;n.depth>0&&null!==(a=u.exec(i))&&s=0;--i){var u,a=t[i];if("[]"===a&&n.parseArrays)u=[].concat(o);else{u=n.plainObjects?Object.create(null):{};var l="["===a.charAt(0)&&"]"===a.charAt(a.length-1)?a.slice(1,-1):a,f=parseInt(l,10);n.parseArrays||""!==l?!isNaN(f)&&a!==l&&String(f)===l&&f>=0&&n.parseArrays&&f<=n.arrayLimit?(u=[])[f]=o:"__proto__"!==l&&(u[l]=o):u={0:o}}o=u}return o}(f,e,n,r)}};t.exports=function(t,e){var n=function(t){if(!t)return u;if(null!==t.decoder&&void 0!==t.decoder&&"function"!=typeof t.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==t.charset&&"utf-8"!==t.charset&&"iso-8859-1"!==t.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var e=void 0===t.charset?u.charset:t.charset;return{allowDots:void 0===t.allowDots?u.allowDots:!!t.allowDots,allowPrototypes:"boolean"==typeof t.allowPrototypes?t.allowPrototypes:u.allowPrototypes,allowSparse:"boolean"==typeof t.allowSparse?t.allowSparse:u.allowSparse,arrayLimit:"number"==typeof t.arrayLimit?t.arrayLimit:u.arrayLimit,charset:e,charsetSentinel:"boolean"==typeof t.charsetSentinel?t.charsetSentinel:u.charsetSentinel,comma:"boolean"==typeof t.comma?t.comma:u.comma,decoder:"function"==typeof t.decoder?t.decoder:u.decoder,delimiter:"string"==typeof t.delimiter||r.isRegExp(t.delimiter)?t.delimiter:u.delimiter,depth:"number"==typeof t.depth||!1===t.depth?+t.depth:u.depth,ignoreQueryPrefix:!0===t.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof t.interpretNumericEntities?t.interpretNumericEntities:u.interpretNumericEntities,parameterLimit:"number"==typeof t.parameterLimit?t.parameterLimit:u.parameterLimit,parseArrays:!1!==t.parseArrays,plainObjects:"boolean"==typeof t.plainObjects?t.plainObjects:u.plainObjects,strictNullHandling:"boolean"==typeof t.strictNullHandling?t.strictNullHandling:u.strictNullHandling}}(e);if(""===t||null==t)return n.plainObjects?Object.create(null):{};for(var f="string"==typeof t?function(t,e){var n,l={},f=e.ignoreQueryPrefix?t.replace(/^\?/,""):t,s=e.parameterLimit===1/0?void 0:e.parameterLimit,p=f.split(e.delimiter,s),v=-1,d=e.charset;if(e.charsetSentinel)for(n=0;n-1&&(y=i(y)?[y]:y),o.call(l,h)?l[h]=r.combine(l[h],y):l[h]=y}return l}(t,n):t,s=n.plainObjects?Object.create(null):{},p=Object.keys(f),v=0;v - + - + - + - + - + @@ -47,17 +47,17 @@ - + - + - + - + - + diff --git a/components/index.html b/components/index.html index e80bd44566..8737d8df44 100644 --- a/components/index.html +++ b/components/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -47,17 +47,17 @@ - + - + - + - + - + diff --git a/contact/index.html b/contact/index.html index 4971cdbc90..1db66bd9a4 100644 --- a/contact/index.html +++ b/contact/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -47,17 +47,17 @@ - + - + - + - + - + diff --git a/d9a4c8ef.a10fb5be.js b/d9a4c8ef.e82657d8.js similarity index 99% rename from d9a4c8ef.a10fb5be.js rename to d9a4c8ef.e82657d8.js index 4c24b2d53a..314cd73679 100644 --- a/d9a4c8ef.a10fb5be.js +++ b/d9a4c8ef.e82657d8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[264],{416:function(e,n,t){"use strict";t.r(n),t.d(n,"frontMatter",(function(){return s})),t.d(n,"metadata",(function(){return b})),t.d(n,"rightToc",(function(){return p})),t.d(n,"default",(function(){return d}));var a=t(1),o=t(9),r=(t(0),t(465)),l=t(477),c=t(479),i=t(464),s={last_modified_on:"2024-11-01",title:"CLI",description:"How to use the Qovery CLI (Command Line Interface)"},b={id:"using-qovery/interface/cli",title:"CLI",description:"How to use the Qovery CLI (Command Line Interface)",source:"@site/docs/using-qovery/interface/cli.md",permalink:"/docs/using-qovery/interface/cli",sidebar:"docs",previous:{title:"Web interface",permalink:"/docs/using-qovery/interface/web-interface"},next:{title:"REST API",permalink:"/docs/using-qovery/interface/rest-api"}},p=[{value:"First usage",id:"first-usage",children:[{value:"Install",id:"install",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Help",id:"help",children:[]}]},{value:"Context",id:"context",children:[{value:"Set New Context",id:"set-new-context",children:[]},{value:"Print Current Context",id:"print-current-context",children:[]}]},{value:"Log",id:"log",children:[{value:"Follow Logs",id:"follow-logs",children:[]}]},{value:"Status",id:"status",children:[]},{value:"Console",id:"console",children:[]},{value:"Shell",id:"shell",children:[{value:"Pass a command",id:"pass-a-command",children:[]},{value:"Shell in a dedicated pod",id:"shell-in-a-dedicated-pod",children:[]},{value:"Shell in a dedicated container",id:"shell-in-a-dedicated-container",children:[]}]},{value:"Port-forward",id:"port-forward",children:[{value:"Port-forward a dedicated pod",id:"port-forward-a-dedicated-pod",children:[]}]},{value:"Generate API token",id:"generate-api-token",children:[]},{value:"Managing services, environments and projects",id:"managing-services-environments-and-projects",children:[{value:"Environment",id:"environment",children:[]},{value:"Projects",id:"projects",children:[]}]},{value:"Access your Qovery-managed cluster",id:"access-your-qovery-managed-cluster",children:[]},{value:"Managing the Deployment Pipeline",id:"managing-the-deployment-pipeline",children:[{value:"List stages",id:"list-stages",children:[]},{value:"Add a stage",id:"add-a-stage",children:[]},{value:"Modify a stage",id:"modify-a-stage",children:[]},{value:"Delete a stage",id:"delete-a-stage",children:[]},{value:"Change stage for a service",id:"change-stage-for-a-service",children:[]}]},{value:"Static token",id:"static-token",children:[]},{value:"Support",id:"support",children:[]}],u={rightToc:p};function d(e){var n=e.components,t=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},u,t,{components:n,mdxType:"MDXLayout"}),Object(r.b)(i.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Use Infrastructure as Code (IaC) with our ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/integration/terraform-provider/"}),"Terraform Provider")," and our ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/interface/rest-api/"}),"REST API")," to manage Qovery and deploy your apps.")),Object(r.b)("p",null,"Qovery provides a very easy to use CLI (Command Line Interface) designed to fit the developer workflow perfectly."),Object(r.b)("hr",null),Object(r.b)("p",null,"The purpose of the CLI is to integrate seamlessly with your development workflow:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Write code"),Object(r.b)("li",{parentName:"ol"},"Commit"),Object(r.b)("li",{parentName:"ol"},Object(r.b)("strong",{parentName:"li"},"Qovery")," - deploy a new version of your application"),Object(r.b)("li",{parentName:"ol"},Object(r.b)("strong",{parentName:"li"},"Qovery CLI")," - check the status of your application"),Object(r.b)("li",{parentName:"ol"},Object(r.b)("strong",{parentName:"li"},"Qovery CLI")," - debug your application"),Object(r.b)("li",{parentName:"ol"},"Repeat")),Object(r.b)("h2",{id:"first-usage"},"First usage"),Object(r.b)("h3",{id:"install"},"Install"),Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(c.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),"."))),Object(r.b)("h3",{id:"sign-up"},"Sign up"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(r.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in."),Object(r.b)("h3",{id:"help"},"Help"),Object(r.b)("p",null,"You can see all the commands available by executing:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery help\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Help output"',title:'"Help','output"':!0}),'$ qovery help\nA Command-line Interface of the Qovery platform\n\nUsage:\n qovery [command]\n\nAvailable Commands:\n application Manage applications\n auth Log in to Qovery\n cluster Manage clusters\n completion Generate the autocompletion script for the specified shell\n console Opens the application in Qovery Console in your browser\n container Manage containers\n context Manage CLI context\n cronjob Manage cronjobs\n database Manage databases\n env Manage Environment Variables and Secrets\n environment Manage environments\n helm Manage helms\n help Help about any command\n lifecycle Manage lifecycle jobs\n list-pods List the pods of a service with their pods\n log Print your application logs\n port-forward Port forward a port to an application container\n project Manage Project\n service Manage services\n shell Connect to an application container\n status Print the status of your application\n token Generate an API token\n upgrade Upgrade Qovery CLI to latest version\n version Print installed version of the Qovery CLI\n\nFlags:\n -h, --help help for qovery\n --verbose Verbose output\n\nUse "qovery [command] --help" for more information about a command.\n')),Object(r.b)("h2",{id:"context"},"Context"),Object(r.b)("p",null,"Context command lets you configure the CLI to work with your chosen application. Before executing other commands, you need first to set up the context.\nThe context is then remembered and used by the CLI. You can configure a new context anytime by running the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery context set")," command."),Object(r.b)("p",null,"Most of the commands support an inline context set allowing you to directly pass the URL of the application you wants to interact with."),Object(r.b)("p",null,"Example:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell https://console.qovery.com/organization/51927012-8377-4e0f-84cf-7f5f38a0154b/project/a6545d50-69a3-4966-89cc-4c0bfb6d3448/environment/c9ac549b-a855-4d3b-b652-d68d5f1fea11/application/820ca0a3-08bf-42c1-8ad2-540714ad657f/general\n# this is the url of my back-end application\n\nOrganization | My orga\nProject | R&D / Backend\nEnvironment | prod\nServiceLevel | back-end\nServiceType | application\n\n$ ls\n...\n")),Object(r.b)("h3",{id:"set-new-context"},"Set New Context"),Object(r.b)("p",null,"To set a new context, type ",Object(r.b)("inlineCode",{parentName:"p"},"qovery context set"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery context set\nQovery: Current context:\nOrganization | Qovery\nProject | test\nEnvironment | development\nApplication | website\n\nQovery: Select new context\nOrganization:\n\u2714 Qovery\nProject:\n\u2714 admin\nEnvironment:\n\u2714 main\nApplication:\n\u2714 app\n\nQovery: New context:\nOrganization | Qovery\nProject | admin\nEnvironment | main\nApplication | app\n")),Object(r.b)("h3",{id:"print-current-context"},"Print Current Context"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery context\nQovery: Current context:\nOrganization | Qovery\nProject | admin\nEnvironment | main\nApplication | app\n\nQovery: You can set a new context using 'qovery context set'.\n")),Object(r.b)("h2",{id:"log"},"Log"),Object(r.b)("p",null,"Log command allows you to display the application logs."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery log\n TIME MESSAGE\n Jul 15 08:46:13.019717 at /usr/src/app/autoFunctions/levels.js:17:16\n Jul 15 08:46:13.019721 at Array.forEach ()\n Jul 15 08:46:13.019724 at Timeout._onTimeout (/usr/src/app/autoFunctions/levels.js:15:14)\n Jul 15 08:46:13.019728 at listOnTimeout (internal/timers.js:557:17)\n # ... the rest of logs\n")),Object(r.b)("p",null,"By default, the last 1000 logs is displayed."),Object(r.b)("h3",{id:"follow-logs"},"Follow Logs"),Object(r.b)("p",null,"To make the CLI follow your logs, use ",Object(r.b)("inlineCode",{parentName:"p"},"-f")," flag:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery log -f\n TIME MESSAGE\n Jul 15 08:46:13.019717 at /usr/src/app/autoFunctions/levels.js:17:16\n Jul 15 08:46:13.019721 at Array.forEach ()\n Jul 15 08:46:13.019724 at Timeout._onTimeout (/usr/src/app/autoFunctions/levels.js:15:14)\n Jul 15 08:46:13.019728 at listOnTimeout (internal/timers.js:557:17)\n # ... the rest of logs\n")),Object(r.b)("p",null,"This will make the CLI follow your application logs and append any new logs till you use ",Object(r.b)("inlineCode",{parentName:"p"},"CTRL+C"),"."),Object(r.b)("h2",{id:"status"},"Status"),Object(r.b)("p",null,"Status command lets you print the basic status of your application."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery status\n15 Jul 21 10:55 CEST\nApplication | Backend\nStatus | RUNNING\n")),Object(r.b)("h2",{id:"console"},"Console"),Object(r.b)("p",null,"Console command quickly opens the Qovery Console in your browser to let you display more information about your application."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery console\nQovery: Opening https://console.qovery.com/platform/organization/your-org/projects/your-proj/environments/your-env/applications/your-app/summary\n")),Object(r.b)("h2",{id:"shell"},"Shell"),Object(r.b)("p",null,"Shell command allows you to open a connection and execute commands directly on the container running application."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell\n/ # ls\nbin media srv\ndev mnt sys\ndocker-entrypoint.d opt tmp\ndocker-entrypoint.sh proc usr\netc root var\nhome run www\nlib sbin\n")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},"Keep in mind these limitations when using this feature:",Object(r.b)("ul",null,Object(r.b)("li",null,"Install a process reaper as pid one in your container (i.e: dumb-init), as you may leave zoombie process in your container if your shell terminate unproperly (i.e: ctrl+c, cnx restart). This is a known issue with kubernetes exec to leave process alive after attach is closed;"),Object(r.b)("li",null,"shell is force closed after [1 hour, 1GB transmitted];"),Object(r.b)("li",null,"we use SH by default. To have auto-completion, start bash."))),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},"The width of the terminal is limited to 80 characters. But you can resize it once you are inside the application with one of these commands:",Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"COLUMNS=200 tput init\nstty cols 200\n"))),Object(r.b)("h3",{id:"pass-a-command"},"Pass a command"),Object(r.b)("p",null,"To pass a command, you can use the ",Object(r.b)("inlineCode",{parentName:"p"},"--command")," or ",Object(r.b)("inlineCode",{parentName:"p"},"-c")," argument followed by your command."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --command ls\nbin media srv\ndev mnt sys\ndocker-entrypoint.d opt tmp\ndocker-entrypoint.sh proc usr\netc root var\nhome run www\nlib sbin\n")),Object(r.b)("p",null,"To pass several arguments, you can separate them with a comma or send different ",Object(r.b)("inlineCode",{parentName:"p"},"--command"),"."),Object(r.b)("p",null,Object(r.b)("inlineCode",{parentName:"p"},"qovery shell --command ls --command -l"),"\n",Object(r.b)("inlineCode",{parentName:"p"},"qovery shell --command ls,-l"),"\n",Object(r.b)("inlineCode",{parentName:"p"},"qovery shell -c ls,-l")),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --command ls --command -l\ndrwxr-xr-x 2 root root 4096 Nov 30 09:32 bin\ndrwxr-xr-x 5 root root 360 Dec 21 09:46 dev\ndrwxr-xr-x 1 root root 41 Dec 20 20:13 docker-entrypoint.d\n-rwxr-xr-x 1 root root 1620 Dec 20 20:13 docker-entrypoint.sh\ndrwxr-xr-x 1 root root 25 Dec 21 09:46 etc\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 home\ndrwxr-xr-x 1 root root 61 Dec 20 22:11 lib\ndrwxr-xr-x 5 root root 44 Nov 30 09:32 media\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 mnt\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 opt\ndr-xr-xr-x 209 root root 0 Dec 21 09:46 proc\ndrwx------ 1 root root 26 Dec 21 10:38 root\ndrwxr-xr-x 1 root root 23 Dec 21 09:46 run\ndrwxr-xr-x 2 root root 4096 Nov 30 09:32 sbin\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 srv\ndr-xr-xr-x 13 root root 0 Dec 21 09:46 sys\ndrwxrwxrwt 2 root root 6 Nov 30 09:32 tmp\ndrwxr-xr-x 1 root root 66 Nov 30 09:32 usr\ndrwxr-xr-x 1 root root 19 Nov 30 09:32 var\ndrwxr-xr-x 2 root root 59 Dec 21 09:45 www\n")),Object(r.b)("h3",{id:"shell-in-a-dedicated-pod"},"Shell in a dedicated pod"),Object(r.b)("p",null,"If your application is running on several pods, you can shell directly in a dedicated one by using the ",Object(r.b)("inlineCode",{parentName:"p"},"--pod")," or ",Object(r.b)("inlineCode",{parentName:"p"},"-p")," argument followed by your pod name."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --pod app-5f65fb5c4-frontend-5f65db5c4b-q4w11\n")),Object(r.b)("p",null,"NOTE: you can get the list of pods by running the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery list-pods")," command."),Object(r.b)("h3",{id:"shell-in-a-dedicated-container"},"Shell in a dedicated container"),Object(r.b)("p",null,"If you have several containers in your pod, you can shell directly in a dedicated one by using the ",Object(r.b)("inlineCode",{parentName:"p"},"--container")," argument followed by your container name."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --container app-5f65fb5c4-frontend\n")),Object(r.b)("h2",{id:"port-forward"},"Port-forward"),Object(r.b)("p",null,"Port-forward command allows you to port-forward all the traffic on your local machine to a remote resource available on a Qovery environment. This mechanism allows developers to create a secure, encrypted tunnel from their local machine to the application or databases hosted in the cloud. "),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'$ qovery port-forward -p 8000:80 #your_local_port:your_remote_port\nInfo: Current context:\nOrganization | Qovery Prod\nProject | R&D / Frontend\nEnvironment | prod\nService | console\nType | application\n\nInfo: Continue with port-forward command using this context ?\nPlease type "yes" to validate context: yes\n\nListening on 127.0.0.1:8000 => 80\n')),Object(r.b)("p",null,"The port-forward feature works with any ",Object(r.b)("inlineCode",{parentName:"p"},"application"),", ",Object(r.b)("inlineCode",{parentName:"p"},"Cronjob"),", ",Object(r.b)("inlineCode",{parentName:"p"},"Lifecycle job")," or ",Object(r.b)("inlineCode",{parentName:"p"},"database")," (Container or Managed) deployed with Qovery. For ",Object(r.b)("inlineCode",{parentName:"p"},"Managed database")," instances on AWS, once the port-forwarded is activated, you must specify ~ ",Object(r.b)("inlineCode",{parentName:"p"},"--tls")," and ",Object(r.b)("inlineCode",{parentName:"p"},"--tls-insecure")," in your database connection command since localhost is not the valid hostname."),Object(r.b)("h3",{id:"port-forward-a-dedicated-pod"},"Port-forward a dedicated pod"),Object(r.b)("p",null,"If your application is running on several pods, you can port-forward to a dedicated one by using the ",Object(r.b)("inlineCode",{parentName:"p"},"--pod")," argument followed by your pod name."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery port-forward -p 8000:80 -pod app-5f65fb5c4-frontend-5f65db5c4b-q4w11\n")),Object(r.b)("p",null,"NOTE: you can get the list of pods by running the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery list-pods")," command."),Object(r.b)("h2",{id:"generate-api-token"},"Generate API token"),Object(r.b)("p",null,"To use the Qovery API you will need to generate an authentication token. To generate an API token you can install the CLI and type"),Object(r.b)(i.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Never share your API token with anyone.")),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery token\n\nQovery: Select organization\nOrganization:\n\u2714 My Organization\nChoose a token name\nToken name: Romaric\nChoose a token description\nToken description: used for Github Actions\nQovery: ---- Never share this authentication token and keep it secure ----\nQovery: qov_4LnEg2wFxxxxxHObGSQ22rjBZZyyyySgyR6Y_2500882691\nQovery: ---- Never share this authentication token and keep it secure ----\n")),Object(r.b)("p",null,"To use your token and list your organizations."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-shell"}),"curl -X GET -H 'Authorization: Token qov_4LnEg2wFxxxxxHObGSQ22rjBZZyyyySgyR6Y_2500882691' https://api.qovery.com/organization\n")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The token can be used to interact programmatically with our API (directly, via our Terraform Provider etc..).\nIf you get a 424 error while trying to create new applications from one of your git repository, please make sure that the Organization Owner has access to the repository you are configuring for your app.")),Object(r.b)("p",null,"Check out our ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://api-doc.qovery.com"}),"API documentation")),Object(r.b)("h2",{id:"managing-services-environments-and-projects"},"Managing services, environments and projects"),Object(r.b)("p",null,"The CLI allows you to manage and deploy the environment and services within your organization"),Object(r.b)("p",null,"###\xa0application, container, lifecycle, cronjob\nThese commands allow you to manage all these services via the CLI. You can run the following actions on these services:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"cancel: Cancel the service deployment"),Object(r.b)("li",{parentName:"ul"},"delete: Delete a service"),Object(r.b)("li",{parentName:"ul"},"deploy: Deploy a service"),Object(r.b)("li",{parentName:"ul"},"list: List the service of the specified type"),Object(r.b)("li",{parentName:"ul"},"redeploy: Redeploy a service (already deployed before)"),Object(r.b)("li",{parentName:"ul"},"stop: Stop a service"),Object(r.b)("li",{parentName:"ul"},"update: Update a service (service name, git branch, auto-deploy, ...)")),Object(r.b)("p",null,"Each action allows you to specify additional parameters to define the service you want to modify (you can find them via the --help command) "),Object(r.b)("p",null,"Example: Listing applications and triggering a deployment"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'$ qovery application list\nName | Type | Status | Last Update \nbackend | Application | STOPPED | 2023-02-02 14:48:05.339652 +0000 UTC\nfront-end | Application | STOPPED | 2023-02-09 14:04:38.079792 +0000 UTC\n\n$ qovery application deploy -n "backend"\nDeploying application backend in progress..\n\n$ qovery application list\nName | Type | Status | Last Update \nbackend | Application | RUNNING | 2023-02-13 12:59:23.228231 +0000 UTC\nfront-end | Application | STOPPED | 2023-02-09 14:04:38.079792 +0000 UTC\n')),Object(r.b)("p",null,"Example: Enable the auto-deploy feature for an application"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery application update --application backend --auto-deploy true\nApplication backend updated!\n")),Object(r.b)("h3",{id:"environment"},"Environment"),Object(r.b)("p",null,"The command ",Object(r.b)("inlineCode",{parentName:"p"},"environment")," allow you to manage a specific environment via the CLI. You can run the following actions on environments:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"cancel: Cancel an environment deployment"),Object(r.b)("li",{parentName:"ul"},"clone: Clone an environment"),Object(r.b)("li",{parentName:"ul"},"delete: Delete an environment"),Object(r.b)("li",{parentName:"ul"},"deploy: Deploy an environment"),Object(r.b)("li",{parentName:"ul"},"list: List environments"),Object(r.b)("li",{parentName:"ul"},"redeploy: Redeploy an environment"),Object(r.b)("li",{parentName:"ul"},"stage: Manage deployment stages"),Object(r.b)("li",{parentName:"ul"},"stop: Stop an environment")),Object(r.b)("p",null,"Each action allows you to specify additional parameters to define the service you want to modify (you can find them via the --help command)"),Object(r.b)("p",null,"Example: Manage deployment stages and triggering deployment"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'~ $ qovery environment stage list\n\n# deployment stage 1: "DATABASE DEFAULT"\nRename me to avoid default/legacy ordering\n\nType | Name\nDATABASE | Redis\nDATABASE | DB\n\n\n# deployment stage 2: "JOB DEFAULT"\nRename me to avoid default/legacy ordering\n\n\n\n\n# deployment stage 3: "CONTAINER DEFAULT"\nRename me to avoid default/legacy ordering\n\nType | Name\nCONTAINER | Rabbitmq\n\n\n# deployment stage 4: "APPLICATION DEFAULT"\nRename me to avoid default/legacy ordering\n\nType | Name\nAPPLICATION | Backend\nAPPLICATION | Frontend\nAPPLICATION | Pablo Backend App\nAPPLICATION | API gateway\n\n~ $ qovery environment deploy\nEnvironment is deploying!\n')),Object(r.b)("h3",{id:"projects"},"Projects"),Object(r.b)("p",null,"You can list the organization's projects by using the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery project list\n")),Object(r.b)("h2",{id:"access-your-qovery-managed-cluster"},"Access your Qovery-managed cluster"),Object(r.b)("p",null,"To access your Qovery managed cluster, follow these steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},Object(r.b)("strong",{parentName:"li"},"Export your kubeconfig file")," by running the command below, replacing ",Object(r.b)("inlineCode",{parentName:"li"},"")," with your actual cluster ID:")),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery cluster kubeconfig --cluster-id \n")),Object(r.b)("ol",{start:2},Object(r.b)("li",{parentName:"ol"},Object(r.b)("strong",{parentName:"li"},"Set the KUBECONFIG environment variable")," to the path of the kubeconfig file obtained from the previous command:")),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"export KUBECONFIG=\n")),Object(r.b)("ol",{start:3},Object(r.b)("li",{parentName:"ol"},"You can now use tools like ",Object(r.b)("inlineCode",{parentName:"li"},"k9s")," or ",Object(r.b)("inlineCode",{parentName:"li"},"kubectl")," to access and manage your cluster:")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Some cloud providers like GCP or AWS require additional configuration to access the cluster. Make sure you have CLI binaries installed (gcloud CLI/AWS CLI/...), and the right permissions and credentials set up (environment variables or profile file).")),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Using k9s")),Object(r.b)("p",null,"Launch the k9s terminal UI to interact with your Kubernetes cluster:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"k9s\n")),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Using kubectl")),Object(r.b)("p",null,"Here are a few examples of common kubectl commands:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"kubectl get pods #List all pods in the default namespace\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"kubectl describe pod #Get detailed information about a specific pod\n")),Object(r.b)("h2",{id:"managing-the-deployment-pipeline"},"Managing the Deployment Pipeline"),Object(r.b)("p",null,"In the following sections we will describe how to modify the Deployment Pipeline. "),Object(r.b)("h3",{id:"list-stages"},"List stages"),Object(r.b)("p",null,"You can list all the stages of your environment by using the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage list\n")),Object(r.b)("h3",{id:"add-a-stage"},"Add a stage"),Object(r.b)("p",null,"You can add a new stage by using the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage create -n -d \n")),Object(r.b)("p",null,"Note that the stage will be added at the end of the pipeline (the highest number)"),Object(r.b)("h3",{id:"modify-a-stage"},"Modify a stage"),Object(r.b)("p",null,"You can modify a stage by using the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage edit -n --new-name --new-description \n")),Object(r.b)("h3",{id:"delete-a-stage"},"Delete a stage"),Object(r.b)("p",null,"You can modify a stage by using the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage delete -n \n")),Object(r.b)("h3",{id:"change-stage-for-a-service"},"Change stage for a service"),Object(r.b)("p",null,"You can modify the stage associated to a service by using the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage move -n --stage \n")),Object(r.b)("h2",{id:"static-token"},"Static token"),Object(r.b)("p",null,"You can use a static token to authenticate to Qovery CLI. Which is useful for CI/CD pipelines."),Object(r.b)("p",null,"Environment variables available to set static token:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"QOVERY_CLI_ACCESS_TOKEN")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"Q_CLI_ACCESS_TOKEN"))),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"export QOVERY_CLI_ACCESS_TOKEN=xxx\n\nqovery log --organization MyOrg --project MyProject --environment MyEnv --application MyApp\n# you will see the log output\n")),Object(r.b)("h2",{id:"support"},"Support"),Object(r.b)("p",null,"Do you have any issues with Qovery CLI? ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/issues"}),"Open an issue"),"."))}d.isMDXComponent=!0},464:function(e,n,t){"use strict";t(466);var a=t(0),o=t.n(a),r=t(463),l=t.n(r);t(132);n.a=function(e){var n=e.children,t=e.classNames,a=e.fill,r=e.icon,c=e.type,i=null;switch(c){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return o.a.createElement("div",{className:l()(t,"alert","alert--"+c,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:l()("feather","icon-"+(r||i))}),n)}},477:function(e,n,t){"use strict";var a=t(1),o=(t(481),t(478),t(52),t(29),t(22),t(21),t(0)),r=t.n(o),l=t(483),c=t(463),i=t.n(c),s=t(471),b=t.n(s),p=t(482),u=37,d=39;function m(e){var n=e.block,t=e.centered,a=e.changeSelectedValue,o=e.className,l=e.handleKeydown,c=e.style,s=e.values,b=e.selectedValue,p=e.tabRefs;return r.a.createElement("div",{className:t?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",o,{"tabs--block":n}),style:c},s.map((function(e){var n=e.value,t=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===n,className:i()("tab-item",{"tab-item--active":b===n}),key:n,ref:function(e){return p.push(e)},onKeyDown:function(e){return l(p,e.target,e)},onFocus:function(){return a(n)},onClick:function(){return a(n)}},t)}))))}function h(e){var n=e.placeholder,t=e.selectedValue,a=e.changeSelectedValue,o=e.size,c=e.values,i=c;if(i[0].group){var s=_.groupBy(i,"group");i=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:i,isClearable:t,placeholder:n,value:c.find((function(e){return e.value==t})),onChange:function(e){return a(e?e.value:null)}})}n.a=function(e){e.block,e.centered;var n=e.children,t=e.defaultValue,l=e.groupId,c=e.label,i=e.placeholder,s=e.select,y=e.size,O=(e.style,e.values),g=e.urlKey,j=Object(p.a)(),v=j.tabGroupChoices,f=j.setTabGroupChoices,N=Object(o.useState)(t),w=N[0],x=N[1];if(null!=l){var C=v[l];null!=C&&C!==w&&x(C)}var T=function(e){x(e),null!=l&&f(l,e)},I=[],k=function(e,n,t){switch(t.keyCode){case d:!function(e,n){var t=e.indexOf(n)+1;e[t]?e[t].focus():e[0].focus()}(e,n);break;case u:!function(e,n){var t=e.indexOf(n)-1;e[t]?e[t].focus():e[e.length-1].focus()}(e,n)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=b.a.parse(window.location.search);e[g]&&x(e[g])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(y||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),O.length>1&&(s?r.a.createElement(h,Object(a.a)({changeSelectedValue:T,handleKeydown:k,placeholder:i,selectedValue:w,size:y,tabRefs:I},e)):r.a.createElement(m,Object(a.a)({changeSelectedValue:T,handleKeydown:k,selectedValue:w,tabRefs:I},e)))),o.Children.toArray(n).filter((function(e){return e.props.value===w}))[0])}},479:function(e,n,t){"use strict";var a=t(0),o=t.n(a);n.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[264],{416:function(e,n,t){"use strict";t.r(n),t.d(n,"frontMatter",(function(){return s})),t.d(n,"metadata",(function(){return b})),t.d(n,"rightToc",(function(){return p})),t.d(n,"default",(function(){return d}));var a=t(1),o=t(9),r=(t(0),t(465)),l=t(477),c=t(478),i=t(464),s={last_modified_on:"2024-11-01",title:"CLI",description:"How to use the Qovery CLI (Command Line Interface)"},b={id:"using-qovery/interface/cli",title:"CLI",description:"How to use the Qovery CLI (Command Line Interface)",source:"@site/docs/using-qovery/interface/cli.md",permalink:"/docs/using-qovery/interface/cli",sidebar:"docs",previous:{title:"Web interface",permalink:"/docs/using-qovery/interface/web-interface"},next:{title:"REST API",permalink:"/docs/using-qovery/interface/rest-api"}},p=[{value:"First usage",id:"first-usage",children:[{value:"Install",id:"install",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Help",id:"help",children:[]}]},{value:"Context",id:"context",children:[{value:"Set New Context",id:"set-new-context",children:[]},{value:"Print Current Context",id:"print-current-context",children:[]}]},{value:"Log",id:"log",children:[{value:"Follow Logs",id:"follow-logs",children:[]}]},{value:"Status",id:"status",children:[]},{value:"Console",id:"console",children:[]},{value:"Shell",id:"shell",children:[{value:"Pass a command",id:"pass-a-command",children:[]},{value:"Shell in a dedicated pod",id:"shell-in-a-dedicated-pod",children:[]},{value:"Shell in a dedicated container",id:"shell-in-a-dedicated-container",children:[]}]},{value:"Port-forward",id:"port-forward",children:[{value:"Port-forward a dedicated pod",id:"port-forward-a-dedicated-pod",children:[]}]},{value:"Generate API token",id:"generate-api-token",children:[]},{value:"Managing services, environments and projects",id:"managing-services-environments-and-projects",children:[{value:"Environment",id:"environment",children:[]},{value:"Projects",id:"projects",children:[]}]},{value:"Access your Qovery-managed cluster",id:"access-your-qovery-managed-cluster",children:[]},{value:"Managing the Deployment Pipeline",id:"managing-the-deployment-pipeline",children:[{value:"List stages",id:"list-stages",children:[]},{value:"Add a stage",id:"add-a-stage",children:[]},{value:"Modify a stage",id:"modify-a-stage",children:[]},{value:"Delete a stage",id:"delete-a-stage",children:[]},{value:"Change stage for a service",id:"change-stage-for-a-service",children:[]}]},{value:"Static token",id:"static-token",children:[]},{value:"Support",id:"support",children:[]}],u={rightToc:p};function d(e){var n=e.components,t=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},u,t,{components:n,mdxType:"MDXLayout"}),Object(r.b)(i.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Use Infrastructure as Code (IaC) with our ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/integration/terraform-provider/"}),"Terraform Provider")," and our ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/interface/rest-api/"}),"REST API")," to manage Qovery and deploy your apps.")),Object(r.b)("p",null,"Qovery provides a very easy to use CLI (Command Line Interface) designed to fit the developer workflow perfectly."),Object(r.b)("hr",null),Object(r.b)("p",null,"The purpose of the CLI is to integrate seamlessly with your development workflow:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Write code"),Object(r.b)("li",{parentName:"ol"},"Commit"),Object(r.b)("li",{parentName:"ol"},Object(r.b)("strong",{parentName:"li"},"Qovery")," - deploy a new version of your application"),Object(r.b)("li",{parentName:"ol"},Object(r.b)("strong",{parentName:"li"},"Qovery CLI")," - check the status of your application"),Object(r.b)("li",{parentName:"ol"},Object(r.b)("strong",{parentName:"li"},"Qovery CLI")," - debug your application"),Object(r.b)("li",{parentName:"ol"},"Repeat")),Object(r.b)("h2",{id:"first-usage"},"First usage"),Object(r.b)("h3",{id:"install"},"Install"),Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(c.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),"."))),Object(r.b)("h3",{id:"sign-up"},"Sign up"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(r.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in."),Object(r.b)("h3",{id:"help"},"Help"),Object(r.b)("p",null,"You can see all the commands available by executing:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery help\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Help output"',title:'"Help','output"':!0}),'$ qovery help\nA Command-line Interface of the Qovery platform\n\nUsage:\n qovery [command]\n\nAvailable Commands:\n application Manage applications\n auth Log in to Qovery\n cluster Manage clusters\n completion Generate the autocompletion script for the specified shell\n console Opens the application in Qovery Console in your browser\n container Manage containers\n context Manage CLI context\n cronjob Manage cronjobs\n database Manage databases\n env Manage Environment Variables and Secrets\n environment Manage environments\n helm Manage helms\n help Help about any command\n lifecycle Manage lifecycle jobs\n list-pods List the pods of a service with their pods\n log Print your application logs\n port-forward Port forward a port to an application container\n project Manage Project\n service Manage services\n shell Connect to an application container\n status Print the status of your application\n token Generate an API token\n upgrade Upgrade Qovery CLI to latest version\n version Print installed version of the Qovery CLI\n\nFlags:\n -h, --help help for qovery\n --verbose Verbose output\n\nUse "qovery [command] --help" for more information about a command.\n')),Object(r.b)("h2",{id:"context"},"Context"),Object(r.b)("p",null,"Context command lets you configure the CLI to work with your chosen application. Before executing other commands, you need first to set up the context.\nThe context is then remembered and used by the CLI. You can configure a new context anytime by running the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery context set")," command."),Object(r.b)("p",null,"Most of the commands support an inline context set allowing you to directly pass the URL of the application you wants to interact with."),Object(r.b)("p",null,"Example:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell https://console.qovery.com/organization/51927012-8377-4e0f-84cf-7f5f38a0154b/project/a6545d50-69a3-4966-89cc-4c0bfb6d3448/environment/c9ac549b-a855-4d3b-b652-d68d5f1fea11/application/820ca0a3-08bf-42c1-8ad2-540714ad657f/general\n# this is the url of my back-end application\n\nOrganization | My orga\nProject | R&D / Backend\nEnvironment | prod\nServiceLevel | back-end\nServiceType | application\n\n$ ls\n...\n")),Object(r.b)("h3",{id:"set-new-context"},"Set New Context"),Object(r.b)("p",null,"To set a new context, type ",Object(r.b)("inlineCode",{parentName:"p"},"qovery context set"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery context set\nQovery: Current context:\nOrganization | Qovery\nProject | test\nEnvironment | development\nApplication | website\n\nQovery: Select new context\nOrganization:\n\u2714 Qovery\nProject:\n\u2714 admin\nEnvironment:\n\u2714 main\nApplication:\n\u2714 app\n\nQovery: New context:\nOrganization | Qovery\nProject | admin\nEnvironment | main\nApplication | app\n")),Object(r.b)("h3",{id:"print-current-context"},"Print Current Context"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery context\nQovery: Current context:\nOrganization | Qovery\nProject | admin\nEnvironment | main\nApplication | app\n\nQovery: You can set a new context using 'qovery context set'.\n")),Object(r.b)("h2",{id:"log"},"Log"),Object(r.b)("p",null,"Log command allows you to display the application logs."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery log\n TIME MESSAGE\n Jul 15 08:46:13.019717 at /usr/src/app/autoFunctions/levels.js:17:16\n Jul 15 08:46:13.019721 at Array.forEach ()\n Jul 15 08:46:13.019724 at Timeout._onTimeout (/usr/src/app/autoFunctions/levels.js:15:14)\n Jul 15 08:46:13.019728 at listOnTimeout (internal/timers.js:557:17)\n # ... the rest of logs\n")),Object(r.b)("p",null,"By default, the last 1000 logs is displayed."),Object(r.b)("h3",{id:"follow-logs"},"Follow Logs"),Object(r.b)("p",null,"To make the CLI follow your logs, use ",Object(r.b)("inlineCode",{parentName:"p"},"-f")," flag:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery log -f\n TIME MESSAGE\n Jul 15 08:46:13.019717 at /usr/src/app/autoFunctions/levels.js:17:16\n Jul 15 08:46:13.019721 at Array.forEach ()\n Jul 15 08:46:13.019724 at Timeout._onTimeout (/usr/src/app/autoFunctions/levels.js:15:14)\n Jul 15 08:46:13.019728 at listOnTimeout (internal/timers.js:557:17)\n # ... the rest of logs\n")),Object(r.b)("p",null,"This will make the CLI follow your application logs and append any new logs till you use ",Object(r.b)("inlineCode",{parentName:"p"},"CTRL+C"),"."),Object(r.b)("h2",{id:"status"},"Status"),Object(r.b)("p",null,"Status command lets you print the basic status of your application."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery status\n15 Jul 21 10:55 CEST\nApplication | Backend\nStatus | RUNNING\n")),Object(r.b)("h2",{id:"console"},"Console"),Object(r.b)("p",null,"Console command quickly opens the Qovery Console in your browser to let you display more information about your application."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery console\nQovery: Opening https://console.qovery.com/platform/organization/your-org/projects/your-proj/environments/your-env/applications/your-app/summary\n")),Object(r.b)("h2",{id:"shell"},"Shell"),Object(r.b)("p",null,"Shell command allows you to open a connection and execute commands directly on the container running application."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell\n/ # ls\nbin media srv\ndev mnt sys\ndocker-entrypoint.d opt tmp\ndocker-entrypoint.sh proc usr\netc root var\nhome run www\nlib sbin\n")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},"Keep in mind these limitations when using this feature:",Object(r.b)("ul",null,Object(r.b)("li",null,"Install a process reaper as pid one in your container (i.e: dumb-init), as you may leave zoombie process in your container if your shell terminate unproperly (i.e: ctrl+c, cnx restart). This is a known issue with kubernetes exec to leave process alive after attach is closed;"),Object(r.b)("li",null,"shell is force closed after [1 hour, 1GB transmitted];"),Object(r.b)("li",null,"we use SH by default. To have auto-completion, start bash."))),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},"The width of the terminal is limited to 80 characters. But you can resize it once you are inside the application with one of these commands:",Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"COLUMNS=200 tput init\nstty cols 200\n"))),Object(r.b)("h3",{id:"pass-a-command"},"Pass a command"),Object(r.b)("p",null,"To pass a command, you can use the ",Object(r.b)("inlineCode",{parentName:"p"},"--command")," or ",Object(r.b)("inlineCode",{parentName:"p"},"-c")," argument followed by your command."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --command ls\nbin media srv\ndev mnt sys\ndocker-entrypoint.d opt tmp\ndocker-entrypoint.sh proc usr\netc root var\nhome run www\nlib sbin\n")),Object(r.b)("p",null,"To pass several arguments, you can separate them with a comma or send different ",Object(r.b)("inlineCode",{parentName:"p"},"--command"),"."),Object(r.b)("p",null,Object(r.b)("inlineCode",{parentName:"p"},"qovery shell --command ls --command -l"),"\n",Object(r.b)("inlineCode",{parentName:"p"},"qovery shell --command ls,-l"),"\n",Object(r.b)("inlineCode",{parentName:"p"},"qovery shell -c ls,-l")),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --command ls --command -l\ndrwxr-xr-x 2 root root 4096 Nov 30 09:32 bin\ndrwxr-xr-x 5 root root 360 Dec 21 09:46 dev\ndrwxr-xr-x 1 root root 41 Dec 20 20:13 docker-entrypoint.d\n-rwxr-xr-x 1 root root 1620 Dec 20 20:13 docker-entrypoint.sh\ndrwxr-xr-x 1 root root 25 Dec 21 09:46 etc\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 home\ndrwxr-xr-x 1 root root 61 Dec 20 22:11 lib\ndrwxr-xr-x 5 root root 44 Nov 30 09:32 media\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 mnt\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 opt\ndr-xr-xr-x 209 root root 0 Dec 21 09:46 proc\ndrwx------ 1 root root 26 Dec 21 10:38 root\ndrwxr-xr-x 1 root root 23 Dec 21 09:46 run\ndrwxr-xr-x 2 root root 4096 Nov 30 09:32 sbin\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 srv\ndr-xr-xr-x 13 root root 0 Dec 21 09:46 sys\ndrwxrwxrwt 2 root root 6 Nov 30 09:32 tmp\ndrwxr-xr-x 1 root root 66 Nov 30 09:32 usr\ndrwxr-xr-x 1 root root 19 Nov 30 09:32 var\ndrwxr-xr-x 2 root root 59 Dec 21 09:45 www\n")),Object(r.b)("h3",{id:"shell-in-a-dedicated-pod"},"Shell in a dedicated pod"),Object(r.b)("p",null,"If your application is running on several pods, you can shell directly in a dedicated one by using the ",Object(r.b)("inlineCode",{parentName:"p"},"--pod")," or ",Object(r.b)("inlineCode",{parentName:"p"},"-p")," argument followed by your pod name."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --pod app-5f65fb5c4-frontend-5f65db5c4b-q4w11\n")),Object(r.b)("p",null,"NOTE: you can get the list of pods by running the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery list-pods")," command."),Object(r.b)("h3",{id:"shell-in-a-dedicated-container"},"Shell in a dedicated container"),Object(r.b)("p",null,"If you have several containers in your pod, you can shell directly in a dedicated one by using the ",Object(r.b)("inlineCode",{parentName:"p"},"--container")," argument followed by your container name."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --container app-5f65fb5c4-frontend\n")),Object(r.b)("h2",{id:"port-forward"},"Port-forward"),Object(r.b)("p",null,"Port-forward command allows you to port-forward all the traffic on your local machine to a remote resource available on a Qovery environment. This mechanism allows developers to create a secure, encrypted tunnel from their local machine to the application or databases hosted in the cloud. "),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'$ qovery port-forward -p 8000:80 #your_local_port:your_remote_port\nInfo: Current context:\nOrganization | Qovery Prod\nProject | R&D / Frontend\nEnvironment | prod\nService | console\nType | application\n\nInfo: Continue with port-forward command using this context ?\nPlease type "yes" to validate context: yes\n\nListening on 127.0.0.1:8000 => 80\n')),Object(r.b)("p",null,"The port-forward feature works with any ",Object(r.b)("inlineCode",{parentName:"p"},"application"),", ",Object(r.b)("inlineCode",{parentName:"p"},"Cronjob"),", ",Object(r.b)("inlineCode",{parentName:"p"},"Lifecycle job")," or ",Object(r.b)("inlineCode",{parentName:"p"},"database")," (Container or Managed) deployed with Qovery. For ",Object(r.b)("inlineCode",{parentName:"p"},"Managed database")," instances on AWS, once the port-forwarded is activated, you must specify ~ ",Object(r.b)("inlineCode",{parentName:"p"},"--tls")," and ",Object(r.b)("inlineCode",{parentName:"p"},"--tls-insecure")," in your database connection command since localhost is not the valid hostname."),Object(r.b)("h3",{id:"port-forward-a-dedicated-pod"},"Port-forward a dedicated pod"),Object(r.b)("p",null,"If your application is running on several pods, you can port-forward to a dedicated one by using the ",Object(r.b)("inlineCode",{parentName:"p"},"--pod")," argument followed by your pod name."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery port-forward -p 8000:80 -pod app-5f65fb5c4-frontend-5f65db5c4b-q4w11\n")),Object(r.b)("p",null,"NOTE: you can get the list of pods by running the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery list-pods")," command."),Object(r.b)("h2",{id:"generate-api-token"},"Generate API token"),Object(r.b)("p",null,"To use the Qovery API you will need to generate an authentication token. To generate an API token you can install the CLI and type"),Object(r.b)(i.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Never share your API token with anyone.")),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery token\n\nQovery: Select organization\nOrganization:\n\u2714 My Organization\nChoose a token name\nToken name: Romaric\nChoose a token description\nToken description: used for Github Actions\nQovery: ---- Never share this authentication token and keep it secure ----\nQovery: qov_4LnEg2wFxxxxxHObGSQ22rjBZZyyyySgyR6Y_2500882691\nQovery: ---- Never share this authentication token and keep it secure ----\n")),Object(r.b)("p",null,"To use your token and list your organizations."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-shell"}),"curl -X GET -H 'Authorization: Token qov_4LnEg2wFxxxxxHObGSQ22rjBZZyyyySgyR6Y_2500882691' https://api.qovery.com/organization\n")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The token can be used to interact programmatically with our API (directly, via our Terraform Provider etc..).\nIf you get a 424 error while trying to create new applications from one of your git repository, please make sure that the Organization Owner has access to the repository you are configuring for your app.")),Object(r.b)("p",null,"Check out our ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://api-doc.qovery.com"}),"API documentation")),Object(r.b)("h2",{id:"managing-services-environments-and-projects"},"Managing services, environments and projects"),Object(r.b)("p",null,"The CLI allows you to manage and deploy the environment and services within your organization"),Object(r.b)("p",null,"###\xa0application, container, lifecycle, cronjob\nThese commands allow you to manage all these services via the CLI. You can run the following actions on these services:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"cancel: Cancel the service deployment"),Object(r.b)("li",{parentName:"ul"},"delete: Delete a service"),Object(r.b)("li",{parentName:"ul"},"deploy: Deploy a service"),Object(r.b)("li",{parentName:"ul"},"list: List the service of the specified type"),Object(r.b)("li",{parentName:"ul"},"redeploy: Redeploy a service (already deployed before)"),Object(r.b)("li",{parentName:"ul"},"stop: Stop a service"),Object(r.b)("li",{parentName:"ul"},"update: Update a service (service name, git branch, auto-deploy, ...)")),Object(r.b)("p",null,"Each action allows you to specify additional parameters to define the service you want to modify (you can find them via the --help command) "),Object(r.b)("p",null,"Example: Listing applications and triggering a deployment"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'$ qovery application list\nName | Type | Status | Last Update \nbackend | Application | STOPPED | 2023-02-02 14:48:05.339652 +0000 UTC\nfront-end | Application | STOPPED | 2023-02-09 14:04:38.079792 +0000 UTC\n\n$ qovery application deploy -n "backend"\nDeploying application backend in progress..\n\n$ qovery application list\nName | Type | Status | Last Update \nbackend | Application | RUNNING | 2023-02-13 12:59:23.228231 +0000 UTC\nfront-end | Application | STOPPED | 2023-02-09 14:04:38.079792 +0000 UTC\n')),Object(r.b)("p",null,"Example: Enable the auto-deploy feature for an application"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery application update --application backend --auto-deploy true\nApplication backend updated!\n")),Object(r.b)("h3",{id:"environment"},"Environment"),Object(r.b)("p",null,"The command ",Object(r.b)("inlineCode",{parentName:"p"},"environment")," allow you to manage a specific environment via the CLI. You can run the following actions on environments:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"cancel: Cancel an environment deployment"),Object(r.b)("li",{parentName:"ul"},"clone: Clone an environment"),Object(r.b)("li",{parentName:"ul"},"delete: Delete an environment"),Object(r.b)("li",{parentName:"ul"},"deploy: Deploy an environment"),Object(r.b)("li",{parentName:"ul"},"list: List environments"),Object(r.b)("li",{parentName:"ul"},"redeploy: Redeploy an environment"),Object(r.b)("li",{parentName:"ul"},"stage: Manage deployment stages"),Object(r.b)("li",{parentName:"ul"},"stop: Stop an environment")),Object(r.b)("p",null,"Each action allows you to specify additional parameters to define the service you want to modify (you can find them via the --help command)"),Object(r.b)("p",null,"Example: Manage deployment stages and triggering deployment"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'~ $ qovery environment stage list\n\n# deployment stage 1: "DATABASE DEFAULT"\nRename me to avoid default/legacy ordering\n\nType | Name\nDATABASE | Redis\nDATABASE | DB\n\n\n# deployment stage 2: "JOB DEFAULT"\nRename me to avoid default/legacy ordering\n\n\n\n\n# deployment stage 3: "CONTAINER DEFAULT"\nRename me to avoid default/legacy ordering\n\nType | Name\nCONTAINER | Rabbitmq\n\n\n# deployment stage 4: "APPLICATION DEFAULT"\nRename me to avoid default/legacy ordering\n\nType | Name\nAPPLICATION | Backend\nAPPLICATION | Frontend\nAPPLICATION | Pablo Backend App\nAPPLICATION | API gateway\n\n~ $ qovery environment deploy\nEnvironment is deploying!\n')),Object(r.b)("h3",{id:"projects"},"Projects"),Object(r.b)("p",null,"You can list the organization's projects by using the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery project list\n")),Object(r.b)("h2",{id:"access-your-qovery-managed-cluster"},"Access your Qovery-managed cluster"),Object(r.b)("p",null,"To access your Qovery managed cluster, follow these steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},Object(r.b)("strong",{parentName:"li"},"Export your kubeconfig file")," by running the command below, replacing ",Object(r.b)("inlineCode",{parentName:"li"},"")," with your actual cluster ID:")),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery cluster kubeconfig --cluster-id \n")),Object(r.b)("ol",{start:2},Object(r.b)("li",{parentName:"ol"},Object(r.b)("strong",{parentName:"li"},"Set the KUBECONFIG environment variable")," to the path of the kubeconfig file obtained from the previous command:")),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"export KUBECONFIG=\n")),Object(r.b)("ol",{start:3},Object(r.b)("li",{parentName:"ol"},"You can now use tools like ",Object(r.b)("inlineCode",{parentName:"li"},"k9s")," or ",Object(r.b)("inlineCode",{parentName:"li"},"kubectl")," to access and manage your cluster:")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Some cloud providers like GCP or AWS require additional configuration to access the cluster. Make sure you have CLI binaries installed (gcloud CLI/AWS CLI/...), and the right permissions and credentials set up (environment variables or profile file).")),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Using k9s")),Object(r.b)("p",null,"Launch the k9s terminal UI to interact with your Kubernetes cluster:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"k9s\n")),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Using kubectl")),Object(r.b)("p",null,"Here are a few examples of common kubectl commands:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"kubectl get pods #List all pods in the default namespace\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"kubectl describe pod #Get detailed information about a specific pod\n")),Object(r.b)("h2",{id:"managing-the-deployment-pipeline"},"Managing the Deployment Pipeline"),Object(r.b)("p",null,"In the following sections we will describe how to modify the Deployment Pipeline. "),Object(r.b)("h3",{id:"list-stages"},"List stages"),Object(r.b)("p",null,"You can list all the stages of your environment by using the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage list\n")),Object(r.b)("h3",{id:"add-a-stage"},"Add a stage"),Object(r.b)("p",null,"You can add a new stage by using the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage create -n -d \n")),Object(r.b)("p",null,"Note that the stage will be added at the end of the pipeline (the highest number)"),Object(r.b)("h3",{id:"modify-a-stage"},"Modify a stage"),Object(r.b)("p",null,"You can modify a stage by using the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage edit -n --new-name --new-description \n")),Object(r.b)("h3",{id:"delete-a-stage"},"Delete a stage"),Object(r.b)("p",null,"You can modify a stage by using the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage delete -n \n")),Object(r.b)("h3",{id:"change-stage-for-a-service"},"Change stage for a service"),Object(r.b)("p",null,"You can modify the stage associated to a service by using the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage move -n --stage \n")),Object(r.b)("h2",{id:"static-token"},"Static token"),Object(r.b)("p",null,"You can use a static token to authenticate to Qovery CLI. Which is useful for CI/CD pipelines."),Object(r.b)("p",null,"Environment variables available to set static token:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"QOVERY_CLI_ACCESS_TOKEN")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"Q_CLI_ACCESS_TOKEN"))),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"export QOVERY_CLI_ACCESS_TOKEN=xxx\n\nqovery log --organization MyOrg --project MyProject --environment MyEnv --application MyApp\n# you will see the log output\n")),Object(r.b)("h2",{id:"support"},"Support"),Object(r.b)("p",null,"Do you have any issues with Qovery CLI? ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/issues"}),"Open an issue"),"."))}d.isMDXComponent=!0},464:function(e,n,t){"use strict";t(466);var a=t(0),o=t.n(a),r=t(463),l=t.n(r);t(132);n.a=function(e){var n=e.children,t=e.classNames,a=e.fill,r=e.icon,c=e.type,i=null;switch(c){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return o.a.createElement("div",{className:l()(t,"alert","alert--"+c,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:l()("feather","icon-"+(r||i))}),n)}},477:function(e,n,t){"use strict";var a=t(1),o=(t(480),t(479),t(52),t(29),t(22),t(21),t(0)),r=t.n(o),l=t(483),c=t(463),i=t.n(c),s=t(471),b=t.n(s),p=t(482),u=37,d=39;function m(e){var n=e.block,t=e.centered,a=e.changeSelectedValue,o=e.className,l=e.handleKeydown,c=e.style,s=e.values,b=e.selectedValue,p=e.tabRefs;return r.a.createElement("div",{className:t?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",o,{"tabs--block":n}),style:c},s.map((function(e){var n=e.value,t=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===n,className:i()("tab-item",{"tab-item--active":b===n}),key:n,ref:function(e){return p.push(e)},onKeyDown:function(e){return l(p,e.target,e)},onFocus:function(){return a(n)},onClick:function(){return a(n)}},t)}))))}function h(e){var n=e.placeholder,t=e.selectedValue,a=e.changeSelectedValue,o=e.size,c=e.values,i=c;if(i[0].group){var s=_.groupBy(i,"group");i=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:i,isClearable:t,placeholder:n,value:c.find((function(e){return e.value==t})),onChange:function(e){return a(e?e.value:null)}})}n.a=function(e){e.block,e.centered;var n=e.children,t=e.defaultValue,l=e.groupId,c=e.label,i=e.placeholder,s=e.select,y=e.size,O=(e.style,e.values),g=e.urlKey,j=Object(p.a)(),v=j.tabGroupChoices,f=j.setTabGroupChoices,N=Object(o.useState)(t),w=N[0],x=N[1];if(null!=l){var C=v[l];null!=C&&C!==w&&x(C)}var T=function(e){x(e),null!=l&&f(l,e)},I=[],k=function(e,n,t){switch(t.keyCode){case d:!function(e,n){var t=e.indexOf(n)+1;e[t]?e[t].focus():e[0].focus()}(e,n);break;case u:!function(e,n){var t=e.indexOf(n)-1;e[t]?e[t].focus():e[e.length-1].focus()}(e,n)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=b.a.parse(window.location.search);e[g]&&x(e[g])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(y||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),O.length>1&&(s?r.a.createElement(h,Object(a.a)({changeSelectedValue:T,handleKeydown:k,placeholder:i,selectedValue:w,size:y,tabRefs:I},e)):r.a.createElement(m,Object(a.a)({changeSelectedValue:T,handleKeydown:k,selectedValue:w,tabRefs:I},e)))),o.Children.toArray(n).filter((function(e){return e.props.value===w}))[0])}},478:function(e,n,t){"use strict";var a=t(0),o=t.n(a);n.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/d9deea5f.21ad6736.js b/d9deea5f.ec3d210e.js similarity index 99% rename from d9deea5f.21ad6736.js rename to d9deea5f.ec3d210e.js index 0ff7e4e2a7..016321aeae 100644 --- a/d9deea5f.21ad6736.js +++ b/d9deea5f.ec3d210e.js @@ -1,2 +1,2 @@ -/*! For license information please see d9deea5f.21ad6736.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[265],{417:function(n,t,e){"use strict";e.r(t);var r=e(0),u=e.n(r),i=e(487),a=e(556),o=e(470);t.default=function(n){var t=n.metadata.category,e=n.items;return u.a.createElement(i.a,{title:t.title+" Guides",description:"All "+t.title+" guides"},u.a.createElement("header",{className:"hero hero--clean"},u.a.createElement("div",{className:"container"},u.a.createElement("h1",null,t.title," Guides"),t.description&&u.a.createElement("div",{className:"hero--subtitle"},t.description),u.a.createElement("div",null,u.a.createElement(o.a,{to:"/guides"},"View All Guides")))),u.a.createElement("main",{className:"container container--s"},u.a.createElement(a.a,{items:e,staggered:null!=e[0].content.metadata.seriesPosition})))}},463:function(n,t,e){var r;!function(){"use strict";var e={}.hasOwnProperty;function u(){for(var n=[],t=0;t1?arguments[1]:void 0)}}),e(74)("find")},487:function(n,t,e){"use strict";e(497);var r=e(0),u=e.n(r),i=e(498),a=e(486),o=e(1),c=(e(488),e(489),e(499),e(470)),l=e(500),f=e(484),s=e.n(f),v=e(501),h=e.n(v),d=e(476),p=e(463),g=e.n(p),D=e(135),_=e.n(D),m=function(){return u.a.createElement("span",{className:g()(_.a.toggle,_.a.moon)})},y=function(){return u.a.createElement("span",{className:g()(_.a.toggle,_.a.sun)})},b=function(n){var t=Object(d.a)().isClient;return u.a.createElement(h.a,Object(o.a)({disabled:!t,icons:{checked:u.a.createElement(m,null),unchecked:u.a.createElement(y,null)}},n))};function E(){var n=Object(d.a)().siteConfig,t=(void 0===n?{}:n).customFields.metadata.latest_post,e=Date.parse(t.date),r=new Date,u=Math.abs(r-e),i=Math.ceil(u/864e5),a=null;return"undefined"!=typeof window&&(a=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!a||a0&&u.a.createElement("div",{className:"row footer__links"},u.a.createElement("div",{className:"col col--5 footer__col"},u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement(s.a,{className:"navbar__logo",src:h,alt:"Qovery",width:"150",height:"auto"})),u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),u.a.createElement("div",null,u.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},u.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},u.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},u.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),c.map((function(n,t){return u.a.createElement("div",{key:t,className:"col footer__col"},null!=n.title?u.a.createElement("h4",{className:"footer__title"},n.title):null,null!=n.items&&Array.isArray(n.items)&&n.items.length>0?u.a.createElement("ul",{className:"footer__items"},n.items.map((function(n,t){return n.html?u.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):u.a.createElement("li",{key:n.href||n.to,className:"footer__item"},u.a.createElement(z,n))}))):null)}))),(f||a)&&u.a.createElement("div",{className:"text--center"},f&&f.src&&u.a.createElement("div",{className:"margin-bottom--sm"},f.href?u.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:L.a.footerLogoLink},u.a.createElement(R,{alt:f.alt,url:v})):u.a.createElement(R,{alt:f.alt,url:v})),u.a.createElement("small",null,a),u.a.createElement("br",null))))},W=e(502),M=e(503),U=e(3);e(138);t.a=function(n){var t=Object(d.a)().siteConfig,e=void 0===t?{}:t,r=e.title,o=e.themeConfig.image,c=e.url,l=n.children,f=n.title,s=n.noFooter,v=n.description,h=n.image,p=n.keywords,g=n.version,D=f?f+" | "+r:r,_=h||o,m=c+Object(F.a)(_),y=Object(U.h)(),b=y?"https://docs.qovery.com"+(y.pathname.endsWith("/")?y.pathname:y.pathname+"/"):null;return u.a.createElement(M.a,null,u.a.createElement(W.a,null,u.a.createElement(a.a,null,u.a.createElement("html",{lang:"en"}),u.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),D&&u.a.createElement("title",null,D),D&&u.a.createElement("meta",{property:"og:title",content:D}),u.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),u.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),u.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),u.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),u.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),u.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),u.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),u.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),v&&u.a.createElement("meta",{name:"description",content:v}),v&&u.a.createElement("meta",{property:"og:description",content:v}),g&&u.a.createElement("meta",{name:"docsearch:version",content:g}),p&&p.length&&u.a.createElement("meta",{name:"keywords",content:p.join(",")}),_&&u.a.createElement("meta",{property:"og:image",content:m}),_&&u.a.createElement("meta",{property:"twitter:image",content:m}),_&&u.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+D}),b&&u.a.createElement("meta",{property:"og:url",content:b}),u.a.createElement("meta",{name:"twitter:card",content:"summary"}),b&&u.a.createElement("link",{rel:"canonical",href:b})),u.a.createElement(i.a,null),u.a.createElement(B,null),u.a.createElement("div",{className:"main-wrapper"},l),!s&&u.a.createElement(T,null)))}},490:function(n,t,e){"use strict";var r=e(9),u=e(0),i=e.n(u),a=e(463),o=e.n(a),c=e(476),l=(e(139),e(140)),f=e.n(l);t.a=function(n){return function(t){var e,u=t.id,a=Object(r.a)(t,["id"]),l=Object(c.a)().siteConfig,s=(l=void 0===l?{}:l).themeConfig,v=(s=void 0===s?{}:s).navbar,h=(v=void 0===v?{}:v).hideOnScroll,d=void 0!==h&&h;return u?i.a.createElement(n,a,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:o()("anchor",(e={},e[f.a.enhancedAnchor]=!d,e)),id:u}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+u,title:"Direct link to heading"},"#"),a.children):i.a.createElement(n,a)}}},491:function(n,t,e){(function(n,r){var u;(function(){var i="Expected a function",a="__lodash_placeholder__",o=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",f="[object Boolean]",s="[object Date]",v="[object Error]",h="[object Function]",d="[object GeneratorFunction]",p="[object Map]",g="[object Number]",D="[object Object]",_="[object RegExp]",m="[object Set]",y="[object String]",b="[object Symbol]",E="[object WeakMap]",w="[object ArrayBuffer]",F="[object DataView]",C="[object Float32Array]",k="[object Float64Array]",x="[object Int8Array]",A="[object Int16Array]",j="[object Int32Array]",O="[object Uint8Array]",N="[object Uint16Array]",B="[object Uint32Array]",I=/\b__p \+= '';/g,S=/\b(__p \+=) '' \+/g,L=/(__e\(.*?\)|\b__t\)) \+\n'';/g,z=/&(?:amp|lt|gt|quot|#39);/g,R=/[&<>"']/g,T=RegExp(z.source),W=RegExp(R.source),M=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,P=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,q=/^\w*$/,G=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,V=/[\\^$.*+?()[\]{}|]/g,Z=RegExp(V.source),H=/^\s+|\s+$/g,K=/^\s+/,J=/\s+$/,Q=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,nn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,tn=/\\(\\)?/g,en=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,rn=/\w*$/,un=/^[-+]0x[0-9a-f]+$/i,an=/^0b[01]+$/i,on=/^\[object .+?Constructor\]$/,cn=/^0o[0-7]+$/i,ln=/^(?:0|[1-9]\d*)$/,fn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,sn=/($^)/,vn=/['\n\r\u2028\u2029\\]/g,hn="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",dn="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",pn="[\\ud800-\\udfff]",gn="["+dn+"]",Dn="["+hn+"]",_n="\\d+",mn="[\\u2700-\\u27bf]",yn="[a-z\\xdf-\\xf6\\xf8-\\xff]",bn="[^\\ud800-\\udfff"+dn+_n+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",En="\\ud83c[\\udffb-\\udfff]",wn="[^\\ud800-\\udfff]",Fn="(?:\\ud83c[\\udde6-\\uddff]){2}",Cn="[\\ud800-\\udbff][\\udc00-\\udfff]",kn="[A-Z\\xc0-\\xd6\\xd8-\\xde]",xn="(?:"+yn+"|"+bn+")",An="(?:"+kn+"|"+bn+")",jn="(?:"+Dn+"|"+En+")"+"?",On="[\\ufe0e\\ufe0f]?"+jn+("(?:\\u200d(?:"+[wn,Fn,Cn].join("|")+")[\\ufe0e\\ufe0f]?"+jn+")*"),Nn="(?:"+[mn,Fn,Cn].join("|")+")"+On,Bn="(?:"+[wn+Dn+"?",Dn,Fn,Cn,pn].join("|")+")",In=RegExp("['\u2019]","g"),Sn=RegExp(Dn,"g"),Ln=RegExp(En+"(?="+En+")|"+Bn+On,"g"),zn=RegExp([kn+"?"+yn+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[gn,kn,"$"].join("|")+")",An+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[gn,kn+xn,"$"].join("|")+")",kn+"?"+xn+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",kn+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",_n,Nn].join("|"),"g"),Rn=RegExp("[\\u200d\\ud800-\\udfff"+hn+"\\ufe0e\\ufe0f]"),Tn=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Mn=-1,Un={};Un[C]=Un[k]=Un[x]=Un[A]=Un[j]=Un[O]=Un["[object Uint8ClampedArray]"]=Un[N]=Un[B]=!0,Un[c]=Un[l]=Un[w]=Un[f]=Un[F]=Un[s]=Un[v]=Un[h]=Un[p]=Un[g]=Un[D]=Un[_]=Un[m]=Un[y]=Un[E]=!1;var Pn={};Pn[c]=Pn[l]=Pn[w]=Pn[F]=Pn[f]=Pn[s]=Pn[C]=Pn[k]=Pn[x]=Pn[A]=Pn[j]=Pn[p]=Pn[g]=Pn[D]=Pn[_]=Pn[m]=Pn[y]=Pn[b]=Pn[O]=Pn["[object Uint8ClampedArray]"]=Pn[N]=Pn[B]=!0,Pn[v]=Pn[h]=Pn[E]=!1;var $n={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},qn=parseFloat,Gn=parseInt,Vn="object"==typeof n&&n&&n.Object===Object&&n,Zn="object"==typeof self&&self&&self.Object===Object&&self,Hn=Vn||Zn||Function("return this")(),Kn=t&&!t.nodeType&&t,Jn=Kn&&"object"==typeof r&&r&&!r.nodeType&&r,Qn=Jn&&Jn.exports===Kn,Yn=Qn&&Vn.process,Xn=function(){try{var n=Jn&&Jn.require&&Jn.require("util").types;return n||Yn&&Yn.binding&&Yn.binding("util")}catch(t){}}(),nt=Xn&&Xn.isArrayBuffer,tt=Xn&&Xn.isDate,et=Xn&&Xn.isMap,rt=Xn&&Xn.isRegExp,ut=Xn&&Xn.isSet,it=Xn&&Xn.isTypedArray;function at(n,t,e){switch(e.length){case 0:return n.call(t);case 1:return n.call(t,e[0]);case 2:return n.call(t,e[0],e[1]);case 3:return n.call(t,e[0],e[1],e[2])}return n.apply(t,e)}function ot(n,t,e,r){for(var u=-1,i=null==n?0:n.length;++u-1}function ht(n,t,e){for(var r=-1,u=null==n?0:n.length;++r-1;);return e}function Lt(n,t){for(var e=n.length;e--&&Et(t,n[e],0)>-1;);return e}function zt(n,t){for(var e=n.length,r=0;e--;)n[e]===t&&++r;return r}var Rt=xt({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Tt=xt({"&":"&","<":"<",">":">",'"':""","'":"'"});function Wt(n){return"\\"+$n[n]}function Mt(n){return Rn.test(n)}function Ut(n){var t=-1,e=Array(n.size);return n.forEach((function(n,r){e[++t]=[r,n]})),e}function Pt(n,t){return function(e){return n(t(e))}}function $t(n,t){for(var e=-1,r=n.length,u=0,i=[];++e",""":'"',"'":"'"});var Kt=function n(t){var e,r=(t=null==t?Hn:Kt.defaults(Hn.Object(),t,Kt.pick(Hn,Wn))).Array,u=t.Date,hn=t.Error,dn=t.Function,pn=t.Math,gn=t.Object,Dn=t.RegExp,_n=t.String,mn=t.TypeError,yn=r.prototype,bn=dn.prototype,En=gn.prototype,wn=t["__core-js_shared__"],Fn=bn.toString,Cn=En.hasOwnProperty,kn=0,xn=(e=/[^.]+$/.exec(wn&&wn.keys&&wn.keys.IE_PROTO||""))?"Symbol(src)_1."+e:"",An=En.toString,jn=Fn.call(gn),On=Hn._,Nn=Dn("^"+Fn.call(Cn).replace(V,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Bn=Qn?t.Buffer:void 0,Ln=t.Symbol,Rn=t.Uint8Array,$n=Bn?Bn.allocUnsafe:void 0,Vn=Pt(gn.getPrototypeOf,gn),Zn=gn.create,Kn=En.propertyIsEnumerable,Jn=yn.splice,Yn=Ln?Ln.isConcatSpreadable:void 0,Xn=Ln?Ln.iterator:void 0,mt=Ln?Ln.toStringTag:void 0,xt=function(){try{var n=Xu(gn,"defineProperty");return n({},"",{}),n}catch(t){}}(),Jt=t.clearTimeout!==Hn.clearTimeout&&t.clearTimeout,Qt=u&&u.now!==Hn.Date.now&&u.now,Yt=t.setTimeout!==Hn.setTimeout&&t.setTimeout,Xt=pn.ceil,ne=pn.floor,te=gn.getOwnPropertySymbols,ee=Bn?Bn.isBuffer:void 0,re=t.isFinite,ue=yn.join,ie=Pt(gn.keys,gn),ae=pn.max,oe=pn.min,ce=u.now,le=t.parseInt,fe=pn.random,se=yn.reverse,ve=Xu(t,"DataView"),he=Xu(t,"Map"),de=Xu(t,"Promise"),pe=Xu(t,"Set"),ge=Xu(t,"WeakMap"),De=Xu(gn,"create"),_e=ge&&new ge,me={},ye=ki(ve),be=ki(he),Ee=ki(de),we=ki(pe),Fe=ki(ge),Ce=Ln?Ln.prototype:void 0,ke=Ce?Ce.valueOf:void 0,xe=Ce?Ce.toString:void 0;function Ae(n){if($a(n)&&!Ba(n)&&!(n instanceof Be)){if(n instanceof Ne)return n;if(Cn.call(n,"__wrapped__"))return xi(n)}return new Ne(n)}var je=function(){function n(){}return function(t){if(!Pa(t))return{};if(Zn)return Zn(t);n.prototype=t;var e=new n;return n.prototype=void 0,e}}();function Oe(){}function Ne(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Be(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Ie(n){var t=-1,e=null==n?0:n.length;for(this.clear();++t=t?n:t)),n}function Je(n,t,e,r,u,i){var a,o=1&t,l=2&t,v=4&t;if(e&&(a=u?e(n,r,u,i):e(n)),void 0!==a)return a;if(!Pa(n))return n;var E=Ba(n);if(E){if(a=function(n){var t=n.length,e=new n.constructor(t);t&&"string"==typeof n[0]&&Cn.call(n,"index")&&(e.index=n.index,e.input=n.input);return e}(n),!o)return Du(n,a)}else{var I=ei(n),S=I==h||I==d;if(za(n))return su(n,o);if(I==D||I==c||S&&!u){if(a=l||S?{}:ui(n),!o)return l?function(n,t){return _u(n,ti(n),t)}(n,function(n,t){return n&&_u(t,bo(t),n)}(a,n)):function(n,t){return _u(n,ni(n),t)}(n,Ve(a,n))}else{if(!Pn[I])return u?n:{};a=function(n,t,e){var r=n.constructor;switch(t){case w:return vu(n);case f:case s:return new r(+n);case F:return function(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.byteLength)}(n,e);case C:case k:case x:case A:case j:case O:case"[object Uint8ClampedArray]":case N:case B:return hu(n,e);case p:return new r;case g:case y:return new r(n);case _:return function(n){var t=new n.constructor(n.source,rn.exec(n));return t.lastIndex=n.lastIndex,t}(n);case m:return new r;case b:return u=n,ke?gn(ke.call(u)):{}}var u}(n,I,o)}}i||(i=new Re);var L=i.get(n);if(L)return L;i.set(n,a),Ha(n)?n.forEach((function(r){a.add(Je(r,t,e,r,n,i))})):qa(n)&&n.forEach((function(r,u){a.set(u,Je(r,t,e,u,n,i))}));var z=E?void 0:(v?l?Vu:Gu:l?bo:yo)(n);return ct(z||n,(function(r,u){z&&(r=n[u=r]),$e(a,u,Je(r,t,e,u,n,i))})),a}function Qe(n,t,e){var r=e.length;if(null==n)return!r;for(n=gn(n);r--;){var u=e[r],i=t[u],a=n[u];if(void 0===a&&!(u in n)||!i(a))return!1}return!0}function Ye(n,t,e){if("function"!=typeof n)throw new mn(i);return mi((function(){n.apply(void 0,e)}),t)}function Xe(n,t,e,r){var u=-1,i=vt,a=!0,o=n.length,c=[],l=t.length;if(!o)return c;e&&(t=dt(t,Nt(e))),r?(i=ht,a=!1):t.length>=200&&(i=It,a=!1,t=new ze(t));n:for(;++u-1},Se.prototype.set=function(n,t){var e=this.__data__,r=qe(e,n);return r<0?(++this.size,e.push([n,t])):e[r][1]=t,this},Le.prototype.clear=function(){this.size=0,this.__data__={hash:new Ie,map:new(he||Se),string:new Ie}},Le.prototype.delete=function(n){var t=Qu(this,n).delete(n);return this.size-=t?1:0,t},Le.prototype.get=function(n){return Qu(this,n).get(n)},Le.prototype.has=function(n){return Qu(this,n).has(n)},Le.prototype.set=function(n,t){var e=Qu(this,n),r=e.size;return e.set(n,t),this.size+=e.size==r?0:1,this},ze.prototype.add=ze.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},ze.prototype.has=function(n){return this.__data__.has(n)},Re.prototype.clear=function(){this.__data__=new Se,this.size=0},Re.prototype.delete=function(n){var t=this.__data__,e=t.delete(n);return this.size=t.size,e},Re.prototype.get=function(n){return this.__data__.get(n)},Re.prototype.has=function(n){return this.__data__.has(n)},Re.prototype.set=function(n,t){var e=this.__data__;if(e instanceof Se){var r=e.__data__;if(!he||r.length<199)return r.push([n,t]),this.size=++e.size,this;e=this.__data__=new Le(r)}return e.set(n,t),this.size=e.size,this};var nr=bu(cr),tr=bu(lr,!0);function er(n,t){var e=!0;return nr(n,(function(n,r,u){return e=!!t(n,r,u)})),e}function rr(n,t,e){for(var r=-1,u=n.length;++r0&&e(o)?t>1?ir(o,t-1,e,r,u):pt(u,o):r||(u[u.length]=o)}return u}var ar=Eu(),or=Eu(!0);function cr(n,t){return n&&ar(n,t,yo)}function lr(n,t){return n&&or(n,t,yo)}function fr(n,t){return st(t,(function(t){return Wa(n[t])}))}function sr(n,t){for(var e=0,r=(t=ou(t,n)).length;null!=n&&et}function pr(n,t){return null!=n&&Cn.call(n,t)}function gr(n,t){return null!=n&&t in gn(n)}function Dr(n,t,e){for(var u=e?ht:vt,i=n[0].length,a=n.length,o=a,c=r(a),l=1/0,f=[];o--;){var s=n[o];o&&t&&(s=dt(s,Nt(t))),l=oe(s.length,l),c[o]=!e&&(t||i>=120&&s.length>=120)?new ze(o&&s):void 0}s=n[0];var v=-1,h=c[0];n:for(;++v=o)return c;var l=e[r];return c*("desc"==l?-1:1)}}return n.index-t.index}(n,t,e)}))}function Ir(n,t,e){for(var r=-1,u=t.length,i={};++r-1;)o!==n&&Jn.call(o,c,1),Jn.call(n,c,1);return n}function Lr(n,t){for(var e=n?t.length:0,r=e-1;e--;){var u=t[e];if(e==r||u!==i){var i=u;ai(u)?Jn.call(n,u,1):Xr(n,u)}}return n}function zr(n,t){return n+ne(fe()*(t-n+1))}function Rr(n,t){var e="";if(!n||t<1||t>9007199254740991)return e;do{t%2&&(e+=n),(t=ne(t/2))&&(n+=n)}while(t);return e}function Tr(n,t){return yi(di(n,t,Vo),n+"")}function Wr(n){return We(jo(n))}function Mr(n,t){var e=jo(n);return wi(e,Ke(t,0,e.length))}function Ur(n,t,e,r){if(!Pa(n))return n;for(var u=-1,i=(t=ou(t,n)).length,a=i-1,o=n;null!=o&&++ui?0:i+t),(e=e>i?i:e)<0&&(e+=i),i=t>e?0:e-t>>>0,t>>>=0;for(var a=r(i);++u>>1,a=n[i];null!==a&&!Ja(a)&&(e?a<=t:a=200){var l=t?null:Ru(n);if(l)return qt(l);a=!1,u=It,c=new ze}else c=t?[]:o;n:for(;++r=r?n:Gr(n,t,e)}var fu=Jt||function(n){return Hn.clearTimeout(n)};function su(n,t){if(t)return n.slice();var e=n.length,r=$n?$n(e):new n.constructor(e);return n.copy(r),r}function vu(n){var t=new n.constructor(n.byteLength);return new Rn(t).set(new Rn(n)),t}function hu(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.length)}function du(n,t){if(n!==t){var e=void 0!==n,r=null===n,u=n==n,i=Ja(n),a=void 0!==t,o=null===t,c=t==t,l=Ja(t);if(!o&&!l&&!i&&n>t||i&&a&&c&&!o&&!l||r&&a&&c||!e&&c||!u)return 1;if(!r&&!i&&!l&&n1?e[u-1]:void 0,a=u>2?e[2]:void 0;for(i=n.length>3&&"function"==typeof i?(u--,i):void 0,a&&oi(e[0],e[1],a)&&(i=u<3?void 0:i,u=1),t=gn(t);++r-1?u[i?t[a]:a]:void 0}}function xu(n){return qu((function(t){var e=t.length,r=e,u=Ne.prototype.thru;for(n&&t.reverse();r--;){var a=t[r];if("function"!=typeof a)throw new mn(i);if(u&&!o&&"wrapper"==Hu(a))var o=new Ne([],!0)}for(r=o?r:e;++r1&&m.reverse(),s&&l<_&&(m.length=l),this&&this!==Hn&&this instanceof D&&(C=g||Cu(C)),C.apply(F,m)}}function ju(n,t){return function(e,r){return function(n,t,e,r){return cr(n,(function(n,u,i){t(r,e(n),u,i)})),r}(e,n,t(r),{})}}function Ou(n,t){return function(e,r){var u;if(void 0===e&&void 0===r)return t;if(void 0!==e&&(u=e),void 0!==r){if(void 0===u)return r;"string"==typeof e||"string"==typeof r?(e=Qr(e),r=Qr(r)):(e=Jr(e),r=Jr(r)),u=n(e,r)}return u}}function Nu(n){return qu((function(t){return t=dt(t,Nt(Ju())),Tr((function(e){var r=this;return n(t,(function(n){return at(n,r,e)}))}))}))}function Bu(n,t){var e=(t=void 0===t?" ":Qr(t)).length;if(e<2)return e?Rr(t,n):t;var r=Rr(t,Xt(n/Vt(t)));return Mt(t)?lu(Zt(r),0,n).join(""):r.slice(0,n)}function Iu(n){return function(t,e,u){return u&&"number"!=typeof u&&oi(t,e,u)&&(e=u=void 0),t=to(t),void 0===e?(e=t,t=0):e=to(e),function(n,t,e,u){for(var i=-1,a=ae(Xt((t-n)/(e||1)),0),o=r(a);a--;)o[u?a:++i]=n,n+=e;return o}(t,e,u=void 0===u?to))return!1;var l=i.get(n);if(l&&i.get(t))return l==t;var f=-1,s=!0,v=2&e?new ze:void 0;for(i.set(n,t),i.set(t,n);++f-1&&n%1==0&&n1?"& ":"")+t[r],t=t.join(e>2?", ":" "),n.replace(Q,"{\n/* [wrapped with "+t+"] */\n")}(r,function(n,t){return ct(o,(function(e){var r="_."+e[0];t&e[1]&&!vt(n,r)&&n.push(r)})),n.sort()}(function(n){var t=n.match(Y);return t?t[1].split(X):[]}(r),e)))}function Ei(n){var t=0,e=0;return function(){var r=ce(),u=16-(r-e);if(e=r,u>0){if(++t>=800)return arguments[0]}else t=0;return n.apply(void 0,arguments)}}function wi(n,t){var e=-1,r=n.length,u=r-1;for(t=void 0===t?r:t;++e1?n[t-1]:void 0;return e="function"==typeof e?(n.pop(),e):void 0,Zi(n,e)}));function na(n){var t=Ae(n);return t.__chain__=!0,t}function ta(n,t){return t(n)}var ea=qu((function(n){var t=n.length,e=t?n[0]:0,r=this.__wrapped__,u=function(t){return He(t,n)};return!(t>1||this.__actions__.length)&&r instanceof Be&&ai(e)?((r=r.slice(e,+e+(t?1:0))).__actions__.push({func:ta,args:[u],thisArg:void 0}),new Ne(r,this.__chain__).thru((function(n){return t&&!n.length&&n.push(void 0),n}))):this.thru(u)}));var ra=mu((function(n,t,e){Cn.call(n,e)?++n[e]:Ze(n,e,1)}));var ua=ku(Ni),ia=ku(Bi);function aa(n,t){return(Ba(n)?ct:nr)(n,Ju(t,3))}function oa(n,t){return(Ba(n)?lt:tr)(n,Ju(t,3))}var ca=mu((function(n,t,e){Cn.call(n,e)?n[e].push(t):Ze(n,e,[t])}));var la=Tr((function(n,t,e){var u=-1,i="function"==typeof t,a=Sa(n)?r(n.length):[];return nr(n,(function(n){a[++u]=i?at(t,n,e):_r(n,t,e)})),a})),fa=mu((function(n,t,e){Ze(n,e,t)}));function sa(n,t){return(Ba(n)?dt:xr)(n,Ju(t,3))}var va=mu((function(n,t,e){n[e?0:1].push(t)}),(function(){return[[],[]]}));var ha=Tr((function(n,t){if(null==n)return[];var e=t.length;return e>1&&oi(n,t[0],t[1])?t=[]:e>2&&oi(t[0],t[1],t[2])&&(t=[t[0]]),Br(n,ir(t,1),[])})),da=Qt||function(){return Hn.Date.now()};function pa(n,t,e){return t=e?void 0:t,Wu(n,128,void 0,void 0,void 0,void 0,t=n&&null==t?n.length:t)}function ga(n,t){var e;if("function"!=typeof t)throw new mn(i);return n=eo(n),function(){return--n>0&&(e=t.apply(this,arguments)),n<=1&&(t=void 0),e}}var Da=Tr((function(n,t,e){var r=1;if(e.length){var u=$t(e,Ku(Da));r|=32}return Wu(n,r,t,e,u)})),_a=Tr((function(n,t,e){var r=3;if(e.length){var u=$t(e,Ku(_a));r|=32}return Wu(t,r,n,e,u)}));function ma(n,t,e){var r,u,a,o,c,l,f=0,s=!1,v=!1,h=!0;if("function"!=typeof n)throw new mn(i);function d(t){var e=r,i=u;return r=u=void 0,f=t,o=n.apply(i,e)}function p(n){return f=n,c=mi(D,t),s?d(n):o}function g(n){var e=n-l;return void 0===l||e>=t||e<0||v&&n-f>=a}function D(){var n=da();if(g(n))return _(n);c=mi(D,function(n){var e=t-(n-l);return v?oe(e,a-(n-f)):e}(n))}function _(n){return c=void 0,h&&r?d(n):(r=u=void 0,o)}function m(){var n=da(),e=g(n);if(r=arguments,u=this,l=n,e){if(void 0===c)return p(l);if(v)return fu(c),c=mi(D,t),d(l)}return void 0===c&&(c=mi(D,t)),o}return t=uo(t)||0,Pa(e)&&(s=!!e.leading,a=(v="maxWait"in e)?ae(uo(e.maxWait)||0,t):a,h="trailing"in e?!!e.trailing:h),m.cancel=function(){void 0!==c&&fu(c),f=0,r=l=u=c=void 0},m.flush=function(){return void 0===c?o:_(da())},m}var ya=Tr((function(n,t){return Ye(n,1,t)})),ba=Tr((function(n,t,e){return Ye(n,uo(t)||0,e)}));function Ea(n,t){if("function"!=typeof n||null!=t&&"function"!=typeof t)throw new mn(i);var e=function(){var r=arguments,u=t?t.apply(this,r):r[0],i=e.cache;if(i.has(u))return i.get(u);var a=n.apply(this,r);return e.cache=i.set(u,a)||i,a};return e.cache=new(Ea.Cache||Le),e}function wa(n){if("function"!=typeof n)throw new mn(i);return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}Ea.Cache=Le;var Fa=cu((function(n,t){var e=(t=1==t.length&&Ba(t[0])?dt(t[0],Nt(Ju())):dt(ir(t,1),Nt(Ju()))).length;return Tr((function(r){for(var u=-1,i=oe(r.length,e);++u=t})),Na=mr(function(){return arguments}())?mr:function(n){return $a(n)&&Cn.call(n,"callee")&&!Kn.call(n,"callee")},Ba=r.isArray,Ia=nt?Nt(nt):function(n){return $a(n)&&hr(n)==w};function Sa(n){return null!=n&&Ua(n.length)&&!Wa(n)}function La(n){return $a(n)&&Sa(n)}var za=ee||ic,Ra=tt?Nt(tt):function(n){return $a(n)&&hr(n)==s};function Ta(n){if(!$a(n))return!1;var t=hr(n);return t==v||"[object DOMException]"==t||"string"==typeof n.message&&"string"==typeof n.name&&!Va(n)}function Wa(n){if(!Pa(n))return!1;var t=hr(n);return t==h||t==d||"[object AsyncFunction]"==t||"[object Proxy]"==t}function Ma(n){return"number"==typeof n&&n==eo(n)}function Ua(n){return"number"==typeof n&&n>-1&&n%1==0&&n<=9007199254740991}function Pa(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function $a(n){return null!=n&&"object"==typeof n}var qa=et?Nt(et):function(n){return $a(n)&&ei(n)==p};function Ga(n){return"number"==typeof n||$a(n)&&hr(n)==g}function Va(n){if(!$a(n)||hr(n)!=D)return!1;var t=Vn(n);if(null===t)return!0;var e=Cn.call(t,"constructor")&&t.constructor;return"function"==typeof e&&e instanceof e&&Fn.call(e)==jn}var Za=rt?Nt(rt):function(n){return $a(n)&&hr(n)==_};var Ha=ut?Nt(ut):function(n){return $a(n)&&ei(n)==m};function Ka(n){return"string"==typeof n||!Ba(n)&&$a(n)&&hr(n)==y}function Ja(n){return"symbol"==typeof n||$a(n)&&hr(n)==b}var Qa=it?Nt(it):function(n){return $a(n)&&Ua(n.length)&&!!Un[hr(n)]};var Ya=Su(kr),Xa=Su((function(n,t){return n<=t}));function no(n){if(!n)return[];if(Sa(n))return Ka(n)?Zt(n):Du(n);if(Xn&&n[Xn])return function(n){for(var t,e=[];!(t=n.next()).done;)e.push(t.value);return e}(n[Xn]());var t=ei(n);return(t==p?Ut:t==m?qt:jo)(n)}function to(n){return n?(n=uo(n))===1/0||n===-1/0?17976931348623157e292*(n<0?-1:1):n==n?n:0:0===n?n:0}function eo(n){var t=to(n),e=t%1;return t==t?e?t-e:t:0}function ro(n){return n?Ke(eo(n),0,4294967295):0}function uo(n){if("number"==typeof n)return n;if(Ja(n))return NaN;if(Pa(n)){var t="function"==typeof n.valueOf?n.valueOf():n;n=Pa(t)?t+"":t}if("string"!=typeof n)return 0===n?n:+n;n=n.replace(H,"");var e=an.test(n);return e||cn.test(n)?Gn(n.slice(2),e?2:8):un.test(n)?NaN:+n}function io(n){return _u(n,bo(n))}function ao(n){return null==n?"":Qr(n)}var oo=yu((function(n,t){if(si(t)||Sa(t))_u(t,yo(t),n);else for(var e in t)Cn.call(t,e)&&$e(n,e,t[e])})),co=yu((function(n,t){_u(t,bo(t),n)})),lo=yu((function(n,t,e,r){_u(t,bo(t),n,r)})),fo=yu((function(n,t,e,r){_u(t,yo(t),n,r)})),so=qu(He);var vo=Tr((function(n,t){n=gn(n);var e=-1,r=t.length,u=r>2?t[2]:void 0;for(u&&oi(t[0],t[1],u)&&(r=1);++e1),t})),_u(n,Vu(n),e),r&&(e=Je(e,7,Pu));for(var u=t.length;u--;)Xr(e,t[u]);return e}));var Co=qu((function(n,t){return null==n?{}:function(n,t){return Ir(n,t,(function(t,e){return go(n,e)}))}(n,t)}));function ko(n,t){if(null==n)return{};var e=dt(Vu(n),(function(n){return[n]}));return t=Ju(t),Ir(n,e,(function(n,e){return t(n,e[0])}))}var xo=Tu(yo),Ao=Tu(bo);function jo(n){return null==n?[]:Bt(n,yo(n))}var Oo=Fu((function(n,t,e){return t=t.toLowerCase(),n+(e?No(t):t)}));function No(n){return Wo(ao(n).toLowerCase())}function Bo(n){return(n=ao(n))&&n.replace(fn,Rt).replace(Sn,"")}var Io=Fu((function(n,t,e){return n+(e?"-":"")+t.toLowerCase()})),So=Fu((function(n,t,e){return n+(e?" ":"")+t.toLowerCase()})),Lo=wu("toLowerCase");var zo=Fu((function(n,t,e){return n+(e?"_":"")+t.toLowerCase()}));var Ro=Fu((function(n,t,e){return n+(e?" ":"")+Wo(t)}));var To=Fu((function(n,t,e){return n+(e?" ":"")+t.toUpperCase()})),Wo=wu("toUpperCase");function Mo(n,t,e){return n=ao(n),void 0===(t=e?void 0:t)?function(n){return Tn.test(n)}(n)?function(n){return n.match(zn)||[]}(n):function(n){return n.match(nn)||[]}(n):n.match(t)||[]}var Uo=Tr((function(n,t){try{return at(n,void 0,t)}catch(e){return Ta(e)?e:new hn(e)}})),Po=qu((function(n,t){return ct(t,(function(t){t=Ci(t),Ze(n,t,Da(n[t],n))})),n}));function $o(n){return function(){return n}}var qo=xu(),Go=xu(!0);function Vo(n){return n}function Zo(n){return wr("function"==typeof n?n:Je(n,1))}var Ho=Tr((function(n,t){return function(e){return _r(e,n,t)}})),Ko=Tr((function(n,t){return function(e){return _r(n,e,t)}}));function Jo(n,t,e){var r=yo(t),u=fr(t,r);null!=e||Pa(t)&&(u.length||!r.length)||(e=t,t=n,n=this,u=fr(t,yo(t)));var i=!(Pa(e)&&"chain"in e&&!e.chain),a=Wa(n);return ct(u,(function(e){var r=t[e];n[e]=r,a&&(n.prototype[e]=function(){var t=this.__chain__;if(i||t){var e=n(this.__wrapped__),u=e.__actions__=Du(this.__actions__);return u.push({func:r,args:arguments,thisArg:n}),e.__chain__=t,e}return r.apply(n,pt([this.value()],arguments))})})),n}function Qo(){}var Yo=Nu(dt),Xo=Nu(ft),nc=Nu(_t);function tc(n){return ci(n)?kt(Ci(n)):function(n){return function(t){return sr(t,n)}}(n)}var ec=Iu(),rc=Iu(!0);function uc(){return[]}function ic(){return!1}var ac=Ou((function(n,t){return n+t}),0),oc=zu("ceil"),cc=Ou((function(n,t){return n/t}),1),lc=zu("floor");var fc,sc=Ou((function(n,t){return n*t}),1),vc=zu("round"),hc=Ou((function(n,t){return n-t}),0);return Ae.after=function(n,t){if("function"!=typeof t)throw new mn(i);return n=eo(n),function(){if(--n<1)return t.apply(this,arguments)}},Ae.ary=pa,Ae.assign=oo,Ae.assignIn=co,Ae.assignInWith=lo,Ae.assignWith=fo,Ae.at=so,Ae.before=ga,Ae.bind=Da,Ae.bindAll=Po,Ae.bindKey=_a,Ae.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return Ba(n)?n:[n]},Ae.chain=na,Ae.chunk=function(n,t,e){t=(e?oi(n,t,e):void 0===t)?1:ae(eo(t),0);var u=null==n?0:n.length;if(!u||t<1)return[];for(var i=0,a=0,o=r(Xt(u/t));iu?0:u+e),(r=void 0===r||r>u?u:eo(r))<0&&(r+=u),r=e>r?0:ro(r);e>>0)?(n=ao(n))&&("string"==typeof t||null!=t&&!Za(t))&&!(t=Qr(t))&&Mt(n)?lu(Zt(n),0,e):n.split(t,e):[]},Ae.spread=function(n,t){if("function"!=typeof n)throw new mn(i);return t=null==t?0:ae(eo(t),0),Tr((function(e){var r=e[t],u=lu(e,0,t);return r&&pt(u,r),at(n,this,u)}))},Ae.tail=function(n){var t=null==n?0:n.length;return t?Gr(n,1,t):[]},Ae.take=function(n,t,e){return n&&n.length?Gr(n,0,(t=e||void 0===t?1:eo(t))<0?0:t):[]},Ae.takeRight=function(n,t,e){var r=null==n?0:n.length;return r?Gr(n,(t=r-(t=e||void 0===t?1:eo(t)))<0?0:t,r):[]},Ae.takeRightWhile=function(n,t){return n&&n.length?tu(n,Ju(t,3),!1,!0):[]},Ae.takeWhile=function(n,t){return n&&n.length?tu(n,Ju(t,3)):[]},Ae.tap=function(n,t){return t(n),n},Ae.throttle=function(n,t,e){var r=!0,u=!0;if("function"!=typeof n)throw new mn(i);return Pa(e)&&(r="leading"in e?!!e.leading:r,u="trailing"in e?!!e.trailing:u),ma(n,t,{leading:r,maxWait:t,trailing:u})},Ae.thru=ta,Ae.toArray=no,Ae.toPairs=xo,Ae.toPairsIn=Ao,Ae.toPath=function(n){return Ba(n)?dt(n,Ci):Ja(n)?[n]:Du(Fi(ao(n)))},Ae.toPlainObject=io,Ae.transform=function(n,t,e){var r=Ba(n),u=r||za(n)||Qa(n);if(t=Ju(t,4),null==e){var i=n&&n.constructor;e=u?r?new i:[]:Pa(n)&&Wa(i)?je(Vn(n)):{}}return(u?ct:cr)(n,(function(n,r,u){return t(e,n,r,u)})),e},Ae.unary=function(n){return pa(n,1)},Ae.union=$i,Ae.unionBy=qi,Ae.unionWith=Gi,Ae.uniq=function(n){return n&&n.length?Yr(n):[]},Ae.uniqBy=function(n,t){return n&&n.length?Yr(n,Ju(t,2)):[]},Ae.uniqWith=function(n,t){return t="function"==typeof t?t:void 0,n&&n.length?Yr(n,void 0,t):[]},Ae.unset=function(n,t){return null==n||Xr(n,t)},Ae.unzip=Vi,Ae.unzipWith=Zi,Ae.update=function(n,t,e){return null==n?n:nu(n,t,au(e))},Ae.updateWith=function(n,t,e,r){return r="function"==typeof r?r:void 0,null==n?n:nu(n,t,au(e),r)},Ae.values=jo,Ae.valuesIn=function(n){return null==n?[]:Bt(n,bo(n))},Ae.without=Hi,Ae.words=Mo,Ae.wrap=function(n,t){return Ca(au(t),n)},Ae.xor=Ki,Ae.xorBy=Ji,Ae.xorWith=Qi,Ae.zip=Yi,Ae.zipObject=function(n,t){return uu(n||[],t||[],$e)},Ae.zipObjectDeep=function(n,t){return uu(n||[],t||[],Ur)},Ae.zipWith=Xi,Ae.entries=xo,Ae.entriesIn=Ao,Ae.extend=co,Ae.extendWith=lo,Jo(Ae,Ae),Ae.add=ac,Ae.attempt=Uo,Ae.camelCase=Oo,Ae.capitalize=No,Ae.ceil=oc,Ae.clamp=function(n,t,e){return void 0===e&&(e=t,t=void 0),void 0!==e&&(e=(e=uo(e))==e?e:0),void 0!==t&&(t=(t=uo(t))==t?t:0),Ke(uo(n),t,e)},Ae.clone=function(n){return Je(n,4)},Ae.cloneDeep=function(n){return Je(n,5)},Ae.cloneDeepWith=function(n,t){return Je(n,5,t="function"==typeof t?t:void 0)},Ae.cloneWith=function(n,t){return Je(n,4,t="function"==typeof t?t:void 0)},Ae.conformsTo=function(n,t){return null==t||Qe(n,t,yo(t))},Ae.deburr=Bo,Ae.defaultTo=function(n,t){return null==n||n!=n?t:n},Ae.divide=cc,Ae.endsWith=function(n,t,e){n=ao(n),t=Qr(t);var r=n.length,u=e=void 0===e?r:Ke(eo(e),0,r);return(e-=t.length)>=0&&n.slice(e,u)==t},Ae.eq=Aa,Ae.escape=function(n){return(n=ao(n))&&W.test(n)?n.replace(R,Tt):n},Ae.escapeRegExp=function(n){return(n=ao(n))&&Z.test(n)?n.replace(V,"\\$&"):n},Ae.every=function(n,t,e){var r=Ba(n)?ft:er;return e&&oi(n,t,e)&&(t=void 0),r(n,Ju(t,3))},Ae.find=ua,Ae.findIndex=Ni,Ae.findKey=function(n,t){return yt(n,Ju(t,3),cr)},Ae.findLast=ia,Ae.findLastIndex=Bi,Ae.findLastKey=function(n,t){return yt(n,Ju(t,3),lr)},Ae.floor=lc,Ae.forEach=aa,Ae.forEachRight=oa,Ae.forIn=function(n,t){return null==n?n:ar(n,Ju(t,3),bo)},Ae.forInRight=function(n,t){return null==n?n:or(n,Ju(t,3),bo)},Ae.forOwn=function(n,t){return n&&cr(n,Ju(t,3))},Ae.forOwnRight=function(n,t){return n&&lr(n,Ju(t,3))},Ae.get=po,Ae.gt=ja,Ae.gte=Oa,Ae.has=function(n,t){return null!=n&&ri(n,t,pr)},Ae.hasIn=go,Ae.head=Si,Ae.identity=Vo,Ae.includes=function(n,t,e,r){n=Sa(n)?n:jo(n),e=e&&!r?eo(e):0;var u=n.length;return e<0&&(e=ae(u+e,0)),Ka(n)?e<=u&&n.indexOf(t,e)>-1:!!u&&Et(n,t,e)>-1},Ae.indexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=null==e?0:eo(e);return u<0&&(u=ae(r+u,0)),Et(n,t,u)},Ae.inRange=function(n,t,e){return t=to(t),void 0===e?(e=t,t=0):e=to(e),function(n,t,e){return n>=oe(t,e)&&n=-9007199254740991&&n<=9007199254740991},Ae.isSet=Ha,Ae.isString=Ka,Ae.isSymbol=Ja,Ae.isTypedArray=Qa,Ae.isUndefined=function(n){return void 0===n},Ae.isWeakMap=function(n){return $a(n)&&ei(n)==E},Ae.isWeakSet=function(n){return $a(n)&&"[object WeakSet]"==hr(n)},Ae.join=function(n,t){return null==n?"":ue.call(n,t)},Ae.kebabCase=Io,Ae.last=Ti,Ae.lastIndexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=r;return void 0!==e&&(u=(u=eo(e))<0?ae(r+u,0):oe(u,r-1)),t==t?function(n,t,e){for(var r=e+1;r--;)if(n[r]===t)return r;return r}(n,t,u):bt(n,Ft,u,!0)},Ae.lowerCase=So,Ae.lowerFirst=Lo,Ae.lt=Ya,Ae.lte=Xa,Ae.max=function(n){return n&&n.length?rr(n,Vo,dr):void 0},Ae.maxBy=function(n,t){return n&&n.length?rr(n,Ju(t,2),dr):void 0},Ae.mean=function(n){return Ct(n,Vo)},Ae.meanBy=function(n,t){return Ct(n,Ju(t,2))},Ae.min=function(n){return n&&n.length?rr(n,Vo,kr):void 0},Ae.minBy=function(n,t){return n&&n.length?rr(n,Ju(t,2),kr):void 0},Ae.stubArray=uc,Ae.stubFalse=ic,Ae.stubObject=function(){return{}},Ae.stubString=function(){return""},Ae.stubTrue=function(){return!0},Ae.multiply=sc,Ae.nth=function(n,t){return n&&n.length?Nr(n,eo(t)):void 0},Ae.noConflict=function(){return Hn._===this&&(Hn._=On),this},Ae.noop=Qo,Ae.now=da,Ae.pad=function(n,t,e){n=ao(n);var r=(t=eo(t))?Vt(n):0;if(!t||r>=t)return n;var u=(t-r)/2;return Bu(ne(u),e)+n+Bu(Xt(u),e)},Ae.padEnd=function(n,t,e){n=ao(n);var r=(t=eo(t))?Vt(n):0;return t&&rt){var r=n;n=t,t=r}if(e||n%1||t%1){var u=fe();return oe(n+u*(t-n+qn("1e-"+((u+"").length-1))),t)}return zr(n,t)},Ae.reduce=function(n,t,e){var r=Ba(n)?gt:At,u=arguments.length<3;return r(n,Ju(t,4),e,u,nr)},Ae.reduceRight=function(n,t,e){var r=Ba(n)?Dt:At,u=arguments.length<3;return r(n,Ju(t,4),e,u,tr)},Ae.repeat=function(n,t,e){return t=(e?oi(n,t,e):void 0===t)?1:eo(t),Rr(ao(n),t)},Ae.replace=function(){var n=arguments,t=ao(n[0]);return n.length<3?t:t.replace(n[1],n[2])},Ae.result=function(n,t,e){var r=-1,u=(t=ou(t,n)).length;for(u||(u=1,n=void 0);++r9007199254740991)return[];var e=4294967295,r=oe(n,4294967295);n-=4294967295;for(var u=Ot(r,t=Ju(t));++e=i)return n;var o=e-Vt(r);if(o<1)return r;var c=a?lu(a,0,o).join(""):n.slice(0,o);if(void 0===u)return c+r;if(a&&(o+=c.length-o),Za(u)){if(n.slice(o).search(u)){var l,f=c;for(u.global||(u=Dn(u.source,ao(rn.exec(u))+"g")),u.lastIndex=0;l=u.exec(f);)var s=l.index;c=c.slice(0,void 0===s?o:s)}}else if(n.indexOf(Qr(u),o)!=o){var v=c.lastIndexOf(u);v>-1&&(c=c.slice(0,v))}return c+r},Ae.unescape=function(n){return(n=ao(n))&&T.test(n)?n.replace(z,Ht):n},Ae.uniqueId=function(n){var t=++kn;return ao(n)+t},Ae.upperCase=To,Ae.upperFirst=Wo,Ae.each=aa,Ae.eachRight=oa,Ae.first=Si,Jo(Ae,(fc={},cr(Ae,(function(n,t){Cn.call(Ae.prototype,t)||(fc[t]=n)})),fc),{chain:!1}),Ae.VERSION="4.17.15",ct(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(n){Ae[n].placeholder=Ae})),ct(["drop","take"],(function(n,t){Be.prototype[n]=function(e){e=void 0===e?1:ae(eo(e),0);var r=this.__filtered__&&!t?new Be(this):this.clone();return r.__filtered__?r.__takeCount__=oe(e,r.__takeCount__):r.__views__.push({size:oe(e,4294967295),type:n+(r.__dir__<0?"Right":"")}),r},Be.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}})),ct(["filter","map","takeWhile"],(function(n,t){var e=t+1,r=1==e||3==e;Be.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:Ju(n,3),type:e}),t.__filtered__=t.__filtered__||r,t}})),ct(["head","last"],(function(n,t){var e="take"+(t?"Right":"");Be.prototype[n]=function(){return this[e](1).value()[0]}})),ct(["initial","tail"],(function(n,t){var e="drop"+(t?"":"Right");Be.prototype[n]=function(){return this.__filtered__?new Be(this):this[e](1)}})),Be.prototype.compact=function(){return this.filter(Vo)},Be.prototype.find=function(n){return this.filter(n).head()},Be.prototype.findLast=function(n){return this.reverse().find(n)},Be.prototype.invokeMap=Tr((function(n,t){return"function"==typeof n?new Be(this):this.map((function(e){return _r(e,n,t)}))})),Be.prototype.reject=function(n){return this.filter(wa(Ju(n)))},Be.prototype.slice=function(n,t){n=eo(n);var e=this;return e.__filtered__&&(n>0||t<0)?new Be(e):(n<0?e=e.takeRight(-n):n&&(e=e.drop(n)),void 0!==t&&(e=(t=eo(t))<0?e.dropRight(-t):e.take(t-n)),e)},Be.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Be.prototype.toArray=function(){return this.take(4294967295)},cr(Be.prototype,(function(n,t){var e=/^(?:filter|find|map|reject)|While$/.test(t),r=/^(?:head|last)$/.test(t),u=Ae[r?"take"+("last"==t?"Right":""):t],i=r||/^find/.test(t);u&&(Ae.prototype[t]=function(){var t=this.__wrapped__,a=r?[1]:arguments,o=t instanceof Be,c=a[0],l=o||Ba(t),f=function(n){var t=u.apply(Ae,pt([n],a));return r&&s?t[0]:t};l&&e&&"function"==typeof c&&1!=c.length&&(o=l=!1);var s=this.__chain__,v=!!this.__actions__.length,h=i&&!s,d=o&&!v;if(!i&&l){t=d?t:new Be(this);var p=n.apply(t,a);return p.__actions__.push({func:ta,args:[f],thisArg:void 0}),new Ne(p,s)}return h&&d?n.apply(this,a):(p=this.thru(f),h?r?p.value()[0]:p.value():p)})})),ct(["pop","push","shift","sort","splice","unshift"],(function(n){var t=yn[n],e=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",r=/^(?:pop|shift)$/.test(n);Ae.prototype[n]=function(){var n=arguments;if(r&&!this.__chain__){var u=this.value();return t.apply(Ba(u)?u:[],n)}return this[e]((function(e){return t.apply(Ba(e)?e:[],n)}))}})),cr(Be.prototype,(function(n,t){var e=Ae[t];if(e){var r=e.name+"";Cn.call(me,r)||(me[r]=[]),me[r].push({name:t,func:e})}})),me[Au(void 0,2).name]=[{name:"wrapper",func:void 0}],Be.prototype.clone=function(){var n=new Be(this.__wrapped__);return n.__actions__=Du(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Du(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Du(this.__views__),n},Be.prototype.reverse=function(){if(this.__filtered__){var n=new Be(this);n.__dir__=-1,n.__filtered__=!0}else(n=this.clone()).__dir__*=-1;return n},Be.prototype.value=function(){var n=this.__wrapped__.value(),t=this.__dir__,e=Ba(n),r=t<0,u=e?n.length:0,i=function(n,t,e){var r=-1,u=e.length;for(;++r=this.__values__.length;return{done:n,value:n?void 0:this.__values__[this.__index__++]}},Ae.prototype.plant=function(n){for(var t,e=this;e instanceof Oe;){var r=xi(e);r.__index__=0,r.__values__=void 0,t?u.__wrapped__=r:t=r;var u=r;e=e.__wrapped__}return u.__wrapped__=n,t},Ae.prototype.reverse=function(){var n=this.__wrapped__;if(n instanceof Be){var t=n;return this.__actions__.length&&(t=new Be(this)),(t=t.reverse()).__actions__.push({func:ta,args:[Pi],thisArg:void 0}),new Ne(t,this.__chain__)}return this.thru(Pi)},Ae.prototype.toJSON=Ae.prototype.valueOf=Ae.prototype.value=function(){return eu(this.__wrapped__,this.__actions__)},Ae.prototype.first=Ae.prototype.head,Xn&&(Ae.prototype[Xn]=function(){return this}),Ae}();Hn._=Kt,void 0===(u=function(){return Kt}.call(t,e,t,r))||(r.exports=u)}).call(this)}).call(this,e(76),e(496)(n))},494:function(n,t,e){"use strict";var r=e(0),u=Object(r.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=u},495:function(n,t,e){"use strict";e.d(t,"a",(function(){return i}));e(77),e(513),e(478),e(78);var r=e(515),u=e.n(r);function i(n,t){var e=new u.a;return n.map((function(n){var r=n;return"string"==typeof n&&(r={label:n,permalink:"/blog/tags/"+e.slug(n)}),function(n,t){var e=n.label.split(": ",2),r=e[0],u=e[1],i="primary";switch(t){case"blog":case"guides":i=function(n){switch(n){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(r)}return{category:r,count:n.count,label:n.label,permalink:n.permalink,style:i,value:u}}(r,t)}))}},496:function(n,t){n.exports=function(n){return n.webpackPolyfill||(n.deprecate=function(){},n.paths=[],n.children||(n.children=[]),Object.defineProperty(n,"loaded",{enumerable:!0,get:function(){return n.l}}),Object.defineProperty(n,"id",{enumerable:!0,get:function(){return n.i}}),n.webpackPolyfill=1),n}},505:function(n,t,e){var r=e(30),u=e(54),i=e(27),a=e(26),o=e(506);n.exports=function(n,t){var e=1==n,c=2==n,l=3==n,f=4==n,s=6==n,v=5==n||s,h=t||o;return function(t,o,d){for(var p,g,D=i(t),_=u(D),m=r(o,d,3),y=a(_.length),b=0,E=e?h(t,y):c?h(t,0):void 0;y>b;b++)if((v||b in _)&&(g=m(p=_[b],b,D),n))if(e)E[b]=g;else if(g)switch(n){case 3:return!0;case 5:return p;case 6:return b;case 2:E.push(p)}else if(f)return!1;return s?-1:l||f?f:E}}},506:function(n,t,e){var r=e(507);n.exports=function(n,t){return new(r(n))(t)}},507:function(n,t,e){var r=e(13),u=e(508),i=e(2)("species");n.exports=function(n){var t;return u(n)&&("function"!=typeof(t=n.constructor)||t!==Array&&!u(t.prototype)||(t=void 0),r(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},508:function(n,t,e){var r=e(23);n.exports=Array.isArray||function(n){return"Array"==r(n)}},514:function(n,t,e){"use strict";var r=e(0),u=e.n(r),i=e(470),a=e(463),o=e.n(a);t.a=function(n){var t=n.count,e=n.label,r=n.permalink,a=n.style,c=n.value,l=n.valueOnly;return u.a.createElement(i.a,{to:r+"/",className:o()("badge","badge--rounded","badge--"+a)},l?c:e,t&&u.a.createElement(u.a.Fragment,null," (",t,")"))}},515:function(n,t,e){var r=e(516);n.exports=o;var u=Object.hasOwnProperty,i=/\s/g,a=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function o(){if(!(this instanceof o))return new o;this.reset()}function c(n,t){return"string"!=typeof n?"":(t||(n=n.toLowerCase()),n.trim().replace(a,"").replace(r(),"").replace(i,"-"))}o.prototype.slug=function(n,t){for(var e=c(n,!0===t),r=e;u.call(this.occurrences,e);)this.occurrences[r]++,e=r+"-"+this.occurrences[r];return this.occurrences[e]=0,e},o.prototype.reset=function(){this.occurrences=Object.create(null)},o.slug=c},516:function(n,t){n.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},520:function(n,t,e){"use strict";var r=e(1),u=e(0),i=e.n(u),a=(e(470),e(514)),o=e(463),c=e.n(o),l=e(495),f=e(141),s=e.n(f);t.a=function(n){var t,e=n.block,u=n.colorProfile,o=n.tags,f=n.valuesOnly,v=Object(l.a)(o,u);return i.a.createElement("div",{className:c()(s.a.tags,(t={},t[s.a.tagsBlock]=e,t))},v.map((function(n,t){return i.a.createElement(a.a,Object(r.a)({key:t,valueOnly:f},n))})))}},556:function(n,t,e){"use strict";e(29),e(22),e(21),e(52);var r=e(0),u=e.n(r),i=(e(468),e(478),e(470)),a=e(484),o=e.n(a),c=e(520),l=e(495),f=e(476),s=e(485);e(142);var v=function(n){var t=n.frontMatter,e=n.metadata,r=(n.isGuidePage,Object(s.a)().isDarkTheme),a=e.categories,v=(e.description,e.permalink),h=(e.readingTime,e.seriesPosition),d=e.tags,p=(t.author_github,t.cover_label),g=(t.last_modified_on,t.title),D=Object(l.a)(d,"guides"),_=D.find((function(n){return"domain"==n.category})),m=_?_.value:"default",y=D.find((function(n){return"language"==n.category})),b=y?y.value:null,E=D.find((function(n){return"framework"==n.category})),w=E?E.value:null,F=D.find((function(n){return"technology"==n.category})),C=F?F.value:null,k=D.find((function(n){return"database"==n.category})),x=k?k.value:null,A=D.find((function(n){return"installation_guide"==n.category})),j=A?A.value:null,O=D.find((function(n){return"platform"==n.category})),N=O?O.value:null,B=D.find((function(n){return"source"==n.category})),I=B?B.value:null,S=D.find((function(n){return"sink"==n.category})),L=S?S.value:null,z=Object(f.a)().siteConfig.customFields.metadata,R=z.installation,T=z.sources,W=z.sinks,M=z.languages,U=z.frameworks,P=z.databases,$=z.technologies,q=z.installation_guides,G=R.platforms,V=N&&G[N],Z=I&&T[I],H=L&&W[L],K=b&&M.find((function(n){return n.name===b})),J=w&&U.find((function(n){return n.name===w})),Q=x&&P.find((function(n){return n.name===x})),Y=C&&$.find((function(n){return n.name===C})),X=j&&q.find((function(n){return n.name===j})),nn=null!==(V||Z),tn=null!=H,en=null;J?en=r?J.dark_logo_path:J.logo_path:Y?en=r?Y.dark_logo_path:Y.logo_path:Q?en=r?Q.dark_logo_path:Q.logo_path:X?en=r?X.dark_logo_path:X.logo_path:K?en=r?K.dark_logo_path:K.logo_path:V?en=V.logo_path:Z&&(en=Z.logo_path);var rn=null;return H&&(rn=H.logo_path),u.a.createElement(i.a,{to:v+"/",className:"guide-item"},u.a.createElement("article",null,u.a.createElement("div",{className:"domain-bg domain-bg--"+m+" domain-bg--hover"},u.a.createElement("header",null,u.a.createElement("div",{className:"category"},a[0].name),u.a.createElement("h2",{title:g},h&&h+". ",p||g)),u.a.createElement("footer",null,en&&u.a.createElement(o.a,{src:en,className:"logo"}),!en&&nn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),rn&&u.a.createElement(o.a,{src:rn,className:"logo"}),!rn&&tn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),!en&&!rn&&!nn&&!tn&&u.a.createElement(c.a,{colorProfile:"guides",tags:d}),u.a.createElement("div",{className:"action"},"read now")))))},h=e(490),d=e(491),p=e.n(d),g=e(463),D=e.n(g);e(143);function _(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered,a=p()(e).map((function(n){return n.content.metadata.categories[t-1]})).uniqBy("permalink").sortBy("title").keyBy("permalink").value(),o=p.a.groupBy(e,(function(n){return n.content.metadata.categories[t-1].permalink})),c=Object(h.a)("h"+(t+1));return Object.keys(a).map((function(n,t){var e=o[n],l=a[n];return u.a.createElement("section",{key:t},u.a.createElement(c,{id:n},l.title),l.description&&u.a.createElement("div",{className:"sub-title"},l.description),u.a.createElement(m,{items:e,large:r,staggered:i}))}))}function m(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered;if(t)return u.a.createElement(_,{groupLevel:t,items:e});var a,o=(a=e,p.a.sortBy(a,["content.metadata.seriesPosition",function(n){return n.content.metadata.coverLabel.toLowerCase()}]));return u.a.createElement("div",{className:"guides"},u.a.createElement("div",{className:D()("guide-items",{"guide-items--l":r,"guide-items--staggered":i})},o.map((function(n){var t=n.content;return u.a.createElement(v,{key:t.metadata.permalink,frontMatter:t.frontMatter,metadata:t.metadata,truncated:t.metadata.truncated},u.a.createElement(t,null))}))))}t.a=m}}]); \ No newline at end of file +/*! For license information please see d9deea5f.ec3d210e.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[265],{417:function(n,t,e){"use strict";e.r(t);var r=e(0),u=e.n(r),i=e(487),a=e(556),o=e(470);t.default=function(n){var t=n.metadata.category,e=n.items;return u.a.createElement(i.a,{title:t.title+" Guides",description:"All "+t.title+" guides"},u.a.createElement("header",{className:"hero hero--clean"},u.a.createElement("div",{className:"container"},u.a.createElement("h1",null,t.title," Guides"),t.description&&u.a.createElement("div",{className:"hero--subtitle"},t.description),u.a.createElement("div",null,u.a.createElement(o.a,{to:"/guides"},"View All Guides")))),u.a.createElement("main",{className:"container container--s"},u.a.createElement(a.a,{items:e,staggered:null!=e[0].content.metadata.seriesPosition})))}},463:function(n,t,e){var r;!function(){"use strict";var e={}.hasOwnProperty;function u(){for(var n=[],t=0;t1?arguments[1]:void 0)}}),e(74)("find")},487:function(n,t,e){"use strict";e(497);var r=e(0),u=e.n(r),i=e(498),a=e(486),o=e(1),c=(e(488),e(489),e(499),e(470)),l=e(500),f=e(484),s=e.n(f),v=e(501),h=e.n(v),d=e(476),p=e(463),g=e.n(p),D=e(135),_=e.n(D),m=function(){return u.a.createElement("span",{className:g()(_.a.toggle,_.a.moon)})},y=function(){return u.a.createElement("span",{className:g()(_.a.toggle,_.a.sun)})},b=function(n){var t=Object(d.a)().isClient;return u.a.createElement(h.a,Object(o.a)({disabled:!t,icons:{checked:u.a.createElement(m,null),unchecked:u.a.createElement(y,null)}},n))};function E(){var n=Object(d.a)().siteConfig,t=(void 0===n?{}:n).customFields.metadata.latest_post,e=Date.parse(t.date),r=new Date,u=Math.abs(r-e),i=Math.ceil(u/864e5),a=null;return"undefined"!=typeof window&&(a=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!a||a0&&u.a.createElement("div",{className:"row footer__links"},u.a.createElement("div",{className:"col col--5 footer__col"},u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement(s.a,{className:"navbar__logo",src:h,alt:"Qovery",width:"150",height:"auto"})),u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement("p",null,"Qovery is a DevOps Automation Platform Helping 200+ Organizations To Ship Faster and Eliminate DevOps Hiring Needs.")),u.a.createElement("div",null,u.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},u.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},u.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},u.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})))),c.map((function(n,t){return u.a.createElement("div",{key:t,className:"col footer__col"},null!=n.title?u.a.createElement("h4",{className:"footer__title"},n.title):null,null!=n.items&&Array.isArray(n.items)&&n.items.length>0?u.a.createElement("ul",{className:"footer__items"},n.items.map((function(n,t){return n.html?u.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):u.a.createElement("li",{key:n.href||n.to,className:"footer__item"},u.a.createElement(z,n))}))):null)}))),(f||a)&&u.a.createElement("div",{className:"text--center"},f&&f.src&&u.a.createElement("div",{className:"margin-bottom--sm"},f.href?u.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:L.a.footerLogoLink},u.a.createElement(R,{alt:f.alt,url:v})):u.a.createElement(R,{alt:f.alt,url:v})),u.a.createElement("small",null,a),u.a.createElement("br",null))))},W=e(502),M=e(503),U=e(3);e(138);t.a=function(n){var t=Object(d.a)().siteConfig,e=void 0===t?{}:t,r=e.title,o=e.themeConfig.image,c=e.url,l=n.children,f=n.title,s=n.noFooter,v=n.description,h=n.image,p=n.keywords,g=n.version,D=f?f+" | "+r:r,_=h||o,m=c+Object(F.a)(_),y=Object(U.h)(),b=y?"https://docs.qovery.com"+(y.pathname.endsWith("/")?y.pathname:y.pathname+"/"):null;return u.a.createElement(M.a,null,u.a.createElement(W.a,null,u.a.createElement(a.a,null,u.a.createElement("html",{lang:"en"}),u.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),D&&u.a.createElement("title",null,D),D&&u.a.createElement("meta",{property:"og:title",content:D}),u.a.createElement("link",{rel:"icon",href:"/favicons/favicon.svg"}),u.a.createElement("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}),u.a.createElement("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicons/favicon-32x32.png"}),u.a.createElement("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicons/favicon-16x16.png"}),u.a.createElement("link",{rel:"manifest",href:"/favicons/site.webmanifest"}),u.a.createElement("link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#5bbad5"}),u.a.createElement("meta",{name:"msapplication-TileColor",content:"#da532c"}),u.a.createElement("meta",{name:"theme-color",content:"#ffffff"}),v&&u.a.createElement("meta",{name:"description",content:v}),v&&u.a.createElement("meta",{property:"og:description",content:v}),g&&u.a.createElement("meta",{name:"docsearch:version",content:g}),p&&p.length&&u.a.createElement("meta",{name:"keywords",content:p.join(",")}),_&&u.a.createElement("meta",{property:"og:image",content:m}),_&&u.a.createElement("meta",{property:"twitter:image",content:m}),_&&u.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+D}),b&&u.a.createElement("meta",{property:"og:url",content:b}),u.a.createElement("meta",{name:"twitter:card",content:"summary"}),b&&u.a.createElement("link",{rel:"canonical",href:b})),u.a.createElement(i.a,null),u.a.createElement(B,null),u.a.createElement("div",{className:"main-wrapper"},l),!s&&u.a.createElement(T,null)))}},490:function(n,t,e){"use strict";var r=e(9),u=e(0),i=e.n(u),a=e(463),o=e.n(a),c=e(476),l=(e(139),e(140)),f=e.n(l);t.a=function(n){return function(t){var e,u=t.id,a=Object(r.a)(t,["id"]),l=Object(c.a)().siteConfig,s=(l=void 0===l?{}:l).themeConfig,v=(s=void 0===s?{}:s).navbar,h=(v=void 0===v?{}:v).hideOnScroll,d=void 0!==h&&h;return u?i.a.createElement(n,a,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:o()("anchor",(e={},e[f.a.enhancedAnchor]=!d,e)),id:u}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+u,title:"Direct link to heading"},"#"),a.children):i.a.createElement(n,a)}}},491:function(n,t,e){(function(n,r){var u;(function(){var i="Expected a function",a="__lodash_placeholder__",o=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",f="[object Boolean]",s="[object Date]",v="[object Error]",h="[object Function]",d="[object GeneratorFunction]",p="[object Map]",g="[object Number]",D="[object Object]",_="[object RegExp]",m="[object Set]",y="[object String]",b="[object Symbol]",E="[object WeakMap]",w="[object ArrayBuffer]",F="[object DataView]",C="[object Float32Array]",k="[object Float64Array]",x="[object Int8Array]",A="[object Int16Array]",j="[object Int32Array]",O="[object Uint8Array]",N="[object Uint16Array]",B="[object Uint32Array]",I=/\b__p \+= '';/g,S=/\b(__p \+=) '' \+/g,L=/(__e\(.*?\)|\b__t\)) \+\n'';/g,z=/&(?:amp|lt|gt|quot|#39);/g,R=/[&<>"']/g,T=RegExp(z.source),W=RegExp(R.source),M=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,P=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,q=/^\w*$/,G=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,V=/[\\^$.*+?()[\]{}|]/g,Z=RegExp(V.source),H=/^\s+|\s+$/g,K=/^\s+/,J=/\s+$/,Q=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,nn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,tn=/\\(\\)?/g,en=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,rn=/\w*$/,un=/^[-+]0x[0-9a-f]+$/i,an=/^0b[01]+$/i,on=/^\[object .+?Constructor\]$/,cn=/^0o[0-7]+$/i,ln=/^(?:0|[1-9]\d*)$/,fn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,sn=/($^)/,vn=/['\n\r\u2028\u2029\\]/g,hn="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",dn="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",pn="[\\ud800-\\udfff]",gn="["+dn+"]",Dn="["+hn+"]",_n="\\d+",mn="[\\u2700-\\u27bf]",yn="[a-z\\xdf-\\xf6\\xf8-\\xff]",bn="[^\\ud800-\\udfff"+dn+_n+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",En="\\ud83c[\\udffb-\\udfff]",wn="[^\\ud800-\\udfff]",Fn="(?:\\ud83c[\\udde6-\\uddff]){2}",Cn="[\\ud800-\\udbff][\\udc00-\\udfff]",kn="[A-Z\\xc0-\\xd6\\xd8-\\xde]",xn="(?:"+yn+"|"+bn+")",An="(?:"+kn+"|"+bn+")",jn="(?:"+Dn+"|"+En+")"+"?",On="[\\ufe0e\\ufe0f]?"+jn+("(?:\\u200d(?:"+[wn,Fn,Cn].join("|")+")[\\ufe0e\\ufe0f]?"+jn+")*"),Nn="(?:"+[mn,Fn,Cn].join("|")+")"+On,Bn="(?:"+[wn+Dn+"?",Dn,Fn,Cn,pn].join("|")+")",In=RegExp("['\u2019]","g"),Sn=RegExp(Dn,"g"),Ln=RegExp(En+"(?="+En+")|"+Bn+On,"g"),zn=RegExp([kn+"?"+yn+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[gn,kn,"$"].join("|")+")",An+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[gn,kn+xn,"$"].join("|")+")",kn+"?"+xn+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",kn+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",_n,Nn].join("|"),"g"),Rn=RegExp("[\\u200d\\ud800-\\udfff"+hn+"\\ufe0e\\ufe0f]"),Tn=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Mn=-1,Un={};Un[C]=Un[k]=Un[x]=Un[A]=Un[j]=Un[O]=Un["[object Uint8ClampedArray]"]=Un[N]=Un[B]=!0,Un[c]=Un[l]=Un[w]=Un[f]=Un[F]=Un[s]=Un[v]=Un[h]=Un[p]=Un[g]=Un[D]=Un[_]=Un[m]=Un[y]=Un[E]=!1;var Pn={};Pn[c]=Pn[l]=Pn[w]=Pn[F]=Pn[f]=Pn[s]=Pn[C]=Pn[k]=Pn[x]=Pn[A]=Pn[j]=Pn[p]=Pn[g]=Pn[D]=Pn[_]=Pn[m]=Pn[y]=Pn[b]=Pn[O]=Pn["[object Uint8ClampedArray]"]=Pn[N]=Pn[B]=!0,Pn[v]=Pn[h]=Pn[E]=!1;var $n={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},qn=parseFloat,Gn=parseInt,Vn="object"==typeof n&&n&&n.Object===Object&&n,Zn="object"==typeof self&&self&&self.Object===Object&&self,Hn=Vn||Zn||Function("return this")(),Kn=t&&!t.nodeType&&t,Jn=Kn&&"object"==typeof r&&r&&!r.nodeType&&r,Qn=Jn&&Jn.exports===Kn,Yn=Qn&&Vn.process,Xn=function(){try{var n=Jn&&Jn.require&&Jn.require("util").types;return n||Yn&&Yn.binding&&Yn.binding("util")}catch(t){}}(),nt=Xn&&Xn.isArrayBuffer,tt=Xn&&Xn.isDate,et=Xn&&Xn.isMap,rt=Xn&&Xn.isRegExp,ut=Xn&&Xn.isSet,it=Xn&&Xn.isTypedArray;function at(n,t,e){switch(e.length){case 0:return n.call(t);case 1:return n.call(t,e[0]);case 2:return n.call(t,e[0],e[1]);case 3:return n.call(t,e[0],e[1],e[2])}return n.apply(t,e)}function ot(n,t,e,r){for(var u=-1,i=null==n?0:n.length;++u-1}function ht(n,t,e){for(var r=-1,u=null==n?0:n.length;++r-1;);return e}function Lt(n,t){for(var e=n.length;e--&&Et(t,n[e],0)>-1;);return e}function zt(n,t){for(var e=n.length,r=0;e--;)n[e]===t&&++r;return r}var Rt=xt({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Tt=xt({"&":"&","<":"<",">":">",'"':""","'":"'"});function Wt(n){return"\\"+$n[n]}function Mt(n){return Rn.test(n)}function Ut(n){var t=-1,e=Array(n.size);return n.forEach((function(n,r){e[++t]=[r,n]})),e}function Pt(n,t){return function(e){return n(t(e))}}function $t(n,t){for(var e=-1,r=n.length,u=0,i=[];++e",""":'"',"'":"'"});var Kt=function n(t){var e,r=(t=null==t?Hn:Kt.defaults(Hn.Object(),t,Kt.pick(Hn,Wn))).Array,u=t.Date,hn=t.Error,dn=t.Function,pn=t.Math,gn=t.Object,Dn=t.RegExp,_n=t.String,mn=t.TypeError,yn=r.prototype,bn=dn.prototype,En=gn.prototype,wn=t["__core-js_shared__"],Fn=bn.toString,Cn=En.hasOwnProperty,kn=0,xn=(e=/[^.]+$/.exec(wn&&wn.keys&&wn.keys.IE_PROTO||""))?"Symbol(src)_1."+e:"",An=En.toString,jn=Fn.call(gn),On=Hn._,Nn=Dn("^"+Fn.call(Cn).replace(V,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Bn=Qn?t.Buffer:void 0,Ln=t.Symbol,Rn=t.Uint8Array,$n=Bn?Bn.allocUnsafe:void 0,Vn=Pt(gn.getPrototypeOf,gn),Zn=gn.create,Kn=En.propertyIsEnumerable,Jn=yn.splice,Yn=Ln?Ln.isConcatSpreadable:void 0,Xn=Ln?Ln.iterator:void 0,mt=Ln?Ln.toStringTag:void 0,xt=function(){try{var n=Xu(gn,"defineProperty");return n({},"",{}),n}catch(t){}}(),Jt=t.clearTimeout!==Hn.clearTimeout&&t.clearTimeout,Qt=u&&u.now!==Hn.Date.now&&u.now,Yt=t.setTimeout!==Hn.setTimeout&&t.setTimeout,Xt=pn.ceil,ne=pn.floor,te=gn.getOwnPropertySymbols,ee=Bn?Bn.isBuffer:void 0,re=t.isFinite,ue=yn.join,ie=Pt(gn.keys,gn),ae=pn.max,oe=pn.min,ce=u.now,le=t.parseInt,fe=pn.random,se=yn.reverse,ve=Xu(t,"DataView"),he=Xu(t,"Map"),de=Xu(t,"Promise"),pe=Xu(t,"Set"),ge=Xu(t,"WeakMap"),De=Xu(gn,"create"),_e=ge&&new ge,me={},ye=ki(ve),be=ki(he),Ee=ki(de),we=ki(pe),Fe=ki(ge),Ce=Ln?Ln.prototype:void 0,ke=Ce?Ce.valueOf:void 0,xe=Ce?Ce.toString:void 0;function Ae(n){if($a(n)&&!Ba(n)&&!(n instanceof Be)){if(n instanceof Ne)return n;if(Cn.call(n,"__wrapped__"))return xi(n)}return new Ne(n)}var je=function(){function n(){}return function(t){if(!Pa(t))return{};if(Zn)return Zn(t);n.prototype=t;var e=new n;return n.prototype=void 0,e}}();function Oe(){}function Ne(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Be(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Ie(n){var t=-1,e=null==n?0:n.length;for(this.clear();++t=t?n:t)),n}function Je(n,t,e,r,u,i){var a,o=1&t,l=2&t,v=4&t;if(e&&(a=u?e(n,r,u,i):e(n)),void 0!==a)return a;if(!Pa(n))return n;var E=Ba(n);if(E){if(a=function(n){var t=n.length,e=new n.constructor(t);t&&"string"==typeof n[0]&&Cn.call(n,"index")&&(e.index=n.index,e.input=n.input);return e}(n),!o)return Du(n,a)}else{var I=ei(n),S=I==h||I==d;if(za(n))return su(n,o);if(I==D||I==c||S&&!u){if(a=l||S?{}:ui(n),!o)return l?function(n,t){return _u(n,ti(n),t)}(n,function(n,t){return n&&_u(t,bo(t),n)}(a,n)):function(n,t){return _u(n,ni(n),t)}(n,Ve(a,n))}else{if(!Pn[I])return u?n:{};a=function(n,t,e){var r=n.constructor;switch(t){case w:return vu(n);case f:case s:return new r(+n);case F:return function(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.byteLength)}(n,e);case C:case k:case x:case A:case j:case O:case"[object Uint8ClampedArray]":case N:case B:return hu(n,e);case p:return new r;case g:case y:return new r(n);case _:return function(n){var t=new n.constructor(n.source,rn.exec(n));return t.lastIndex=n.lastIndex,t}(n);case m:return new r;case b:return u=n,ke?gn(ke.call(u)):{}}var u}(n,I,o)}}i||(i=new Re);var L=i.get(n);if(L)return L;i.set(n,a),Ha(n)?n.forEach((function(r){a.add(Je(r,t,e,r,n,i))})):qa(n)&&n.forEach((function(r,u){a.set(u,Je(r,t,e,u,n,i))}));var z=E?void 0:(v?l?Vu:Gu:l?bo:yo)(n);return ct(z||n,(function(r,u){z&&(r=n[u=r]),$e(a,u,Je(r,t,e,u,n,i))})),a}function Qe(n,t,e){var r=e.length;if(null==n)return!r;for(n=gn(n);r--;){var u=e[r],i=t[u],a=n[u];if(void 0===a&&!(u in n)||!i(a))return!1}return!0}function Ye(n,t,e){if("function"!=typeof n)throw new mn(i);return mi((function(){n.apply(void 0,e)}),t)}function Xe(n,t,e,r){var u=-1,i=vt,a=!0,o=n.length,c=[],l=t.length;if(!o)return c;e&&(t=dt(t,Nt(e))),r?(i=ht,a=!1):t.length>=200&&(i=It,a=!1,t=new ze(t));n:for(;++u-1},Se.prototype.set=function(n,t){var e=this.__data__,r=qe(e,n);return r<0?(++this.size,e.push([n,t])):e[r][1]=t,this},Le.prototype.clear=function(){this.size=0,this.__data__={hash:new Ie,map:new(he||Se),string:new Ie}},Le.prototype.delete=function(n){var t=Qu(this,n).delete(n);return this.size-=t?1:0,t},Le.prototype.get=function(n){return Qu(this,n).get(n)},Le.prototype.has=function(n){return Qu(this,n).has(n)},Le.prototype.set=function(n,t){var e=Qu(this,n),r=e.size;return e.set(n,t),this.size+=e.size==r?0:1,this},ze.prototype.add=ze.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},ze.prototype.has=function(n){return this.__data__.has(n)},Re.prototype.clear=function(){this.__data__=new Se,this.size=0},Re.prototype.delete=function(n){var t=this.__data__,e=t.delete(n);return this.size=t.size,e},Re.prototype.get=function(n){return this.__data__.get(n)},Re.prototype.has=function(n){return this.__data__.has(n)},Re.prototype.set=function(n,t){var e=this.__data__;if(e instanceof Se){var r=e.__data__;if(!he||r.length<199)return r.push([n,t]),this.size=++e.size,this;e=this.__data__=new Le(r)}return e.set(n,t),this.size=e.size,this};var nr=bu(cr),tr=bu(lr,!0);function er(n,t){var e=!0;return nr(n,(function(n,r,u){return e=!!t(n,r,u)})),e}function rr(n,t,e){for(var r=-1,u=n.length;++r0&&e(o)?t>1?ir(o,t-1,e,r,u):pt(u,o):r||(u[u.length]=o)}return u}var ar=Eu(),or=Eu(!0);function cr(n,t){return n&&ar(n,t,yo)}function lr(n,t){return n&&or(n,t,yo)}function fr(n,t){return st(t,(function(t){return Wa(n[t])}))}function sr(n,t){for(var e=0,r=(t=ou(t,n)).length;null!=n&&et}function pr(n,t){return null!=n&&Cn.call(n,t)}function gr(n,t){return null!=n&&t in gn(n)}function Dr(n,t,e){for(var u=e?ht:vt,i=n[0].length,a=n.length,o=a,c=r(a),l=1/0,f=[];o--;){var s=n[o];o&&t&&(s=dt(s,Nt(t))),l=oe(s.length,l),c[o]=!e&&(t||i>=120&&s.length>=120)?new ze(o&&s):void 0}s=n[0];var v=-1,h=c[0];n:for(;++v=o)return c;var l=e[r];return c*("desc"==l?-1:1)}}return n.index-t.index}(n,t,e)}))}function Ir(n,t,e){for(var r=-1,u=t.length,i={};++r-1;)o!==n&&Jn.call(o,c,1),Jn.call(n,c,1);return n}function Lr(n,t){for(var e=n?t.length:0,r=e-1;e--;){var u=t[e];if(e==r||u!==i){var i=u;ai(u)?Jn.call(n,u,1):Xr(n,u)}}return n}function zr(n,t){return n+ne(fe()*(t-n+1))}function Rr(n,t){var e="";if(!n||t<1||t>9007199254740991)return e;do{t%2&&(e+=n),(t=ne(t/2))&&(n+=n)}while(t);return e}function Tr(n,t){return yi(di(n,t,Vo),n+"")}function Wr(n){return We(jo(n))}function Mr(n,t){var e=jo(n);return wi(e,Ke(t,0,e.length))}function Ur(n,t,e,r){if(!Pa(n))return n;for(var u=-1,i=(t=ou(t,n)).length,a=i-1,o=n;null!=o&&++ui?0:i+t),(e=e>i?i:e)<0&&(e+=i),i=t>e?0:e-t>>>0,t>>>=0;for(var a=r(i);++u>>1,a=n[i];null!==a&&!Ja(a)&&(e?a<=t:a=200){var l=t?null:Ru(n);if(l)return qt(l);a=!1,u=It,c=new ze}else c=t?[]:o;n:for(;++r=r?n:Gr(n,t,e)}var fu=Jt||function(n){return Hn.clearTimeout(n)};function su(n,t){if(t)return n.slice();var e=n.length,r=$n?$n(e):new n.constructor(e);return n.copy(r),r}function vu(n){var t=new n.constructor(n.byteLength);return new Rn(t).set(new Rn(n)),t}function hu(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.length)}function du(n,t){if(n!==t){var e=void 0!==n,r=null===n,u=n==n,i=Ja(n),a=void 0!==t,o=null===t,c=t==t,l=Ja(t);if(!o&&!l&&!i&&n>t||i&&a&&c&&!o&&!l||r&&a&&c||!e&&c||!u)return 1;if(!r&&!i&&!l&&n1?e[u-1]:void 0,a=u>2?e[2]:void 0;for(i=n.length>3&&"function"==typeof i?(u--,i):void 0,a&&oi(e[0],e[1],a)&&(i=u<3?void 0:i,u=1),t=gn(t);++r-1?u[i?t[a]:a]:void 0}}function xu(n){return qu((function(t){var e=t.length,r=e,u=Ne.prototype.thru;for(n&&t.reverse();r--;){var a=t[r];if("function"!=typeof a)throw new mn(i);if(u&&!o&&"wrapper"==Hu(a))var o=new Ne([],!0)}for(r=o?r:e;++r1&&m.reverse(),s&&l<_&&(m.length=l),this&&this!==Hn&&this instanceof D&&(C=g||Cu(C)),C.apply(F,m)}}function ju(n,t){return function(e,r){return function(n,t,e,r){return cr(n,(function(n,u,i){t(r,e(n),u,i)})),r}(e,n,t(r),{})}}function Ou(n,t){return function(e,r){var u;if(void 0===e&&void 0===r)return t;if(void 0!==e&&(u=e),void 0!==r){if(void 0===u)return r;"string"==typeof e||"string"==typeof r?(e=Qr(e),r=Qr(r)):(e=Jr(e),r=Jr(r)),u=n(e,r)}return u}}function Nu(n){return qu((function(t){return t=dt(t,Nt(Ju())),Tr((function(e){var r=this;return n(t,(function(n){return at(n,r,e)}))}))}))}function Bu(n,t){var e=(t=void 0===t?" ":Qr(t)).length;if(e<2)return e?Rr(t,n):t;var r=Rr(t,Xt(n/Vt(t)));return Mt(t)?lu(Zt(r),0,n).join(""):r.slice(0,n)}function Iu(n){return function(t,e,u){return u&&"number"!=typeof u&&oi(t,e,u)&&(e=u=void 0),t=to(t),void 0===e?(e=t,t=0):e=to(e),function(n,t,e,u){for(var i=-1,a=ae(Xt((t-n)/(e||1)),0),o=r(a);a--;)o[u?a:++i]=n,n+=e;return o}(t,e,u=void 0===u?to))return!1;var l=i.get(n);if(l&&i.get(t))return l==t;var f=-1,s=!0,v=2&e?new ze:void 0;for(i.set(n,t),i.set(t,n);++f-1&&n%1==0&&n1?"& ":"")+t[r],t=t.join(e>2?", ":" "),n.replace(Q,"{\n/* [wrapped with "+t+"] */\n")}(r,function(n,t){return ct(o,(function(e){var r="_."+e[0];t&e[1]&&!vt(n,r)&&n.push(r)})),n.sort()}(function(n){var t=n.match(Y);return t?t[1].split(X):[]}(r),e)))}function Ei(n){var t=0,e=0;return function(){var r=ce(),u=16-(r-e);if(e=r,u>0){if(++t>=800)return arguments[0]}else t=0;return n.apply(void 0,arguments)}}function wi(n,t){var e=-1,r=n.length,u=r-1;for(t=void 0===t?r:t;++e1?n[t-1]:void 0;return e="function"==typeof e?(n.pop(),e):void 0,Zi(n,e)}));function na(n){var t=Ae(n);return t.__chain__=!0,t}function ta(n,t){return t(n)}var ea=qu((function(n){var t=n.length,e=t?n[0]:0,r=this.__wrapped__,u=function(t){return He(t,n)};return!(t>1||this.__actions__.length)&&r instanceof Be&&ai(e)?((r=r.slice(e,+e+(t?1:0))).__actions__.push({func:ta,args:[u],thisArg:void 0}),new Ne(r,this.__chain__).thru((function(n){return t&&!n.length&&n.push(void 0),n}))):this.thru(u)}));var ra=mu((function(n,t,e){Cn.call(n,e)?++n[e]:Ze(n,e,1)}));var ua=ku(Ni),ia=ku(Bi);function aa(n,t){return(Ba(n)?ct:nr)(n,Ju(t,3))}function oa(n,t){return(Ba(n)?lt:tr)(n,Ju(t,3))}var ca=mu((function(n,t,e){Cn.call(n,e)?n[e].push(t):Ze(n,e,[t])}));var la=Tr((function(n,t,e){var u=-1,i="function"==typeof t,a=Sa(n)?r(n.length):[];return nr(n,(function(n){a[++u]=i?at(t,n,e):_r(n,t,e)})),a})),fa=mu((function(n,t,e){Ze(n,e,t)}));function sa(n,t){return(Ba(n)?dt:xr)(n,Ju(t,3))}var va=mu((function(n,t,e){n[e?0:1].push(t)}),(function(){return[[],[]]}));var ha=Tr((function(n,t){if(null==n)return[];var e=t.length;return e>1&&oi(n,t[0],t[1])?t=[]:e>2&&oi(t[0],t[1],t[2])&&(t=[t[0]]),Br(n,ir(t,1),[])})),da=Qt||function(){return Hn.Date.now()};function pa(n,t,e){return t=e?void 0:t,Wu(n,128,void 0,void 0,void 0,void 0,t=n&&null==t?n.length:t)}function ga(n,t){var e;if("function"!=typeof t)throw new mn(i);return n=eo(n),function(){return--n>0&&(e=t.apply(this,arguments)),n<=1&&(t=void 0),e}}var Da=Tr((function(n,t,e){var r=1;if(e.length){var u=$t(e,Ku(Da));r|=32}return Wu(n,r,t,e,u)})),_a=Tr((function(n,t,e){var r=3;if(e.length){var u=$t(e,Ku(_a));r|=32}return Wu(t,r,n,e,u)}));function ma(n,t,e){var r,u,a,o,c,l,f=0,s=!1,v=!1,h=!0;if("function"!=typeof n)throw new mn(i);function d(t){var e=r,i=u;return r=u=void 0,f=t,o=n.apply(i,e)}function p(n){return f=n,c=mi(D,t),s?d(n):o}function g(n){var e=n-l;return void 0===l||e>=t||e<0||v&&n-f>=a}function D(){var n=da();if(g(n))return _(n);c=mi(D,function(n){var e=t-(n-l);return v?oe(e,a-(n-f)):e}(n))}function _(n){return c=void 0,h&&r?d(n):(r=u=void 0,o)}function m(){var n=da(),e=g(n);if(r=arguments,u=this,l=n,e){if(void 0===c)return p(l);if(v)return fu(c),c=mi(D,t),d(l)}return void 0===c&&(c=mi(D,t)),o}return t=uo(t)||0,Pa(e)&&(s=!!e.leading,a=(v="maxWait"in e)?ae(uo(e.maxWait)||0,t):a,h="trailing"in e?!!e.trailing:h),m.cancel=function(){void 0!==c&&fu(c),f=0,r=l=u=c=void 0},m.flush=function(){return void 0===c?o:_(da())},m}var ya=Tr((function(n,t){return Ye(n,1,t)})),ba=Tr((function(n,t,e){return Ye(n,uo(t)||0,e)}));function Ea(n,t){if("function"!=typeof n||null!=t&&"function"!=typeof t)throw new mn(i);var e=function(){var r=arguments,u=t?t.apply(this,r):r[0],i=e.cache;if(i.has(u))return i.get(u);var a=n.apply(this,r);return e.cache=i.set(u,a)||i,a};return e.cache=new(Ea.Cache||Le),e}function wa(n){if("function"!=typeof n)throw new mn(i);return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}Ea.Cache=Le;var Fa=cu((function(n,t){var e=(t=1==t.length&&Ba(t[0])?dt(t[0],Nt(Ju())):dt(ir(t,1),Nt(Ju()))).length;return Tr((function(r){for(var u=-1,i=oe(r.length,e);++u=t})),Na=mr(function(){return arguments}())?mr:function(n){return $a(n)&&Cn.call(n,"callee")&&!Kn.call(n,"callee")},Ba=r.isArray,Ia=nt?Nt(nt):function(n){return $a(n)&&hr(n)==w};function Sa(n){return null!=n&&Ua(n.length)&&!Wa(n)}function La(n){return $a(n)&&Sa(n)}var za=ee||ic,Ra=tt?Nt(tt):function(n){return $a(n)&&hr(n)==s};function Ta(n){if(!$a(n))return!1;var t=hr(n);return t==v||"[object DOMException]"==t||"string"==typeof n.message&&"string"==typeof n.name&&!Va(n)}function Wa(n){if(!Pa(n))return!1;var t=hr(n);return t==h||t==d||"[object AsyncFunction]"==t||"[object Proxy]"==t}function Ma(n){return"number"==typeof n&&n==eo(n)}function Ua(n){return"number"==typeof n&&n>-1&&n%1==0&&n<=9007199254740991}function Pa(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function $a(n){return null!=n&&"object"==typeof n}var qa=et?Nt(et):function(n){return $a(n)&&ei(n)==p};function Ga(n){return"number"==typeof n||$a(n)&&hr(n)==g}function Va(n){if(!$a(n)||hr(n)!=D)return!1;var t=Vn(n);if(null===t)return!0;var e=Cn.call(t,"constructor")&&t.constructor;return"function"==typeof e&&e instanceof e&&Fn.call(e)==jn}var Za=rt?Nt(rt):function(n){return $a(n)&&hr(n)==_};var Ha=ut?Nt(ut):function(n){return $a(n)&&ei(n)==m};function Ka(n){return"string"==typeof n||!Ba(n)&&$a(n)&&hr(n)==y}function Ja(n){return"symbol"==typeof n||$a(n)&&hr(n)==b}var Qa=it?Nt(it):function(n){return $a(n)&&Ua(n.length)&&!!Un[hr(n)]};var Ya=Su(kr),Xa=Su((function(n,t){return n<=t}));function no(n){if(!n)return[];if(Sa(n))return Ka(n)?Zt(n):Du(n);if(Xn&&n[Xn])return function(n){for(var t,e=[];!(t=n.next()).done;)e.push(t.value);return e}(n[Xn]());var t=ei(n);return(t==p?Ut:t==m?qt:jo)(n)}function to(n){return n?(n=uo(n))===1/0||n===-1/0?17976931348623157e292*(n<0?-1:1):n==n?n:0:0===n?n:0}function eo(n){var t=to(n),e=t%1;return t==t?e?t-e:t:0}function ro(n){return n?Ke(eo(n),0,4294967295):0}function uo(n){if("number"==typeof n)return n;if(Ja(n))return NaN;if(Pa(n)){var t="function"==typeof n.valueOf?n.valueOf():n;n=Pa(t)?t+"":t}if("string"!=typeof n)return 0===n?n:+n;n=n.replace(H,"");var e=an.test(n);return e||cn.test(n)?Gn(n.slice(2),e?2:8):un.test(n)?NaN:+n}function io(n){return _u(n,bo(n))}function ao(n){return null==n?"":Qr(n)}var oo=yu((function(n,t){if(si(t)||Sa(t))_u(t,yo(t),n);else for(var e in t)Cn.call(t,e)&&$e(n,e,t[e])})),co=yu((function(n,t){_u(t,bo(t),n)})),lo=yu((function(n,t,e,r){_u(t,bo(t),n,r)})),fo=yu((function(n,t,e,r){_u(t,yo(t),n,r)})),so=qu(He);var vo=Tr((function(n,t){n=gn(n);var e=-1,r=t.length,u=r>2?t[2]:void 0;for(u&&oi(t[0],t[1],u)&&(r=1);++e1),t})),_u(n,Vu(n),e),r&&(e=Je(e,7,Pu));for(var u=t.length;u--;)Xr(e,t[u]);return e}));var Co=qu((function(n,t){return null==n?{}:function(n,t){return Ir(n,t,(function(t,e){return go(n,e)}))}(n,t)}));function ko(n,t){if(null==n)return{};var e=dt(Vu(n),(function(n){return[n]}));return t=Ju(t),Ir(n,e,(function(n,e){return t(n,e[0])}))}var xo=Tu(yo),Ao=Tu(bo);function jo(n){return null==n?[]:Bt(n,yo(n))}var Oo=Fu((function(n,t,e){return t=t.toLowerCase(),n+(e?No(t):t)}));function No(n){return Wo(ao(n).toLowerCase())}function Bo(n){return(n=ao(n))&&n.replace(fn,Rt).replace(Sn,"")}var Io=Fu((function(n,t,e){return n+(e?"-":"")+t.toLowerCase()})),So=Fu((function(n,t,e){return n+(e?" ":"")+t.toLowerCase()})),Lo=wu("toLowerCase");var zo=Fu((function(n,t,e){return n+(e?"_":"")+t.toLowerCase()}));var Ro=Fu((function(n,t,e){return n+(e?" ":"")+Wo(t)}));var To=Fu((function(n,t,e){return n+(e?" ":"")+t.toUpperCase()})),Wo=wu("toUpperCase");function Mo(n,t,e){return n=ao(n),void 0===(t=e?void 0:t)?function(n){return Tn.test(n)}(n)?function(n){return n.match(zn)||[]}(n):function(n){return n.match(nn)||[]}(n):n.match(t)||[]}var Uo=Tr((function(n,t){try{return at(n,void 0,t)}catch(e){return Ta(e)?e:new hn(e)}})),Po=qu((function(n,t){return ct(t,(function(t){t=Ci(t),Ze(n,t,Da(n[t],n))})),n}));function $o(n){return function(){return n}}var qo=xu(),Go=xu(!0);function Vo(n){return n}function Zo(n){return wr("function"==typeof n?n:Je(n,1))}var Ho=Tr((function(n,t){return function(e){return _r(e,n,t)}})),Ko=Tr((function(n,t){return function(e){return _r(n,e,t)}}));function Jo(n,t,e){var r=yo(t),u=fr(t,r);null!=e||Pa(t)&&(u.length||!r.length)||(e=t,t=n,n=this,u=fr(t,yo(t)));var i=!(Pa(e)&&"chain"in e&&!e.chain),a=Wa(n);return ct(u,(function(e){var r=t[e];n[e]=r,a&&(n.prototype[e]=function(){var t=this.__chain__;if(i||t){var e=n(this.__wrapped__),u=e.__actions__=Du(this.__actions__);return u.push({func:r,args:arguments,thisArg:n}),e.__chain__=t,e}return r.apply(n,pt([this.value()],arguments))})})),n}function Qo(){}var Yo=Nu(dt),Xo=Nu(ft),nc=Nu(_t);function tc(n){return ci(n)?kt(Ci(n)):function(n){return function(t){return sr(t,n)}}(n)}var ec=Iu(),rc=Iu(!0);function uc(){return[]}function ic(){return!1}var ac=Ou((function(n,t){return n+t}),0),oc=zu("ceil"),cc=Ou((function(n,t){return n/t}),1),lc=zu("floor");var fc,sc=Ou((function(n,t){return n*t}),1),vc=zu("round"),hc=Ou((function(n,t){return n-t}),0);return Ae.after=function(n,t){if("function"!=typeof t)throw new mn(i);return n=eo(n),function(){if(--n<1)return t.apply(this,arguments)}},Ae.ary=pa,Ae.assign=oo,Ae.assignIn=co,Ae.assignInWith=lo,Ae.assignWith=fo,Ae.at=so,Ae.before=ga,Ae.bind=Da,Ae.bindAll=Po,Ae.bindKey=_a,Ae.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return Ba(n)?n:[n]},Ae.chain=na,Ae.chunk=function(n,t,e){t=(e?oi(n,t,e):void 0===t)?1:ae(eo(t),0);var u=null==n?0:n.length;if(!u||t<1)return[];for(var i=0,a=0,o=r(Xt(u/t));iu?0:u+e),(r=void 0===r||r>u?u:eo(r))<0&&(r+=u),r=e>r?0:ro(r);e>>0)?(n=ao(n))&&("string"==typeof t||null!=t&&!Za(t))&&!(t=Qr(t))&&Mt(n)?lu(Zt(n),0,e):n.split(t,e):[]},Ae.spread=function(n,t){if("function"!=typeof n)throw new mn(i);return t=null==t?0:ae(eo(t),0),Tr((function(e){var r=e[t],u=lu(e,0,t);return r&&pt(u,r),at(n,this,u)}))},Ae.tail=function(n){var t=null==n?0:n.length;return t?Gr(n,1,t):[]},Ae.take=function(n,t,e){return n&&n.length?Gr(n,0,(t=e||void 0===t?1:eo(t))<0?0:t):[]},Ae.takeRight=function(n,t,e){var r=null==n?0:n.length;return r?Gr(n,(t=r-(t=e||void 0===t?1:eo(t)))<0?0:t,r):[]},Ae.takeRightWhile=function(n,t){return n&&n.length?tu(n,Ju(t,3),!1,!0):[]},Ae.takeWhile=function(n,t){return n&&n.length?tu(n,Ju(t,3)):[]},Ae.tap=function(n,t){return t(n),n},Ae.throttle=function(n,t,e){var r=!0,u=!0;if("function"!=typeof n)throw new mn(i);return Pa(e)&&(r="leading"in e?!!e.leading:r,u="trailing"in e?!!e.trailing:u),ma(n,t,{leading:r,maxWait:t,trailing:u})},Ae.thru=ta,Ae.toArray=no,Ae.toPairs=xo,Ae.toPairsIn=Ao,Ae.toPath=function(n){return Ba(n)?dt(n,Ci):Ja(n)?[n]:Du(Fi(ao(n)))},Ae.toPlainObject=io,Ae.transform=function(n,t,e){var r=Ba(n),u=r||za(n)||Qa(n);if(t=Ju(t,4),null==e){var i=n&&n.constructor;e=u?r?new i:[]:Pa(n)&&Wa(i)?je(Vn(n)):{}}return(u?ct:cr)(n,(function(n,r,u){return t(e,n,r,u)})),e},Ae.unary=function(n){return pa(n,1)},Ae.union=$i,Ae.unionBy=qi,Ae.unionWith=Gi,Ae.uniq=function(n){return n&&n.length?Yr(n):[]},Ae.uniqBy=function(n,t){return n&&n.length?Yr(n,Ju(t,2)):[]},Ae.uniqWith=function(n,t){return t="function"==typeof t?t:void 0,n&&n.length?Yr(n,void 0,t):[]},Ae.unset=function(n,t){return null==n||Xr(n,t)},Ae.unzip=Vi,Ae.unzipWith=Zi,Ae.update=function(n,t,e){return null==n?n:nu(n,t,au(e))},Ae.updateWith=function(n,t,e,r){return r="function"==typeof r?r:void 0,null==n?n:nu(n,t,au(e),r)},Ae.values=jo,Ae.valuesIn=function(n){return null==n?[]:Bt(n,bo(n))},Ae.without=Hi,Ae.words=Mo,Ae.wrap=function(n,t){return Ca(au(t),n)},Ae.xor=Ki,Ae.xorBy=Ji,Ae.xorWith=Qi,Ae.zip=Yi,Ae.zipObject=function(n,t){return uu(n||[],t||[],$e)},Ae.zipObjectDeep=function(n,t){return uu(n||[],t||[],Ur)},Ae.zipWith=Xi,Ae.entries=xo,Ae.entriesIn=Ao,Ae.extend=co,Ae.extendWith=lo,Jo(Ae,Ae),Ae.add=ac,Ae.attempt=Uo,Ae.camelCase=Oo,Ae.capitalize=No,Ae.ceil=oc,Ae.clamp=function(n,t,e){return void 0===e&&(e=t,t=void 0),void 0!==e&&(e=(e=uo(e))==e?e:0),void 0!==t&&(t=(t=uo(t))==t?t:0),Ke(uo(n),t,e)},Ae.clone=function(n){return Je(n,4)},Ae.cloneDeep=function(n){return Je(n,5)},Ae.cloneDeepWith=function(n,t){return Je(n,5,t="function"==typeof t?t:void 0)},Ae.cloneWith=function(n,t){return Je(n,4,t="function"==typeof t?t:void 0)},Ae.conformsTo=function(n,t){return null==t||Qe(n,t,yo(t))},Ae.deburr=Bo,Ae.defaultTo=function(n,t){return null==n||n!=n?t:n},Ae.divide=cc,Ae.endsWith=function(n,t,e){n=ao(n),t=Qr(t);var r=n.length,u=e=void 0===e?r:Ke(eo(e),0,r);return(e-=t.length)>=0&&n.slice(e,u)==t},Ae.eq=Aa,Ae.escape=function(n){return(n=ao(n))&&W.test(n)?n.replace(R,Tt):n},Ae.escapeRegExp=function(n){return(n=ao(n))&&Z.test(n)?n.replace(V,"\\$&"):n},Ae.every=function(n,t,e){var r=Ba(n)?ft:er;return e&&oi(n,t,e)&&(t=void 0),r(n,Ju(t,3))},Ae.find=ua,Ae.findIndex=Ni,Ae.findKey=function(n,t){return yt(n,Ju(t,3),cr)},Ae.findLast=ia,Ae.findLastIndex=Bi,Ae.findLastKey=function(n,t){return yt(n,Ju(t,3),lr)},Ae.floor=lc,Ae.forEach=aa,Ae.forEachRight=oa,Ae.forIn=function(n,t){return null==n?n:ar(n,Ju(t,3),bo)},Ae.forInRight=function(n,t){return null==n?n:or(n,Ju(t,3),bo)},Ae.forOwn=function(n,t){return n&&cr(n,Ju(t,3))},Ae.forOwnRight=function(n,t){return n&&lr(n,Ju(t,3))},Ae.get=po,Ae.gt=ja,Ae.gte=Oa,Ae.has=function(n,t){return null!=n&&ri(n,t,pr)},Ae.hasIn=go,Ae.head=Si,Ae.identity=Vo,Ae.includes=function(n,t,e,r){n=Sa(n)?n:jo(n),e=e&&!r?eo(e):0;var u=n.length;return e<0&&(e=ae(u+e,0)),Ka(n)?e<=u&&n.indexOf(t,e)>-1:!!u&&Et(n,t,e)>-1},Ae.indexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=null==e?0:eo(e);return u<0&&(u=ae(r+u,0)),Et(n,t,u)},Ae.inRange=function(n,t,e){return t=to(t),void 0===e?(e=t,t=0):e=to(e),function(n,t,e){return n>=oe(t,e)&&n=-9007199254740991&&n<=9007199254740991},Ae.isSet=Ha,Ae.isString=Ka,Ae.isSymbol=Ja,Ae.isTypedArray=Qa,Ae.isUndefined=function(n){return void 0===n},Ae.isWeakMap=function(n){return $a(n)&&ei(n)==E},Ae.isWeakSet=function(n){return $a(n)&&"[object WeakSet]"==hr(n)},Ae.join=function(n,t){return null==n?"":ue.call(n,t)},Ae.kebabCase=Io,Ae.last=Ti,Ae.lastIndexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=r;return void 0!==e&&(u=(u=eo(e))<0?ae(r+u,0):oe(u,r-1)),t==t?function(n,t,e){for(var r=e+1;r--;)if(n[r]===t)return r;return r}(n,t,u):bt(n,Ft,u,!0)},Ae.lowerCase=So,Ae.lowerFirst=Lo,Ae.lt=Ya,Ae.lte=Xa,Ae.max=function(n){return n&&n.length?rr(n,Vo,dr):void 0},Ae.maxBy=function(n,t){return n&&n.length?rr(n,Ju(t,2),dr):void 0},Ae.mean=function(n){return Ct(n,Vo)},Ae.meanBy=function(n,t){return Ct(n,Ju(t,2))},Ae.min=function(n){return n&&n.length?rr(n,Vo,kr):void 0},Ae.minBy=function(n,t){return n&&n.length?rr(n,Ju(t,2),kr):void 0},Ae.stubArray=uc,Ae.stubFalse=ic,Ae.stubObject=function(){return{}},Ae.stubString=function(){return""},Ae.stubTrue=function(){return!0},Ae.multiply=sc,Ae.nth=function(n,t){return n&&n.length?Nr(n,eo(t)):void 0},Ae.noConflict=function(){return Hn._===this&&(Hn._=On),this},Ae.noop=Qo,Ae.now=da,Ae.pad=function(n,t,e){n=ao(n);var r=(t=eo(t))?Vt(n):0;if(!t||r>=t)return n;var u=(t-r)/2;return Bu(ne(u),e)+n+Bu(Xt(u),e)},Ae.padEnd=function(n,t,e){n=ao(n);var r=(t=eo(t))?Vt(n):0;return t&&rt){var r=n;n=t,t=r}if(e||n%1||t%1){var u=fe();return oe(n+u*(t-n+qn("1e-"+((u+"").length-1))),t)}return zr(n,t)},Ae.reduce=function(n,t,e){var r=Ba(n)?gt:At,u=arguments.length<3;return r(n,Ju(t,4),e,u,nr)},Ae.reduceRight=function(n,t,e){var r=Ba(n)?Dt:At,u=arguments.length<3;return r(n,Ju(t,4),e,u,tr)},Ae.repeat=function(n,t,e){return t=(e?oi(n,t,e):void 0===t)?1:eo(t),Rr(ao(n),t)},Ae.replace=function(){var n=arguments,t=ao(n[0]);return n.length<3?t:t.replace(n[1],n[2])},Ae.result=function(n,t,e){var r=-1,u=(t=ou(t,n)).length;for(u||(u=1,n=void 0);++r9007199254740991)return[];var e=4294967295,r=oe(n,4294967295);n-=4294967295;for(var u=Ot(r,t=Ju(t));++e=i)return n;var o=e-Vt(r);if(o<1)return r;var c=a?lu(a,0,o).join(""):n.slice(0,o);if(void 0===u)return c+r;if(a&&(o+=c.length-o),Za(u)){if(n.slice(o).search(u)){var l,f=c;for(u.global||(u=Dn(u.source,ao(rn.exec(u))+"g")),u.lastIndex=0;l=u.exec(f);)var s=l.index;c=c.slice(0,void 0===s?o:s)}}else if(n.indexOf(Qr(u),o)!=o){var v=c.lastIndexOf(u);v>-1&&(c=c.slice(0,v))}return c+r},Ae.unescape=function(n){return(n=ao(n))&&T.test(n)?n.replace(z,Ht):n},Ae.uniqueId=function(n){var t=++kn;return ao(n)+t},Ae.upperCase=To,Ae.upperFirst=Wo,Ae.each=aa,Ae.eachRight=oa,Ae.first=Si,Jo(Ae,(fc={},cr(Ae,(function(n,t){Cn.call(Ae.prototype,t)||(fc[t]=n)})),fc),{chain:!1}),Ae.VERSION="4.17.15",ct(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(n){Ae[n].placeholder=Ae})),ct(["drop","take"],(function(n,t){Be.prototype[n]=function(e){e=void 0===e?1:ae(eo(e),0);var r=this.__filtered__&&!t?new Be(this):this.clone();return r.__filtered__?r.__takeCount__=oe(e,r.__takeCount__):r.__views__.push({size:oe(e,4294967295),type:n+(r.__dir__<0?"Right":"")}),r},Be.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}})),ct(["filter","map","takeWhile"],(function(n,t){var e=t+1,r=1==e||3==e;Be.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:Ju(n,3),type:e}),t.__filtered__=t.__filtered__||r,t}})),ct(["head","last"],(function(n,t){var e="take"+(t?"Right":"");Be.prototype[n]=function(){return this[e](1).value()[0]}})),ct(["initial","tail"],(function(n,t){var e="drop"+(t?"":"Right");Be.prototype[n]=function(){return this.__filtered__?new Be(this):this[e](1)}})),Be.prototype.compact=function(){return this.filter(Vo)},Be.prototype.find=function(n){return this.filter(n).head()},Be.prototype.findLast=function(n){return this.reverse().find(n)},Be.prototype.invokeMap=Tr((function(n,t){return"function"==typeof n?new Be(this):this.map((function(e){return _r(e,n,t)}))})),Be.prototype.reject=function(n){return this.filter(wa(Ju(n)))},Be.prototype.slice=function(n,t){n=eo(n);var e=this;return e.__filtered__&&(n>0||t<0)?new Be(e):(n<0?e=e.takeRight(-n):n&&(e=e.drop(n)),void 0!==t&&(e=(t=eo(t))<0?e.dropRight(-t):e.take(t-n)),e)},Be.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Be.prototype.toArray=function(){return this.take(4294967295)},cr(Be.prototype,(function(n,t){var e=/^(?:filter|find|map|reject)|While$/.test(t),r=/^(?:head|last)$/.test(t),u=Ae[r?"take"+("last"==t?"Right":""):t],i=r||/^find/.test(t);u&&(Ae.prototype[t]=function(){var t=this.__wrapped__,a=r?[1]:arguments,o=t instanceof Be,c=a[0],l=o||Ba(t),f=function(n){var t=u.apply(Ae,pt([n],a));return r&&s?t[0]:t};l&&e&&"function"==typeof c&&1!=c.length&&(o=l=!1);var s=this.__chain__,v=!!this.__actions__.length,h=i&&!s,d=o&&!v;if(!i&&l){t=d?t:new Be(this);var p=n.apply(t,a);return p.__actions__.push({func:ta,args:[f],thisArg:void 0}),new Ne(p,s)}return h&&d?n.apply(this,a):(p=this.thru(f),h?r?p.value()[0]:p.value():p)})})),ct(["pop","push","shift","sort","splice","unshift"],(function(n){var t=yn[n],e=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",r=/^(?:pop|shift)$/.test(n);Ae.prototype[n]=function(){var n=arguments;if(r&&!this.__chain__){var u=this.value();return t.apply(Ba(u)?u:[],n)}return this[e]((function(e){return t.apply(Ba(e)?e:[],n)}))}})),cr(Be.prototype,(function(n,t){var e=Ae[t];if(e){var r=e.name+"";Cn.call(me,r)||(me[r]=[]),me[r].push({name:t,func:e})}})),me[Au(void 0,2).name]=[{name:"wrapper",func:void 0}],Be.prototype.clone=function(){var n=new Be(this.__wrapped__);return n.__actions__=Du(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Du(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Du(this.__views__),n},Be.prototype.reverse=function(){if(this.__filtered__){var n=new Be(this);n.__dir__=-1,n.__filtered__=!0}else(n=this.clone()).__dir__*=-1;return n},Be.prototype.value=function(){var n=this.__wrapped__.value(),t=this.__dir__,e=Ba(n),r=t<0,u=e?n.length:0,i=function(n,t,e){var r=-1,u=e.length;for(;++r=this.__values__.length;return{done:n,value:n?void 0:this.__values__[this.__index__++]}},Ae.prototype.plant=function(n){for(var t,e=this;e instanceof Oe;){var r=xi(e);r.__index__=0,r.__values__=void 0,t?u.__wrapped__=r:t=r;var u=r;e=e.__wrapped__}return u.__wrapped__=n,t},Ae.prototype.reverse=function(){var n=this.__wrapped__;if(n instanceof Be){var t=n;return this.__actions__.length&&(t=new Be(this)),(t=t.reverse()).__actions__.push({func:ta,args:[Pi],thisArg:void 0}),new Ne(t,this.__chain__)}return this.thru(Pi)},Ae.prototype.toJSON=Ae.prototype.valueOf=Ae.prototype.value=function(){return eu(this.__wrapped__,this.__actions__)},Ae.prototype.first=Ae.prototype.head,Xn&&(Ae.prototype[Xn]=function(){return this}),Ae}();Hn._=Kt,void 0===(u=function(){return Kt}.call(t,e,t,r))||(r.exports=u)}).call(this)}).call(this,e(76),e(496)(n))},494:function(n,t,e){"use strict";var r=e(0),u=Object(r.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=u},495:function(n,t,e){"use strict";e.d(t,"a",(function(){return i}));e(77),e(513),e(479),e(78);var r=e(515),u=e.n(r);function i(n,t){var e=new u.a;return n.map((function(n){var r=n;return"string"==typeof n&&(r={label:n,permalink:"/blog/tags/"+e.slug(n)}),function(n,t){var e=n.label.split(": ",2),r=e[0],u=e[1],i="primary";switch(t){case"blog":case"guides":i=function(n){switch(n){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(r)}return{category:r,count:n.count,label:n.label,permalink:n.permalink,style:i,value:u}}(r,t)}))}},496:function(n,t){n.exports=function(n){return n.webpackPolyfill||(n.deprecate=function(){},n.paths=[],n.children||(n.children=[]),Object.defineProperty(n,"loaded",{enumerable:!0,get:function(){return n.l}}),Object.defineProperty(n,"id",{enumerable:!0,get:function(){return n.i}}),n.webpackPolyfill=1),n}},505:function(n,t,e){var r=e(30),u=e(54),i=e(27),a=e(26),o=e(506);n.exports=function(n,t){var e=1==n,c=2==n,l=3==n,f=4==n,s=6==n,v=5==n||s,h=t||o;return function(t,o,d){for(var p,g,D=i(t),_=u(D),m=r(o,d,3),y=a(_.length),b=0,E=e?h(t,y):c?h(t,0):void 0;y>b;b++)if((v||b in _)&&(g=m(p=_[b],b,D),n))if(e)E[b]=g;else if(g)switch(n){case 3:return!0;case 5:return p;case 6:return b;case 2:E.push(p)}else if(f)return!1;return s?-1:l||f?f:E}}},506:function(n,t,e){var r=e(507);n.exports=function(n,t){return new(r(n))(t)}},507:function(n,t,e){var r=e(13),u=e(508),i=e(2)("species");n.exports=function(n){var t;return u(n)&&("function"!=typeof(t=n.constructor)||t!==Array&&!u(t.prototype)||(t=void 0),r(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},508:function(n,t,e){var r=e(23);n.exports=Array.isArray||function(n){return"Array"==r(n)}},514:function(n,t,e){"use strict";var r=e(0),u=e.n(r),i=e(470),a=e(463),o=e.n(a);t.a=function(n){var t=n.count,e=n.label,r=n.permalink,a=n.style,c=n.value,l=n.valueOnly;return u.a.createElement(i.a,{to:r+"/",className:o()("badge","badge--rounded","badge--"+a)},l?c:e,t&&u.a.createElement(u.a.Fragment,null," (",t,")"))}},515:function(n,t,e){var r=e(516);n.exports=o;var u=Object.hasOwnProperty,i=/\s/g,a=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function o(){if(!(this instanceof o))return new o;this.reset()}function c(n,t){return"string"!=typeof n?"":(t||(n=n.toLowerCase()),n.trim().replace(a,"").replace(r(),"").replace(i,"-"))}o.prototype.slug=function(n,t){for(var e=c(n,!0===t),r=e;u.call(this.occurrences,e);)this.occurrences[r]++,e=r+"-"+this.occurrences[r];return this.occurrences[e]=0,e},o.prototype.reset=function(){this.occurrences=Object.create(null)},o.slug=c},516:function(n,t){n.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},520:function(n,t,e){"use strict";var r=e(1),u=e(0),i=e.n(u),a=(e(470),e(514)),o=e(463),c=e.n(o),l=e(495),f=e(141),s=e.n(f);t.a=function(n){var t,e=n.block,u=n.colorProfile,o=n.tags,f=n.valuesOnly,v=Object(l.a)(o,u);return i.a.createElement("div",{className:c()(s.a.tags,(t={},t[s.a.tagsBlock]=e,t))},v.map((function(n,t){return i.a.createElement(a.a,Object(r.a)({key:t,valueOnly:f},n))})))}},556:function(n,t,e){"use strict";e(29),e(22),e(21),e(52);var r=e(0),u=e.n(r),i=(e(468),e(479),e(470)),a=e(484),o=e.n(a),c=e(520),l=e(495),f=e(476),s=e(485);e(142);var v=function(n){var t=n.frontMatter,e=n.metadata,r=(n.isGuidePage,Object(s.a)().isDarkTheme),a=e.categories,v=(e.description,e.permalink),h=(e.readingTime,e.seriesPosition),d=e.tags,p=(t.author_github,t.cover_label),g=(t.last_modified_on,t.title),D=Object(l.a)(d,"guides"),_=D.find((function(n){return"domain"==n.category})),m=_?_.value:"default",y=D.find((function(n){return"language"==n.category})),b=y?y.value:null,E=D.find((function(n){return"framework"==n.category})),w=E?E.value:null,F=D.find((function(n){return"technology"==n.category})),C=F?F.value:null,k=D.find((function(n){return"database"==n.category})),x=k?k.value:null,A=D.find((function(n){return"installation_guide"==n.category})),j=A?A.value:null,O=D.find((function(n){return"platform"==n.category})),N=O?O.value:null,B=D.find((function(n){return"source"==n.category})),I=B?B.value:null,S=D.find((function(n){return"sink"==n.category})),L=S?S.value:null,z=Object(f.a)().siteConfig.customFields.metadata,R=z.installation,T=z.sources,W=z.sinks,M=z.languages,U=z.frameworks,P=z.databases,$=z.technologies,q=z.installation_guides,G=R.platforms,V=N&&G[N],Z=I&&T[I],H=L&&W[L],K=b&&M.find((function(n){return n.name===b})),J=w&&U.find((function(n){return n.name===w})),Q=x&&P.find((function(n){return n.name===x})),Y=C&&$.find((function(n){return n.name===C})),X=j&&q.find((function(n){return n.name===j})),nn=null!==(V||Z),tn=null!=H,en=null;J?en=r?J.dark_logo_path:J.logo_path:Y?en=r?Y.dark_logo_path:Y.logo_path:Q?en=r?Q.dark_logo_path:Q.logo_path:X?en=r?X.dark_logo_path:X.logo_path:K?en=r?K.dark_logo_path:K.logo_path:V?en=V.logo_path:Z&&(en=Z.logo_path);var rn=null;return H&&(rn=H.logo_path),u.a.createElement(i.a,{to:v+"/",className:"guide-item"},u.a.createElement("article",null,u.a.createElement("div",{className:"domain-bg domain-bg--"+m+" domain-bg--hover"},u.a.createElement("header",null,u.a.createElement("div",{className:"category"},a[0].name),u.a.createElement("h2",{title:g},h&&h+". ",p||g)),u.a.createElement("footer",null,en&&u.a.createElement(o.a,{src:en,className:"logo"}),!en&&nn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),rn&&u.a.createElement(o.a,{src:rn,className:"logo"}),!rn&&tn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),!en&&!rn&&!nn&&!tn&&u.a.createElement(c.a,{colorProfile:"guides",tags:d}),u.a.createElement("div",{className:"action"},"read now")))))},h=e(490),d=e(491),p=e.n(d),g=e(463),D=e.n(g);e(143);function _(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered,a=p()(e).map((function(n){return n.content.metadata.categories[t-1]})).uniqBy("permalink").sortBy("title").keyBy("permalink").value(),o=p.a.groupBy(e,(function(n){return n.content.metadata.categories[t-1].permalink})),c=Object(h.a)("h"+(t+1));return Object.keys(a).map((function(n,t){var e=o[n],l=a[n];return u.a.createElement("section",{key:t},u.a.createElement(c,{id:n},l.title),l.description&&u.a.createElement("div",{className:"sub-title"},l.description),u.a.createElement(m,{items:e,large:r,staggered:i}))}))}function m(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered;if(t)return u.a.createElement(_,{groupLevel:t,items:e});var a,o=(a=e,p.a.sortBy(a,["content.metadata.seriesPosition",function(n){return n.content.metadata.coverLabel.toLowerCase()}]));return u.a.createElement("div",{className:"guides"},u.a.createElement("div",{className:D()("guide-items",{"guide-items--l":r,"guide-items--staggered":i})},o.map((function(n){var t=n.content;return u.a.createElement(v,{key:t.metadata.permalink,frontMatter:t.frontMatter,metadata:t.metadata,truncated:t.metadata.truncated},u.a.createElement(t,null))}))))}t.a=m}}]); \ No newline at end of file diff --git a/d9deea5f.21ad6736.js.LICENSE.txt b/d9deea5f.ec3d210e.js.LICENSE.txt similarity index 100% rename from d9deea5f.21ad6736.js.LICENSE.txt rename to d9deea5f.ec3d210e.js.LICENSE.txt diff --git a/db372ba8.00430b31.js b/db372ba8.a55e09e5.js similarity index 99% rename from db372ba8.00430b31.js rename to db372ba8.a55e09e5.js index ad9529c1b0..8a5a8f5a7b 100644 --- a/db372ba8.00430b31.js +++ b/db372ba8.a55e09e5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[268],{420:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return p})),a.d(t,"metadata",(function(){return d})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),l=a(9),r=(a(0),a(465)),i=a(472),s=a(477),o=a(479),c=a(464),b=a(469),u=a(473),p={last_modified_on:"2024-05-03",$schema:"/.meta/.schemas/guides.json",title:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1",readingTime:"13 min read",source:"@site/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"Create a blazingly fast REST API in Rust (Part 1/2)",truncated:!1,prevItem:{title:"Costs Control",permalink:"/guides/advanced/costs-control"},nextItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"}},m=[{value:"Twitter clone",id:"twitter-clone",children:[{value:"API design",id:"api-design",children:[]}]},{value:"Implementation",id:"implementation",children:[{value:"Actix Web",id:"actix-web",children:[]},{value:"Let's code",id:"lets-code",children:[]},{value:"Validation",id:"validation",children:[]}]},{value:"PostgreSQL",id:"postgresql",children:[{value:"Diesel",id:"diesel",children:[]}]},{value:"Deployment",id:"deployment",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Deploying the app",id:"deploying-the-app",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Configure the connection to the database",id:"configure-the-connection-to-the-database",children:[]}]},{value:"Deploy your application",id:"deploy-your-application",children:[]},{value:"Live test",id:"live-test",children:[]},{value:"What's next",id:"whats-next",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],h={rightToc:m};function g(e){var t=e.components,a=Object(l.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},h,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(r.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety. Coupled with Actix, I should be able to build a fast REST API elegantly."),Object(r.b)("p",null,"The idea behind this article is to see how performant a Rust API can be. I am going to create an API that saves and reads data from/to a PostgreSQL database."),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,'Most of the Rust REST API tests across the web are "',Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://medium.com/sean3z/rest-api-node-vs-rust-c75aa8c96343"}),"Hello World"),"\" applications. They bench direct API I/O with no payload. It's very far from reality. In the part 2 of this article, I will bench our Rust application with an intensive payload.")),Object(r.b)("p",null,"This article is separate in two parts, in this first part you will learn how to:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Create a blazingly fast REST API in Rust"),Object(r.b)("li",{parentName:"ul"},"Connect it to a PostgreSQL database")),Object(r.b)("p",null,"In the second part, we will compare the performance of our application to a Go application."),Object(r.b)("h2",{id:"twitter-clone"},"Twitter clone"),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.twitter.com"}),"Twitter"),' is a "microblogging" system that allows people to send and receive short posts called tweets.')),Object(r.b)("p",null,"Let's create a small part of the Twitter API to be able to post, read, and like tweets. The goal is to be able to use our Twitter clone with a massive number of simultaneous fake users."),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have installed ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/rust-lang/cargo"}),"Cargo")," (Rust package manager)"))),Object(r.b)("h3",{id:"api-design"},"API design"),Object(r.b)("p",null,"Our REST API needs to have three endpoints :"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list last 50 tweets"),Object(r.b)("li",{parentName:"ul"},"POST: create a new tweet"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: find a tweet by its ID"),Object(r.b)("li",{parentName:"ul"},"DELETE: delete a tweet by its ID"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id/likes"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list all likes attached to a tweet"),Object(r.b)("li",{parentName:"ul"},"POST: add +1 like to a tweet"),Object(r.b)("li",{parentName:"ul"},"DELETE: add -1 like to a tweet")))),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"For the sake of simplicity, I will not set up a user management service.")),Object(r.b)("h2",{id:"implementation"},"Implementation"),Object(r.b)("p",null,"Even though implementing an HTTP server could be fun, I choose to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://actix.rs/"}),"Actix"),", which is ranked as ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=fortune"}),"the most performant framework")," ever by ",Object(r.b)("em",{parentName:"p"},"Techempower"),"."),Object(r.b)("h3",{id:"actix-web"},"Actix Web"),Object(r.b)("p",null,"Actix is an actor framework prevalent in the Rust ecosystem. I am using it as an HTTP server to build our REST API."),Object(r.b)("h3",{id:"lets-code"},"Let's code"),Object(r.b)("p",null,"Three files structured our application."),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"main.rs")," to route HTTP requests to the right endpoint"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"tweet.rs")," to handle requests on /tweets"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"like.rs")," to handle requests on /tweets/:id/likes")),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs"',title:'"main.rs"'}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n HttpServer::new(|| {\n App::new()\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),'pub type Tweets = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Tweet {\n pub id: String,\n pub created_at: DateTime,\n pub message: String,\n pub likes: Vec,\n}\n\nimpl Tweet {\n pub fn new(message: String) -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n message,\n likes: vec![],\n }\n }\n}\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct TweetRequest {\n pub message: Option,\n}\n\nimpl TweetRequest {\n pub fn to_tweet(&self) -> Option {\n match &self.message {\n Some(message) => Some(Tweet::new(message.to_string())),\n None => None,\n }\n }\n}\n\n/// list 50 last tweets `/tweets`\n#[get("/tweets")]\npub async fn list() -> HttpResponse {\n // TODO find the last 50 tweets and return them\n\n let tweets = Tweets { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweets)\n}\n\n/// create a tweet `/tweets`\n#[post("/tweets")]\npub async fn create(tweet_req: Json) -> HttpResponse {\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(tweet_req.to_tweet())\n}\n\n/// find a tweet by its id `/tweets/{id}`\n#[get("/tweets/{id}")]\npub async fn get(path: Path<(String,)>) -> HttpResponse {\n // TODO find tweet a tweet by ID and return it\n let found_tweet: Option = None;\n\n match found_tweet {\n Some(tweet) => HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweet),\n None => HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap(),\n }\n}\n\n/// delete a tweet by its id `/tweets/{id}`\n#[delete("/tweets/{id}")]\npub async fn delete(path: Path<(String,)>) -> HttpResponse {\n // TODO delete tweet by ID\n // in any case return status 204\n\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),'pub type Likes = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Like {\n pub id: String,\n pub created_at: DateTime,\n}\n\nimpl Like {\n pub fn new() -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n }\n }\n}\n\n/// list last 50 likes from a tweet `/tweets/{id}/likes`\n#[get("/tweets/{id}/likes")]\npub async fn list(path: Path<(String,)>) -> HttpResponse {\n // TODO find likes by tweet ID and return them\n let likes = Likes { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(likes)\n}\n\n/// add one like to a tweet `/tweets/{id}/likes`\n#[post("/tweets/{id}/likes")]\npub async fn plus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO add one like to a tweet\n let like = Like::new();\n\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(like)\n}\n\n/// remove one like from a tweet `/tweets/{id}/likes`\n#[delete("/tweets/{id}/likes")]\npub async fn minus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO remove one like to a tweet\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/like.rs"}),"like.rs source code")))),Object(r.b)("p",null,"With only these three files, our application is ready to receive HTTP requests. In a couple of lines, we have a fully operational application. Actix takes care of the low level boilerplate for us."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="Annotation"',title:'"Annotation"'}),'#[get("/tweets")]\n')),Object(r.b)("p",null,"Annotation is a very convenient way to bind a route to the right path."),Object(r.b)("h3",{id:"validation"},"Validation"),Object(r.b)("p",null,"Let's run our application:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Run our application"',title:'"Run',our:!0,'application"':!0}),"# Go inside the root project directory\n$ cd twitter-clone-rust\n\n# Run the application\n$ cargo run\n")),Object(r.b)("p",null,"And validate that each endpoint with no errors:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,'API"':!0}),'# list tweets\ncurl http://localhost:9090/tweets\n\n# get a tweet (return status code: 204 because there is no tweet)\ncurl http://localhost:9090/tweets/abc\n\n# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" http://localhost:9090/tweets\n\n# delete a tweet (return status code: 204 in any case)\ncurl -X DELETE http://localhost:9090/tweets/abc\n\n# list likes from a tweet\ncurl http://localhost:9090/tweets/abc/likes\n\n# add one like to a tweet\ncurl -X POST http://localhost:9090/tweets/abc/likes\n\n# remove one like to a tweet\ncurl -X DELETE http://localhost:9090/tweets/abc/likes\n')),Object(r.b)("p",null,"At this stage, our application works without any database. Let's go more in-depth and connect it to PostgreSQL."),Object(r.b)("h2",{id:"postgresql"},"PostgreSQL"),Object(r.b)("h3",{id:"diesel"},"Diesel"),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://diesel.rs/"}),"Diesel")," is the most popular ORM in Rust to connect to a ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.postgresql.org"}),"PostgreSQL")," database. Combined with Actix, it's a perfect fit to persist in our data. Let's see how we can make that happen. However, Diesel does not support ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/tokio-rs/tokio"}),"tokio")," (the asynchronous engine behind Actix), so we have to run it in separate threads using the web::block function, which offloads blocking code (like Diesel's) to do not block the server's thread."),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Read the Diesel ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"http://diesel.rs/guides/getting-started/"}),"Getting started")," to generate tables configurations.")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="schema.rs"',title:'"schema.rs"'}),"table! {\n likes (id) {\n id -> Uuid,\n created_at -> Timestamp,\n tweet_id -> Uuid,\n }\n}\n\ntable! {\n tweets (id) {\n id -> Uuid,\n created_at -> Timestamp,\n message -> Text,\n }\n}\n\njoinable!(likes -> tweets (tweet_id));\n\nallow_tables_to_appear_in_same_query!(\n likes,\n tweets,\n);\n")),Object(r.b)("p",null,"Diesel uses a macro ",Object(r.b)("inlineCode",{parentName:"p"},"table!...")," and an internal DSL to declare the structure of our tables. There is no magic here. The code is compiled and statically linked at the compilation."),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs" {6-11,15-16}',title:'"main.rs"',"{6-11,15-16}":!0}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n // set up database connection pool\n let database_url = env::var("DATABASE_URL").expect("DATABASE_URL");\n let manager = ConnectionManager::::new(database_url);\n let pool = r2d2::Pool::builder()\n .build(manager)\n .expect("Failed to create pool");\n\n HttpServer::new(move || {\n App::new()\n // Set up DB pool to be used with web::Data extractor\n .data(pool.clone())\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),"//...\nfn list_tweets(total_tweets: i64, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let _tweets = match tweets\n .order(created_at.desc())\n .limit(total_tweets)\n .load::(conn)\n {\n Ok(tws) => tws,\n Err(_) => vec![],\n };\n\n Ok(Tweets {\n results: _tweets\n .into_iter()\n .map(|t| t.to_tweet())\n .collect::>(),\n })\n}\n\nfn find_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let res = tweets.filter(id.eq(_id)).load::(conn);\n match res {\n Ok(tweets_db) => match tweets_db.first() {\n Some(tweet_db) => Ok(tweet_db.to_tweet()),\n _ => Err(Error::NotFound),\n },\n Err(err) => Err(err),\n }\n}\n\nfn create_tweet(tweet: Tweet, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let tweet_db = tweet.to_tweet_db();\n let _ = diesel::insert_into(tweets).values(&tweet_db).execute(conn);\n\n Ok(tweet_db.to_tweet())\n}\n\nfn delete_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::tweets::dsl::*;\n\n let res = diesel::delete(tweets.filter(id.eq(_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),"//...\npub fn list_likes(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let _likes: Vec = match likes\n .filter(tweet_id.eq(_tweet_id))\n .order(created_at.desc())\n .load::(conn)\n {\n Ok(lks) => lks,\n Err(_) => vec![],\n };\n\n Ok(Likes {\n results: _likes\n .into_iter()\n .map(|l| l.to_like())\n .collect::>(),\n })\n}\n\npub fn create_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let like = Like::new();\n let _ = diesel::insert_into(likes)\n .values(like.to_like_db(_tweet_id))\n .execute(conn);\n\n Ok(like)\n}\n\npub fn delete_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::likes::dsl::*;\n\n let _likes = list_likes(_tweet_id, conn);\n\n let like = match &_likes {\n Ok(_likes) if !_likes.results.is_empty() => _likes.results.first(),\n _ => None,\n };\n\n if like.is_none() {\n return Ok(());\n }\n\n let like_id = Uuid::from_str(like.unwrap().id.as_str()).unwrap();\n\n let res = diesel::delete(likes.filter(id.eq(like_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/like.rs"}),"like.rs source code")))),Object(r.b)("h2",{id:"deployment"},"Deployment"),Object(r.b)("p",null,"Qovery is going to help you to deploy your application in a few seconds. Let's deploy our Twitter Clone now."),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"web",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("p",null,"Sign in to the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(r.b)("p",{align:"center"},Object(r.b)("a",{href:"https://console.qovery.com/"},Object(r.b)("img",{src:"/img/Qovery_Sign_Up_Page.png",alt:"Qovery Sign-up page"}))))),Object(r.b)(o.a,{value:"cli",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(o.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(o.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(r.b)("li",null,Object(r.b)("h3",{id:"sign-up"},"Sign up"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(r.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")))),Object(r.b)("h3",{id:"deploying-the-app"},"Deploying the app"),Object(r.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(r.b)("ol",null,Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(r.b)("p",null,"To follow the guide, ",Object(r.b)("a",{href:"https://github.com/evoxmusic/twitter-clone-rust"},"you can fork and use our repository")),Object(r.b)("p",null,"Use the forked repository (and branch ",Object(r.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("p",null,"After the application is created: "),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Navigate application settings"),Object(r.b)("li",{parentName:"ul"},"Select ",Object(r.b)("strong",{parentName:"li"},"Port")),Object(r.b)("li",{parentName:"ul"},"Add port ",Object(r.b)("strong",{parentName:"li"},"9090"))),Object(r.b)("p",{align:"left"},Object(r.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(r.b)("p",null,"Create and deploy a new database"),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Name the database ",Object(r.b)("strong",{parentName:"p"},"my-pql-db")," to follow the guide flawlessly")),Object(r.b)("p",null,"To learn how to do it, you can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"))),Object(r.b)("li",null,Object(r.b)("h3",{id:"configure-the-connection-to-the-database"},"Configure the connection to the database"),Object(r.b)("p",null,"In application overview, open the ",Object(r.b)("strong",{parentName:"p"},"Variables")," tab"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/open-env-var.png",alt:"Open Variable"})),Object(r.b)("p",null,"Configure the alias for each built_in environment variable to match the one required within your code"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/alias.png",alt:"Env Var Alias"})),Object(r.b)("p",null,"Have a look at ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),"this section")," to know more on how to connect to a database.")),Object(r.b)("h2",{id:"deploy-your-application"},"Deploy your application"),Object(r.b)("p",null,"All you have to do now is to navigate to your application and click ",Object(r.b)("strong",{parentName:"p"},"Deploy")," button"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-1.png",alt:"Deploy App"})),Object(r.b)("p",null,"That's it. Watch the status and wait till the app is deployed."))),Object(r.b)("p",null,"Congratulations, you have deployed your application!"),Object(r.b)("h2",{id:"live-test"},"Live test"),Object(r.b)("p",null,"To open the application in your browser, click on ",Object(r.b)("strong",{parentName:"p"},"Action")," and ",Object(r.b)("strong",{parentName:"p"},"Open")," buttons in your application overview:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/deploy-env-1.png",alt:"Open App"})),Object(r.b)("p",null,"Then, we can test it with the following CURL commands (replace the app URL with your own):"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our deployed API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,deployed:!0,'API"':!0}),'# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# list tweets\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# get a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n\n# list likes from a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# add one like to a tweet\ncurl -X POST https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# remove one like to a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# delete a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n')),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"add your custom domain"))),Object(r.b)("h2",{id:"whats-next"},"What's next"),Object(r.b)("p",null,"In this first part we saw how to create a Rust API with Actix and Diesel. In the second part we will compare its performance with a Go application to see which one is the most performant."),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Special thanks to ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/imjasonmiller"}),"Jason")," and ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/doctor_code"}),"Kokou")," for your reviews")),Object(r.b)("h2",{id:"useful-resources"},"Useful resources"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/twitter-clone-rust"}),"Source code"))),Object(r.b)("p",null,"Do you want to know more about Rust?"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://blog.rust-lang.org/inside-rust/"}),"A great blog to follow along with Rust development")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/channel/UC_iD0xppBwwsrM9DegC5cQQ"}),"Jon Gjengset")," - PhD student at MIT in distributed systems and Rust live-coder"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/watch?v=j_4sadjjWh8"}),"My first service in Rust")," (French video - Fran\xe7ois T.)")),Object(r.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),l=a.n(n),r=a(463),i=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,s=e.type,o=null;switch(s){case"danger":o="alert-triangle";break;case"success":o="check-circle";break;case"warning":o="alert-triangle";break;default:o="info"}return l.a.createElement("div",{className:i()(a,"alert","alert--"+s,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:i()("feather","icon-"+(r||o))}),t)}},468:function(e,t,a){var n=a(28).f,l=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in l||a(10)&&n(l,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),l=a.n(n),r=a(464);t.a=function(e){var t=e.children,a=e.name;return l.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},l.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),l=a(0),r=a.n(l),i=a(39),s=a(474),o=a(20),c=a.n(o);t.a=function(e){var t,a=e.to,o=e.href,b=a||o,u=Object(s.a)(b),p=Object(l.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(l.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?r.a.createElement(i.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var a,n;d&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},472:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(463),a(471)),i=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,s="undefined"!=typeof window?window.location:null,o={title:"Tutorial on "+s+" failed",body:"The tutorial on:\n\n"+s+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(o),b=Object(n.useState)(null),u=b[0],p=b[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!u&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=a(470),i=a(463),s=a.n(i);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,i=e.leftIcon,o=e.rightIcon,c=e.size,b=e.target,u=e.to,p=s()("jump-to","jump-to--"+c,a),d=l.a.createElement("div",{className:"jump-to--inner"},l.a.createElement("div",{className:"jump-to--inner-2"},i&&l.a.createElement("div",{className:"jump-to--left"},l.a.createElement("i",{className:"feather icon-"+i})),l.a.createElement("div",{className:"jump-to--main"},n?l.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),l.a.createElement("div",{className:"jump-to--right"},l.a.createElement("i",{className:"feather icon-"+(o||"chevron-right")+" arrow"}))));return b?l.a.createElement("a",{href:u,target:b,className:p},d):l.a.createElement(r.a,{to:u,className:p},d)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),l=(a(481),a(478),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),i=a(483),s=a(463),o=a.n(s),c=a(471),b=a.n(c),u=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,i=e.handleKeydown,s=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:o()("tabs",l,{"tabs--block":t}),style:s},c.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:o()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,s=e.values,o=s;if(o[0].group){var c=_.groupBy(o,"group");o=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:o,isClearable:a,placeholder:t,value:s.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,i=e.groupId,s=e.label,o=e.placeholder,c=e.select,g=e.size,w=(e.style,e.values),O=e.urlKey,j=Object(u.a)(),v=j.tabGroupChoices,f=j.setTabGroupChoices,y=Object(l.useState)(a),k=y[0],N=y[1];if(null!=i){var T=v[i];null!=T&&T!==k&&N(T)}var _=function(e){N(e),null!=i&&f(i,e)},I=[],x=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(g||"md")},s&&r.a.createElement("div",{className:"margin-vert--sm"},s),w.length>1&&(c?r.a.createElement(h,Object(n.a)({changeSelectedValue:_,handleKeydown:x,placeholder:o,selectedValue:k,size:g,tabRefs:I},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:_,handleKeydown:x,selectedValue:k,tabRefs:I},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},479:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[268],{420:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return p})),a.d(t,"metadata",(function(){return d})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),l=a(9),r=(a(0),a(465)),i=a(472),s=a(477),o=a(478),c=a(464),b=a(469),u=a(473),p={last_modified_on:"2024-05-03",$schema:"/.meta/.schemas/guides.json",title:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1",readingTime:"13 min read",source:"@site/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"Create a blazingly fast REST API in Rust (Part 1/2)",truncated:!1,prevItem:{title:"Costs Control",permalink:"/guides/advanced/costs-control"},nextItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"}},m=[{value:"Twitter clone",id:"twitter-clone",children:[{value:"API design",id:"api-design",children:[]}]},{value:"Implementation",id:"implementation",children:[{value:"Actix Web",id:"actix-web",children:[]},{value:"Let's code",id:"lets-code",children:[]},{value:"Validation",id:"validation",children:[]}]},{value:"PostgreSQL",id:"postgresql",children:[{value:"Diesel",id:"diesel",children:[]}]},{value:"Deployment",id:"deployment",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Deploying the app",id:"deploying-the-app",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Configure the connection to the database",id:"configure-the-connection-to-the-database",children:[]}]},{value:"Deploy your application",id:"deploy-your-application",children:[]},{value:"Live test",id:"live-test",children:[]},{value:"What's next",id:"whats-next",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],h={rightToc:m};function g(e){var t=e.components,a=Object(l.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},h,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(r.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety. Coupled with Actix, I should be able to build a fast REST API elegantly."),Object(r.b)("p",null,"The idea behind this article is to see how performant a Rust API can be. I am going to create an API that saves and reads data from/to a PostgreSQL database."),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,'Most of the Rust REST API tests across the web are "',Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://medium.com/sean3z/rest-api-node-vs-rust-c75aa8c96343"}),"Hello World"),"\" applications. They bench direct API I/O with no payload. It's very far from reality. In the part 2 of this article, I will bench our Rust application with an intensive payload.")),Object(r.b)("p",null,"This article is separate in two parts, in this first part you will learn how to:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Create a blazingly fast REST API in Rust"),Object(r.b)("li",{parentName:"ul"},"Connect it to a PostgreSQL database")),Object(r.b)("p",null,"In the second part, we will compare the performance of our application to a Go application."),Object(r.b)("h2",{id:"twitter-clone"},"Twitter clone"),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.twitter.com"}),"Twitter"),' is a "microblogging" system that allows people to send and receive short posts called tweets.')),Object(r.b)("p",null,"Let's create a small part of the Twitter API to be able to post, read, and like tweets. The goal is to be able to use our Twitter clone with a massive number of simultaneous fake users."),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have installed ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/rust-lang/cargo"}),"Cargo")," (Rust package manager)"))),Object(r.b)("h3",{id:"api-design"},"API design"),Object(r.b)("p",null,"Our REST API needs to have three endpoints :"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list last 50 tweets"),Object(r.b)("li",{parentName:"ul"},"POST: create a new tweet"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: find a tweet by its ID"),Object(r.b)("li",{parentName:"ul"},"DELETE: delete a tweet by its ID"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id/likes"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list all likes attached to a tweet"),Object(r.b)("li",{parentName:"ul"},"POST: add +1 like to a tweet"),Object(r.b)("li",{parentName:"ul"},"DELETE: add -1 like to a tweet")))),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"For the sake of simplicity, I will not set up a user management service.")),Object(r.b)("h2",{id:"implementation"},"Implementation"),Object(r.b)("p",null,"Even though implementing an HTTP server could be fun, I choose to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://actix.rs/"}),"Actix"),", which is ranked as ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=fortune"}),"the most performant framework")," ever by ",Object(r.b)("em",{parentName:"p"},"Techempower"),"."),Object(r.b)("h3",{id:"actix-web"},"Actix Web"),Object(r.b)("p",null,"Actix is an actor framework prevalent in the Rust ecosystem. I am using it as an HTTP server to build our REST API."),Object(r.b)("h3",{id:"lets-code"},"Let's code"),Object(r.b)("p",null,"Three files structured our application."),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"main.rs")," to route HTTP requests to the right endpoint"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"tweet.rs")," to handle requests on /tweets"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"like.rs")," to handle requests on /tweets/:id/likes")),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs"',title:'"main.rs"'}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n HttpServer::new(|| {\n App::new()\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),'pub type Tweets = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Tweet {\n pub id: String,\n pub created_at: DateTime,\n pub message: String,\n pub likes: Vec,\n}\n\nimpl Tweet {\n pub fn new(message: String) -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n message,\n likes: vec![],\n }\n }\n}\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct TweetRequest {\n pub message: Option,\n}\n\nimpl TweetRequest {\n pub fn to_tweet(&self) -> Option {\n match &self.message {\n Some(message) => Some(Tweet::new(message.to_string())),\n None => None,\n }\n }\n}\n\n/// list 50 last tweets `/tweets`\n#[get("/tweets")]\npub async fn list() -> HttpResponse {\n // TODO find the last 50 tweets and return them\n\n let tweets = Tweets { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweets)\n}\n\n/// create a tweet `/tweets`\n#[post("/tweets")]\npub async fn create(tweet_req: Json) -> HttpResponse {\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(tweet_req.to_tweet())\n}\n\n/// find a tweet by its id `/tweets/{id}`\n#[get("/tweets/{id}")]\npub async fn get(path: Path<(String,)>) -> HttpResponse {\n // TODO find tweet a tweet by ID and return it\n let found_tweet: Option = None;\n\n match found_tweet {\n Some(tweet) => HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweet),\n None => HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap(),\n }\n}\n\n/// delete a tweet by its id `/tweets/{id}`\n#[delete("/tweets/{id}")]\npub async fn delete(path: Path<(String,)>) -> HttpResponse {\n // TODO delete tweet by ID\n // in any case return status 204\n\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),'pub type Likes = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Like {\n pub id: String,\n pub created_at: DateTime,\n}\n\nimpl Like {\n pub fn new() -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n }\n }\n}\n\n/// list last 50 likes from a tweet `/tweets/{id}/likes`\n#[get("/tweets/{id}/likes")]\npub async fn list(path: Path<(String,)>) -> HttpResponse {\n // TODO find likes by tweet ID and return them\n let likes = Likes { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(likes)\n}\n\n/// add one like to a tweet `/tweets/{id}/likes`\n#[post("/tweets/{id}/likes")]\npub async fn plus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO add one like to a tweet\n let like = Like::new();\n\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(like)\n}\n\n/// remove one like from a tweet `/tweets/{id}/likes`\n#[delete("/tweets/{id}/likes")]\npub async fn minus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO remove one like to a tweet\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/like.rs"}),"like.rs source code")))),Object(r.b)("p",null,"With only these three files, our application is ready to receive HTTP requests. In a couple of lines, we have a fully operational application. Actix takes care of the low level boilerplate for us."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="Annotation"',title:'"Annotation"'}),'#[get("/tweets")]\n')),Object(r.b)("p",null,"Annotation is a very convenient way to bind a route to the right path."),Object(r.b)("h3",{id:"validation"},"Validation"),Object(r.b)("p",null,"Let's run our application:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Run our application"',title:'"Run',our:!0,'application"':!0}),"# Go inside the root project directory\n$ cd twitter-clone-rust\n\n# Run the application\n$ cargo run\n")),Object(r.b)("p",null,"And validate that each endpoint with no errors:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,'API"':!0}),'# list tweets\ncurl http://localhost:9090/tweets\n\n# get a tweet (return status code: 204 because there is no tweet)\ncurl http://localhost:9090/tweets/abc\n\n# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" http://localhost:9090/tweets\n\n# delete a tweet (return status code: 204 in any case)\ncurl -X DELETE http://localhost:9090/tweets/abc\n\n# list likes from a tweet\ncurl http://localhost:9090/tweets/abc/likes\n\n# add one like to a tweet\ncurl -X POST http://localhost:9090/tweets/abc/likes\n\n# remove one like to a tweet\ncurl -X DELETE http://localhost:9090/tweets/abc/likes\n')),Object(r.b)("p",null,"At this stage, our application works without any database. Let's go more in-depth and connect it to PostgreSQL."),Object(r.b)("h2",{id:"postgresql"},"PostgreSQL"),Object(r.b)("h3",{id:"diesel"},"Diesel"),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://diesel.rs/"}),"Diesel")," is the most popular ORM in Rust to connect to a ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.postgresql.org"}),"PostgreSQL")," database. Combined with Actix, it's a perfect fit to persist in our data. Let's see how we can make that happen. However, Diesel does not support ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/tokio-rs/tokio"}),"tokio")," (the asynchronous engine behind Actix), so we have to run it in separate threads using the web::block function, which offloads blocking code (like Diesel's) to do not block the server's thread."),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Read the Diesel ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"http://diesel.rs/guides/getting-started/"}),"Getting started")," to generate tables configurations.")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="schema.rs"',title:'"schema.rs"'}),"table! {\n likes (id) {\n id -> Uuid,\n created_at -> Timestamp,\n tweet_id -> Uuid,\n }\n}\n\ntable! {\n tweets (id) {\n id -> Uuid,\n created_at -> Timestamp,\n message -> Text,\n }\n}\n\njoinable!(likes -> tweets (tweet_id));\n\nallow_tables_to_appear_in_same_query!(\n likes,\n tweets,\n);\n")),Object(r.b)("p",null,"Diesel uses a macro ",Object(r.b)("inlineCode",{parentName:"p"},"table!...")," and an internal DSL to declare the structure of our tables. There is no magic here. The code is compiled and statically linked at the compilation."),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs" {6-11,15-16}',title:'"main.rs"',"{6-11,15-16}":!0}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n // set up database connection pool\n let database_url = env::var("DATABASE_URL").expect("DATABASE_URL");\n let manager = ConnectionManager::::new(database_url);\n let pool = r2d2::Pool::builder()\n .build(manager)\n .expect("Failed to create pool");\n\n HttpServer::new(move || {\n App::new()\n // Set up DB pool to be used with web::Data extractor\n .data(pool.clone())\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),"//...\nfn list_tweets(total_tweets: i64, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let _tweets = match tweets\n .order(created_at.desc())\n .limit(total_tweets)\n .load::(conn)\n {\n Ok(tws) => tws,\n Err(_) => vec![],\n };\n\n Ok(Tweets {\n results: _tweets\n .into_iter()\n .map(|t| t.to_tweet())\n .collect::>(),\n })\n}\n\nfn find_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let res = tweets.filter(id.eq(_id)).load::(conn);\n match res {\n Ok(tweets_db) => match tweets_db.first() {\n Some(tweet_db) => Ok(tweet_db.to_tweet()),\n _ => Err(Error::NotFound),\n },\n Err(err) => Err(err),\n }\n}\n\nfn create_tweet(tweet: Tweet, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let tweet_db = tweet.to_tweet_db();\n let _ = diesel::insert_into(tweets).values(&tweet_db).execute(conn);\n\n Ok(tweet_db.to_tweet())\n}\n\nfn delete_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::tweets::dsl::*;\n\n let res = diesel::delete(tweets.filter(id.eq(_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),"//...\npub fn list_likes(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let _likes: Vec = match likes\n .filter(tweet_id.eq(_tweet_id))\n .order(created_at.desc())\n .load::(conn)\n {\n Ok(lks) => lks,\n Err(_) => vec![],\n };\n\n Ok(Likes {\n results: _likes\n .into_iter()\n .map(|l| l.to_like())\n .collect::>(),\n })\n}\n\npub fn create_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let like = Like::new();\n let _ = diesel::insert_into(likes)\n .values(like.to_like_db(_tweet_id))\n .execute(conn);\n\n Ok(like)\n}\n\npub fn delete_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::likes::dsl::*;\n\n let _likes = list_likes(_tweet_id, conn);\n\n let like = match &_likes {\n Ok(_likes) if !_likes.results.is_empty() => _likes.results.first(),\n _ => None,\n };\n\n if like.is_none() {\n return Ok(());\n }\n\n let like_id = Uuid::from_str(like.unwrap().id.as_str()).unwrap();\n\n let res = diesel::delete(likes.filter(id.eq(like_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/like.rs"}),"like.rs source code")))),Object(r.b)("h2",{id:"deployment"},"Deployment"),Object(r.b)("p",null,"Qovery is going to help you to deploy your application in a few seconds. Let's deploy our Twitter Clone now."),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"web",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("p",null,"Sign in to the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(r.b)("p",{align:"center"},Object(r.b)("a",{href:"https://console.qovery.com/"},Object(r.b)("img",{src:"/img/Qovery_Sign_Up_Page.png",alt:"Qovery Sign-up page"}))))),Object(r.b)(o.a,{value:"cli",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(o.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(o.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(r.b)("li",null,Object(r.b)("h3",{id:"sign-up"},"Sign up"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(r.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")))),Object(r.b)("h3",{id:"deploying-the-app"},"Deploying the app"),Object(r.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(r.b)("ol",null,Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(r.b)("p",null,"To follow the guide, ",Object(r.b)("a",{href:"https://github.com/evoxmusic/twitter-clone-rust"},"you can fork and use our repository")),Object(r.b)("p",null,"Use the forked repository (and branch ",Object(r.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("p",null,"After the application is created: "),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Navigate application settings"),Object(r.b)("li",{parentName:"ul"},"Select ",Object(r.b)("strong",{parentName:"li"},"Port")),Object(r.b)("li",{parentName:"ul"},"Add port ",Object(r.b)("strong",{parentName:"li"},"9090"))),Object(r.b)("p",{align:"left"},Object(r.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(r.b)("p",null,"Create and deploy a new database"),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Name the database ",Object(r.b)("strong",{parentName:"p"},"my-pql-db")," to follow the guide flawlessly")),Object(r.b)("p",null,"To learn how to do it, you can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"))),Object(r.b)("li",null,Object(r.b)("h3",{id:"configure-the-connection-to-the-database"},"Configure the connection to the database"),Object(r.b)("p",null,"In application overview, open the ",Object(r.b)("strong",{parentName:"p"},"Variables")," tab"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/open-env-var.png",alt:"Open Variable"})),Object(r.b)("p",null,"Configure the alias for each built_in environment variable to match the one required within your code"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/alias.png",alt:"Env Var Alias"})),Object(r.b)("p",null,"Have a look at ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),"this section")," to know more on how to connect to a database.")),Object(r.b)("h2",{id:"deploy-your-application"},"Deploy your application"),Object(r.b)("p",null,"All you have to do now is to navigate to your application and click ",Object(r.b)("strong",{parentName:"p"},"Deploy")," button"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-1.png",alt:"Deploy App"})),Object(r.b)("p",null,"That's it. Watch the status and wait till the app is deployed."))),Object(r.b)("p",null,"Congratulations, you have deployed your application!"),Object(r.b)("h2",{id:"live-test"},"Live test"),Object(r.b)("p",null,"To open the application in your browser, click on ",Object(r.b)("strong",{parentName:"p"},"Action")," and ",Object(r.b)("strong",{parentName:"p"},"Open")," buttons in your application overview:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/deploy-env-1.png",alt:"Open App"})),Object(r.b)("p",null,"Then, we can test it with the following CURL commands (replace the app URL with your own):"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our deployed API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,deployed:!0,'API"':!0}),'# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# list tweets\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# get a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n\n# list likes from a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# add one like to a tweet\ncurl -X POST https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# remove one like to a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# delete a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n')),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"add your custom domain"))),Object(r.b)("h2",{id:"whats-next"},"What's next"),Object(r.b)("p",null,"In this first part we saw how to create a Rust API with Actix and Diesel. In the second part we will compare its performance with a Go application to see which one is the most performant."),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Special thanks to ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/imjasonmiller"}),"Jason")," and ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/doctor_code"}),"Kokou")," for your reviews")),Object(r.b)("h2",{id:"useful-resources"},"Useful resources"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/twitter-clone-rust"}),"Source code"))),Object(r.b)("p",null,"Do you want to know more about Rust?"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://blog.rust-lang.org/inside-rust/"}),"A great blog to follow along with Rust development")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/channel/UC_iD0xppBwwsrM9DegC5cQQ"}),"Jon Gjengset")," - PhD student at MIT in distributed systems and Rust live-coder"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/watch?v=j_4sadjjWh8"}),"My first service in Rust")," (French video - Fran\xe7ois T.)")),Object(r.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},464:function(e,t,a){"use strict";a(466);var n=a(0),l=a.n(n),r=a(463),i=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,s=e.type,o=null;switch(s){case"danger":o="alert-triangle";break;case"success":o="check-circle";break;case"warning":o="alert-triangle";break;default:o="info"}return l.a.createElement("div",{className:i()(a,"alert","alert--"+s,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:i()("feather","icon-"+(r||o))}),t)}},468:function(e,t,a){var n=a(28).f,l=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in l||a(10)&&n(l,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},469:function(e,t,a){"use strict";a(468);var n=a(0),l=a.n(n),r=a(464);t.a=function(e){var t=e.children,a=e.name;return l.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},l.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},470:function(e,t,a){"use strict";var n=a(1),l=a(0),r=a.n(l),i=a(39),s=a(474),o=a(20),c=a.n(o);t.a=function(e){var t,a=e.to,o=e.href,b=a||o,u=Object(s.a)(b),p=Object(l.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(l.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?r.a.createElement(i.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var a,n;d&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},472:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(463),a(471)),i=a.n(r);a(133);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,s="undefined"!=typeof window?window.location:null,o={title:"Tutorial on "+s+" failed",body:"The tutorial on:\n\n"+s+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(o),b=Object(n.useState)(null),u=b[0],p=b[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!u&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=a(470),i=a(463),s=a.n(i);a(134);t.a=function(e){var t=e.children,a=e.className,n=e.badge,i=e.leftIcon,o=e.rightIcon,c=e.size,b=e.target,u=e.to,p=s()("jump-to","jump-to--"+c,a),d=l.a.createElement("div",{className:"jump-to--inner"},l.a.createElement("div",{className:"jump-to--inner-2"},i&&l.a.createElement("div",{className:"jump-to--left"},l.a.createElement("i",{className:"feather icon-"+i})),l.a.createElement("div",{className:"jump-to--main"},n?l.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),l.a.createElement("div",{className:"jump-to--right"},l.a.createElement("i",{className:"feather icon-"+(o||"chevron-right")+" arrow"}))));return b?l.a.createElement("a",{href:u,target:b,className:p},d):l.a.createElement(r.a,{to:u,className:p},d)}},474:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},477:function(e,t,a){"use strict";var n=a(1),l=(a(480),a(479),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),i=a(483),s=a(463),o=a.n(s),c=a(471),b=a.n(c),u=a(482),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,i=e.handleKeydown,s=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:o()("tabs",l,{"tabs--block":t}),style:s},c.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:o()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,s=e.values,o=s;if(o[0].group){var c=_.groupBy(o,"group");o=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:o,isClearable:a,placeholder:t,value:s.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,i=e.groupId,s=e.label,o=e.placeholder,c=e.select,g=e.size,w=(e.style,e.values),O=e.urlKey,j=Object(u.a)(),v=j.tabGroupChoices,f=j.setTabGroupChoices,y=Object(l.useState)(a),k=y[0],N=y[1];if(null!=i){var T=v[i];null!=T&&T!==k&&N(T)}var _=function(e){N(e),null!=i&&f(i,e)},I=[],x=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(g||"md")},s&&r.a.createElement("div",{className:"margin-vert--sm"},s),w.length>1&&(c?r.a.createElement(h,Object(n.a)({changeSelectedValue:_,handleKeydown:x,placeholder:o,selectedValue:k,size:g,tabRefs:I},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:_,handleKeydown:x,selectedValue:k,tabRefs:I},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},478:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/docs/getting-started/basic-concepts/index.html b/docs/getting-started/basic-concepts/index.html index 0f7e57d173..143f151216 100644 --- a/docs/getting-started/basic-concepts/index.html +++ b/docs/getting-started/basic-concepts/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/deploy-my-app/index.html b/docs/getting-started/deploy-my-app/index.html index e34c22a2ca..b2a6b52ce6 100644 --- a/docs/getting-started/deploy-my-app/index.html +++ b/docs/getting-started/deploy-my-app/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/how-qovery-works/index.html b/docs/getting-started/how-qovery-works/index.html index aa20590e4a..ddf4b52cdd 100644 --- a/docs/getting-started/how-qovery-works/index.html +++ b/docs/getting-started/how-qovery-works/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/index.html b/docs/getting-started/index.html index 3ca99ea858..ca30d68aca 100644 --- a/docs/getting-started/index.html +++ b/docs/getting-started/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/create-credentials/index.html b/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/create-credentials/index.html index 47bd41fc40..e871c0a51c 100644 --- a/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/create-credentials/index.html +++ b/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/create-credentials/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/faq/index.html b/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/faq/index.html index cd4d2c5322..4db08ecbd9 100644 --- a/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/faq/index.html +++ b/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/faq/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/index.html b/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/index.html index b6cb816762..ae4506815e 100644 --- a/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/index.html +++ b/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/infrastructure/index.html b/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/infrastructure/index.html index 93a73f459e..aa02fb8905 100644 --- a/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/infrastructure/index.html +++ b/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/infrastructure/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -59,23 +59,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/index.html b/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/index.html index e28fb436be..f4ec195cbd 100644 --- a/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/index.html +++ b/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/aws/index.html b/docs/getting-started/install-qovery/aws/index.html index 27d65f0daa..523e63abae 100644 --- a/docs/getting-started/install-qovery/aws/index.html +++ b/docs/getting-started/install-qovery/aws/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/aws/self-managed-cluster/index.html b/docs/getting-started/install-qovery/aws/self-managed-cluster/index.html index 6f4a98165e..91c5e145d5 100644 --- a/docs/getting-started/install-qovery/aws/self-managed-cluster/index.html +++ b/docs/getting-started/install-qovery/aws/self-managed-cluster/index.html @@ -26,27 +26,27 @@ - + - + - + - + - + - + - + - + @@ -58,27 +58,27 @@ - + - + - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/index.html b/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/index.html index bc0421fef6..a53fa0dbac 100644 --- a/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/index.html +++ b/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart/index.html b/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart/index.html index 162e3d21a8..ac2978627c 100644 --- a/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart/index.html +++ b/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/azure/index.html b/docs/getting-started/install-qovery/azure/index.html index ea1698e16b..aaa364bdaf 100644 --- a/docs/getting-started/install-qovery/azure/index.html +++ b/docs/getting-started/install-qovery/azure/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/azure/self-managed-cluster/index.html b/docs/getting-started/install-qovery/azure/self-managed-cluster/index.html index 6c43aec20f..13f4531e24 100644 --- a/docs/getting-started/install-qovery/azure/self-managed-cluster/index.html +++ b/docs/getting-started/install-qovery/azure/self-managed-cluster/index.html @@ -26,27 +26,27 @@ - + - + - + - + - + - + - + - + @@ -58,27 +58,27 @@ - + - + - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/create-credentials/index.html b/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/create-credentials/index.html index c96a4dc0db..cccbf4067a 100644 --- a/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/create-credentials/index.html +++ b/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/create-credentials/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/index.html b/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/index.html index d783ccc986..4239be1d40 100644 --- a/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/index.html +++ b/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/index.html b/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/index.html index 83b64baeca..b06de3512d 100644 --- a/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/index.html +++ b/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/gcp/index.html b/docs/getting-started/install-qovery/gcp/index.html index db91b22905..6247264dd9 100644 --- a/docs/getting-started/install-qovery/gcp/index.html +++ b/docs/getting-started/install-qovery/gcp/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/gcp/self-managed-cluster/index.html b/docs/getting-started/install-qovery/gcp/self-managed-cluster/index.html index b6e8d5c057..2ba143ba1d 100644 --- a/docs/getting-started/install-qovery/gcp/self-managed-cluster/index.html +++ b/docs/getting-started/install-qovery/gcp/self-managed-cluster/index.html @@ -26,27 +26,27 @@ - + - + - + - + - + - + - + - + @@ -58,27 +58,27 @@ - + - + - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/index.html b/docs/getting-started/install-qovery/index.html index 88d37b5b78..4b92c34537 100644 --- a/docs/getting-started/install-qovery/index.html +++ b/docs/getting-started/install-qovery/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/kubernetes/byok-config/index.html b/docs/getting-started/install-qovery/kubernetes/byok-config/index.html index 01d91eabf4..5dfa3262b5 100644 --- a/docs/getting-started/install-qovery/kubernetes/byok-config/index.html +++ b/docs/getting-started/install-qovery/kubernetes/byok-config/index.html @@ -26,27 +26,27 @@ - + - + - + - + - + - + - + - + @@ -58,27 +58,27 @@ - + - + - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/kubernetes/faq/index.html b/docs/getting-started/install-qovery/kubernetes/faq/index.html index af11a6b56b..4c4a7d0d8c 100644 --- a/docs/getting-started/install-qovery/kubernetes/faq/index.html +++ b/docs/getting-started/install-qovery/kubernetes/faq/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/kubernetes/index.html b/docs/getting-started/install-qovery/kubernetes/index.html index c583017830..5b9b7a7d1d 100644 --- a/docs/getting-started/install-qovery/kubernetes/index.html +++ b/docs/getting-started/install-qovery/kubernetes/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/kubernetes/quickstart/index.html b/docs/getting-started/install-qovery/kubernetes/quickstart/index.html index 65024acbd7..1e52d06055 100644 --- a/docs/getting-started/install-qovery/kubernetes/quickstart/index.html +++ b/docs/getting-started/install-qovery/kubernetes/quickstart/index.html @@ -26,27 +26,27 @@ - + - + - + - + - + - + - + - + @@ -58,27 +58,27 @@ - + - + - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/kubernetes/validate-installation/index.html b/docs/getting-started/install-qovery/kubernetes/validate-installation/index.html index 91a50fc134..e09f2c257c 100644 --- a/docs/getting-started/install-qovery/kubernetes/validate-installation/index.html +++ b/docs/getting-started/install-qovery/kubernetes/validate-installation/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -57,23 +57,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/local/index.html b/docs/getting-started/install-qovery/local/index.html index 1c6474de5f..73ed894058 100644 --- a/docs/getting-started/install-qovery/local/index.html +++ b/docs/getting-started/install-qovery/local/index.html @@ -26,27 +26,27 @@ - + - + - + - + - + - + - + - + @@ -59,27 +59,27 @@ - + - + - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/create-credentials/index.html b/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/create-credentials/index.html index d4483c3d9d..341bd9f328 100644 --- a/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/create-credentials/index.html +++ b/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/create-credentials/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/faq/index.html b/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/faq/index.html index ea7dc6b3fa..1a09cd796d 100644 --- a/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/faq/index.html +++ b/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/faq/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/index.html b/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/index.html index 5d262a68e5..b37dbeab2a 100644 --- a/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/index.html +++ b/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/quickstart/index.html b/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/quickstart/index.html index 385b4d88d4..3ec1ff9274 100644 --- a/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/quickstart/index.html +++ b/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/quickstart/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/scaleway/index.html b/docs/getting-started/install-qovery/scaleway/index.html index f8a506cc49..9b03f02819 100644 --- a/docs/getting-started/install-qovery/scaleway/index.html +++ b/docs/getting-started/install-qovery/scaleway/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/scaleway/self-managed-cluster/index.html b/docs/getting-started/install-qovery/scaleway/self-managed-cluster/index.html index 91cf724067..74558405c6 100644 --- a/docs/getting-started/install-qovery/scaleway/self-managed-cluster/index.html +++ b/docs/getting-started/install-qovery/scaleway/self-managed-cluster/index.html @@ -26,27 +26,27 @@ - + - + - + - + - + - + - + - + @@ -58,27 +58,27 @@ - + - + - + - + - + - + - + - + diff --git a/docs/getting-started/what-is-qovery/index.html b/docs/getting-started/what-is-qovery/index.html index c28aa456b5..a8caf71594 100644 --- a/docs/getting-started/what-is-qovery/index.html +++ b/docs/getting-started/what-is-qovery/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/getting-started/whats-next/index.html b/docs/getting-started/whats-next/index.html index c6e90bcc63..558327a993 100644 --- a/docs/getting-started/whats-next/index.html +++ b/docs/getting-started/whats-next/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + - + diff --git a/docs/index.html b/docs/index.html index e56aec44ba..6f1ea65e07 100644 --- a/docs/index.html +++ b/docs/index.html @@ -22,9 +22,9 @@ - + - + @@ -37,9 +37,9 @@ - + - + diff --git a/docs/security-and-compliance/backup-and-restore/index.html b/docs/security-and-compliance/backup-and-restore/index.html index f5e93b5c78..0e341d5bd3 100644 --- a/docs/security-and-compliance/backup-and-restore/index.html +++ b/docs/security-and-compliance/backup-and-restore/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/security-and-compliance/encryption/index.html b/docs/security-and-compliance/encryption/index.html index 67230df8b3..614045ffc5 100644 --- a/docs/security-and-compliance/encryption/index.html +++ b/docs/security-and-compliance/encryption/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/security-and-compliance/gdpr/index.html b/docs/security-and-compliance/gdpr/index.html index 71b3af125f..3151e03624 100644 --- a/docs/security-and-compliance/gdpr/index.html +++ b/docs/security-and-compliance/gdpr/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/security-and-compliance/index.html b/docs/security-and-compliance/index.html index 09b74ac4c3..d9b956e6d8 100644 --- a/docs/security-and-compliance/index.html +++ b/docs/security-and-compliance/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/security-and-compliance/soc2/index.html b/docs/security-and-compliance/soc2/index.html index 4635fba4ad..c8c86db2a3 100644 --- a/docs/security-and-compliance/soc2/index.html +++ b/docs/security-and-compliance/soc2/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + - + diff --git a/docs/useful-resources/faq/index.html b/docs/useful-resources/faq/index.html index b21fa2f67a..3fd5d09299 100644 --- a/docs/useful-resources/faq/index.html +++ b/docs/useful-resources/faq/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -57,23 +57,23 @@ - + - + - + - + - + - + diff --git a/docs/useful-resources/help-and-support/index.html b/docs/useful-resources/help-and-support/index.html index 224c01587e..b96b2e8842 100644 --- a/docs/useful-resources/help-and-support/index.html +++ b/docs/useful-resources/help-and-support/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/audit-logs/index.html b/docs/using-qovery/audit-logs/index.html index 17430979df..fc6c96b3a2 100644 --- a/docs/using-qovery/audit-logs/index.html +++ b/docs/using-qovery/audit-logs/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/advanced-settings/index.html b/docs/using-qovery/configuration/advanced-settings/index.html index d5ebcd9511..9bbb4941c7 100644 --- a/docs/using-qovery/configuration/advanced-settings/index.html +++ b/docs/using-qovery/configuration/advanced-settings/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/application-health-checks/index.html b/docs/using-qovery/configuration/application-health-checks/index.html index 11a0ff3138..58f03f10a9 100644 --- a/docs/using-qovery/configuration/application-health-checks/index.html +++ b/docs/using-qovery/configuration/application-health-checks/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -59,23 +59,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/application/index.html b/docs/using-qovery/configuration/application/index.html index 28dbdd4778..1bd638bb2f 100644 --- a/docs/using-qovery/configuration/application/index.html +++ b/docs/using-qovery/configuration/application/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -62,23 +62,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/cloud-service-provider/index.html b/docs/using-qovery/configuration/cloud-service-provider/index.html index db44b89f18..07167c1118 100644 --- a/docs/using-qovery/configuration/cloud-service-provider/index.html +++ b/docs/using-qovery/configuration/cloud-service-provider/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/cluster-advanced-settings/index.html b/docs/using-qovery/configuration/cluster-advanced-settings/index.html index 99e0dc49be..defbff28c1 100644 --- a/docs/using-qovery/configuration/cluster-advanced-settings/index.html +++ b/docs/using-qovery/configuration/cluster-advanced-settings/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/clusters/aws-with-karpenter/index.html b/docs/using-qovery/configuration/clusters/aws-with-karpenter/index.html index 229d020df3..b2d67aa0bf 100644 --- a/docs/using-qovery/configuration/clusters/aws-with-karpenter/index.html +++ b/docs/using-qovery/configuration/clusters/aws-with-karpenter/index.html @@ -26,27 +26,27 @@ - + - + - + - + - + - + - + - + @@ -59,27 +59,27 @@ - + - + - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/clusters/aws/index.html b/docs/using-qovery/configuration/clusters/aws/index.html index 1bd3a55299..abf355d27f 100644 --- a/docs/using-qovery/configuration/clusters/aws/index.html +++ b/docs/using-qovery/configuration/clusters/aws/index.html @@ -26,27 +26,27 @@ - + - + - + - + - + - + - + - + @@ -58,27 +58,27 @@ - + - + - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/clusters/gcp/index.html b/docs/using-qovery/configuration/clusters/gcp/index.html index 7b984adbde..40530b0e77 100644 --- a/docs/using-qovery/configuration/clusters/gcp/index.html +++ b/docs/using-qovery/configuration/clusters/gcp/index.html @@ -26,27 +26,27 @@ - + - + - + - + - + - + - + - + @@ -58,27 +58,27 @@ - + - + - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/clusters/index.html b/docs/using-qovery/configuration/clusters/index.html index 5d2fdb40f5..c4e902f9dd 100644 --- a/docs/using-qovery/configuration/clusters/index.html +++ b/docs/using-qovery/configuration/clusters/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -59,23 +59,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/clusters/scaleway/index.html b/docs/using-qovery/configuration/clusters/scaleway/index.html index 8dbd76109e..7e2908ffee 100644 --- a/docs/using-qovery/configuration/clusters/scaleway/index.html +++ b/docs/using-qovery/configuration/clusters/scaleway/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/cronjob/index.html b/docs/using-qovery/configuration/cronjob/index.html index 5541ae8aec..002aa9088e 100644 --- a/docs/using-qovery/configuration/cronjob/index.html +++ b/docs/using-qovery/configuration/cronjob/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -59,23 +59,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/database/index.html b/docs/using-qovery/configuration/database/index.html index daacfa8b47..3caa89e92a 100644 --- a/docs/using-qovery/configuration/database/index.html +++ b/docs/using-qovery/configuration/database/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -58,23 +58,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/database/mongodb/index.html b/docs/using-qovery/configuration/database/mongodb/index.html index 85ad150f2b..394c742574 100644 --- a/docs/using-qovery/configuration/database/mongodb/index.html +++ b/docs/using-qovery/configuration/database/mongodb/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/database/mysql/index.html b/docs/using-qovery/configuration/database/mysql/index.html index 253f9b2bb2..33112ec4b3 100644 --- a/docs/using-qovery/configuration/database/mysql/index.html +++ b/docs/using-qovery/configuration/database/mysql/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/database/postgresql/index.html b/docs/using-qovery/configuration/database/postgresql/index.html index 1fad8fb7ca..6bd2954369 100644 --- a/docs/using-qovery/configuration/database/postgresql/index.html +++ b/docs/using-qovery/configuration/database/postgresql/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/database/redis/index.html b/docs/using-qovery/configuration/database/redis/index.html index 59a5c54501..d272bfb5b0 100644 --- a/docs/using-qovery/configuration/database/redis/index.html +++ b/docs/using-qovery/configuration/database/redis/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/deployment-rule/index.html b/docs/using-qovery/configuration/deployment-rule/index.html index 23b8853ba2..7cbe4a2b7e 100644 --- a/docs/using-qovery/configuration/deployment-rule/index.html +++ b/docs/using-qovery/configuration/deployment-rule/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -63,23 +63,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/environment-variable/index.html b/docs/using-qovery/configuration/environment-variable/index.html index d096f1c2fe..f1eca8532c 100644 --- a/docs/using-qovery/configuration/environment-variable/index.html +++ b/docs/using-qovery/configuration/environment-variable/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -67,23 +67,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/environment/index.html b/docs/using-qovery/configuration/environment/index.html index abf3c5f480..00c36880bc 100644 --- a/docs/using-qovery/configuration/environment/index.html +++ b/docs/using-qovery/configuration/environment/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -57,23 +57,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/helm/index.html b/docs/using-qovery/configuration/helm/index.html index fed84b594f..9de5922606 100644 --- a/docs/using-qovery/configuration/helm/index.html +++ b/docs/using-qovery/configuration/helm/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -60,23 +60,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/index.html b/docs/using-qovery/configuration/index.html index 1e68e2b2c2..7d2235b4f0 100644 --- a/docs/using-qovery/configuration/index.html +++ b/docs/using-qovery/configuration/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/lifecycle-job/index.html b/docs/using-qovery/configuration/lifecycle-job/index.html index 07c0df6f75..00b70577c0 100644 --- a/docs/using-qovery/configuration/lifecycle-job/index.html +++ b/docs/using-qovery/configuration/lifecycle-job/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -61,23 +61,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/object-storage/index.html b/docs/using-qovery/configuration/object-storage/index.html index 8a1d1a7fd1..c56ea7ce4b 100644 --- a/docs/using-qovery/configuration/object-storage/index.html +++ b/docs/using-qovery/configuration/object-storage/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -66,23 +66,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/organization/api-token/index.html b/docs/using-qovery/configuration/organization/api-token/index.html index 0961aabd6a..16ed0242a1 100644 --- a/docs/using-qovery/configuration/organization/api-token/index.html +++ b/docs/using-qovery/configuration/organization/api-token/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/organization/container-registry/index.html b/docs/using-qovery/configuration/organization/container-registry/index.html index 264645eebd..3e33910e86 100644 --- a/docs/using-qovery/configuration/organization/container-registry/index.html +++ b/docs/using-qovery/configuration/organization/container-registry/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/organization/git-repository-access/index.html b/docs/using-qovery/configuration/organization/git-repository-access/index.html index 2322999520..bf13cbb871 100644 --- a/docs/using-qovery/configuration/organization/git-repository-access/index.html +++ b/docs/using-qovery/configuration/organization/git-repository-access/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -60,23 +60,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/organization/helm-repository/index.html b/docs/using-qovery/configuration/organization/helm-repository/index.html index c2dba8ca7a..d1d6e206fe 100644 --- a/docs/using-qovery/configuration/organization/helm-repository/index.html +++ b/docs/using-qovery/configuration/organization/helm-repository/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/organization/index.html b/docs/using-qovery/configuration/organization/index.html index 623dd7b2a5..0847546ecf 100644 --- a/docs/using-qovery/configuration/organization/index.html +++ b/docs/using-qovery/configuration/organization/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -57,23 +57,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/organization/labels-annotations/index.html b/docs/using-qovery/configuration/organization/labels-annotations/index.html index 52e2b6fb4f..cf2564f114 100644 --- a/docs/using-qovery/configuration/organization/labels-annotations/index.html +++ b/docs/using-qovery/configuration/organization/labels-annotations/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -61,23 +61,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/organization/members-rbac/index.html b/docs/using-qovery/configuration/organization/members-rbac/index.html index f1f6ecb56a..adc86c0d55 100644 --- a/docs/using-qovery/configuration/organization/members-rbac/index.html +++ b/docs/using-qovery/configuration/organization/members-rbac/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -58,23 +58,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/project/index.html b/docs/using-qovery/configuration/project/index.html index 643e6ed7d6..d31e774558 100644 --- a/docs/using-qovery/configuration/project/index.html +++ b/docs/using-qovery/configuration/project/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/provider/index.html b/docs/using-qovery/configuration/provider/index.html index d35e3094c1..2c98a5608b 100644 --- a/docs/using-qovery/configuration/provider/index.html +++ b/docs/using-qovery/configuration/provider/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/service-health-checks/index.html b/docs/using-qovery/configuration/service-health-checks/index.html index 15c6773aad..1e9d43bbb5 100644 --- a/docs/using-qovery/configuration/service-health-checks/index.html +++ b/docs/using-qovery/configuration/service-health-checks/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -59,23 +59,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/configuration/user-account/index.html b/docs/using-qovery/configuration/user-account/index.html index 1ab0a32976..9be84f82cd 100644 --- a/docs/using-qovery/configuration/user-account/index.html +++ b/docs/using-qovery/configuration/user-account/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -57,23 +57,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/deployment/deploying-with-auto-deploy/index.html b/docs/using-qovery/deployment/deploying-with-auto-deploy/index.html index f6bd7be286..740ba1630b 100644 --- a/docs/using-qovery/deployment/deploying-with-auto-deploy/index.html +++ b/docs/using-qovery/deployment/deploying-with-auto-deploy/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -57,23 +57,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/deployment/deploying-with-ci-cd/index.html b/docs/using-qovery/deployment/deploying-with-ci-cd/index.html index fdc8477092..310f8eb2c3 100644 --- a/docs/using-qovery/deployment/deploying-with-ci-cd/index.html +++ b/docs/using-qovery/deployment/deploying-with-ci-cd/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/deployment/deployment-actions/index.html b/docs/using-qovery/deployment/deployment-actions/index.html index 2dede723c7..a065269fb0 100644 --- a/docs/using-qovery/deployment/deployment-actions/index.html +++ b/docs/using-qovery/deployment/deployment-actions/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -61,23 +61,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/deployment/deployment-history/index.html b/docs/using-qovery/deployment/deployment-history/index.html index c8eb94cc14..e78912073d 100644 --- a/docs/using-qovery/deployment/deployment-history/index.html +++ b/docs/using-qovery/deployment/deployment-history/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/deployment/deployment-pipeline/index.html b/docs/using-qovery/deployment/deployment-pipeline/index.html index f538945daf..814bc4badd 100644 --- a/docs/using-qovery/deployment/deployment-pipeline/index.html +++ b/docs/using-qovery/deployment/deployment-pipeline/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -59,23 +59,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/deployment/deployment-strategies/index.html b/docs/using-qovery/deployment/deployment-strategies/index.html index f136d88b7b..141df95ff7 100644 --- a/docs/using-qovery/deployment/deployment-strategies/index.html +++ b/docs/using-qovery/deployment/deployment-strategies/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/deployment/image-mirroring/index.html b/docs/using-qovery/deployment/image-mirroring/index.html index 92fd6ca85e..9bdcf62ea5 100644 --- a/docs/using-qovery/deployment/image-mirroring/index.html +++ b/docs/using-qovery/deployment/image-mirroring/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/deployment/index.html b/docs/using-qovery/deployment/index.html index a6bb41767f..b648777728 100644 --- a/docs/using-qovery/deployment/index.html +++ b/docs/using-qovery/deployment/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -58,23 +58,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/deployment/logs/index.html b/docs/using-qovery/deployment/logs/index.html index 4a5fd8230a..2232269cfe 100644 --- a/docs/using-qovery/deployment/logs/index.html +++ b/docs/using-qovery/deployment/logs/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/deployment/running-and-deployment-statuses/index.html b/docs/using-qovery/deployment/running-and-deployment-statuses/index.html index 838e6bfb5a..1d946db92c 100644 --- a/docs/using-qovery/deployment/running-and-deployment-statuses/index.html +++ b/docs/using-qovery/deployment/running-and-deployment-statuses/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/index.html b/docs/using-qovery/index.html index 0e6d7ccdc6..04c752d821 100644 --- a/docs/using-qovery/index.html +++ b/docs/using-qovery/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/api-integration/index.html b/docs/using-qovery/integration/api-integration/index.html index 6e65c1b474..1dc3242630 100644 --- a/docs/using-qovery/integration/api-integration/index.html +++ b/docs/using-qovery/integration/api-integration/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/container-registry/index.html b/docs/using-qovery/integration/container-registry/index.html index 90cc8b8b86..0ec2697707 100644 --- a/docs/using-qovery/integration/container-registry/index.html +++ b/docs/using-qovery/integration/container-registry/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/continuous-integration/circle-ci/index.html b/docs/using-qovery/integration/continuous-integration/circle-ci/index.html index 45b7eaa917..4d24ebdc91 100644 --- a/docs/using-qovery/integration/continuous-integration/circle-ci/index.html +++ b/docs/using-qovery/integration/continuous-integration/circle-ci/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -58,23 +58,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/continuous-integration/github-actions/index.html b/docs/using-qovery/integration/continuous-integration/github-actions/index.html index 4555681b50..1dcd59cfa1 100644 --- a/docs/using-qovery/integration/continuous-integration/github-actions/index.html +++ b/docs/using-qovery/integration/continuous-integration/github-actions/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -66,23 +66,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/continuous-integration/gitlab-ci/index.html b/docs/using-qovery/integration/continuous-integration/gitlab-ci/index.html index 6a8ef880f0..53afd7530c 100644 --- a/docs/using-qovery/integration/continuous-integration/gitlab-ci/index.html +++ b/docs/using-qovery/integration/continuous-integration/gitlab-ci/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -61,23 +61,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/continuous-integration/index.html b/docs/using-qovery/integration/continuous-integration/index.html index c518bff425..aa0643abf6 100644 --- a/docs/using-qovery/integration/continuous-integration/index.html +++ b/docs/using-qovery/integration/continuous-integration/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/continuous-integration/jenkins/index.html b/docs/using-qovery/integration/continuous-integration/jenkins/index.html index 2b760c86eb..aac5bd81d9 100644 --- a/docs/using-qovery/integration/continuous-integration/jenkins/index.html +++ b/docs/using-qovery/integration/continuous-integration/jenkins/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -58,23 +58,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/git-repository/index.html b/docs/using-qovery/integration/git-repository/index.html index 9ab39c7f47..1f0a855b29 100644 --- a/docs/using-qovery/integration/git-repository/index.html +++ b/docs/using-qovery/integration/git-repository/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/helm-repository/index.html b/docs/using-qovery/integration/helm-repository/index.html index 0f9cdd685f..2d6be38c98 100644 --- a/docs/using-qovery/integration/helm-repository/index.html +++ b/docs/using-qovery/integration/helm-repository/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/iac/cloudformation/index.html b/docs/using-qovery/integration/iac/cloudformation/index.html index 706446f0ea..40b679a566 100644 --- a/docs/using-qovery/integration/iac/cloudformation/index.html +++ b/docs/using-qovery/integration/iac/cloudformation/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/iac/index.html b/docs/using-qovery/integration/iac/index.html index 9b51619e42..8d3f59fa83 100644 --- a/docs/using-qovery/integration/iac/index.html +++ b/docs/using-qovery/integration/iac/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/iac/other/index.html b/docs/using-qovery/integration/iac/other/index.html index dc4c940d35..b78c0219fc 100644 --- a/docs/using-qovery/integration/iac/other/index.html +++ b/docs/using-qovery/integration/iac/other/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/iac/terraform/index.html b/docs/using-qovery/integration/iac/terraform/index.html index 218eab8b9c..6c2d482067 100644 --- a/docs/using-qovery/integration/iac/terraform/index.html +++ b/docs/using-qovery/integration/iac/terraform/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/index.html b/docs/using-qovery/integration/index.html index f55d09dcea..95fab2cb58 100644 --- a/docs/using-qovery/integration/index.html +++ b/docs/using-qovery/integration/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/monitoring/datadog/index.html b/docs/using-qovery/integration/monitoring/datadog/index.html index 852dafa6f4..89ef55e171 100644 --- a/docs/using-qovery/integration/monitoring/datadog/index.html +++ b/docs/using-qovery/integration/monitoring/datadog/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/monitoring/index.html b/docs/using-qovery/integration/monitoring/index.html index 68f9af095d..8269b8da76 100644 --- a/docs/using-qovery/integration/monitoring/index.html +++ b/docs/using-qovery/integration/monitoring/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/monitoring/new-relic/index.html b/docs/using-qovery/integration/monitoring/new-relic/index.html index 804d74cf53..fd2aa690f1 100644 --- a/docs/using-qovery/integration/monitoring/new-relic/index.html +++ b/docs/using-qovery/integration/monitoring/new-relic/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/secret-manager/aws-secrets-manager/index.html b/docs/using-qovery/integration/secret-manager/aws-secrets-manager/index.html index 6469a85321..38f5455860 100644 --- a/docs/using-qovery/integration/secret-manager/aws-secrets-manager/index.html +++ b/docs/using-qovery/integration/secret-manager/aws-secrets-manager/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/secret-manager/doppler/index.html b/docs/using-qovery/integration/secret-manager/doppler/index.html index 01247efe2f..e8d0e0e218 100644 --- a/docs/using-qovery/integration/secret-manager/doppler/index.html +++ b/docs/using-qovery/integration/secret-manager/doppler/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/secret-manager/index.html b/docs/using-qovery/integration/secret-manager/index.html index c68fe1f19d..7887dfa15f 100644 --- a/docs/using-qovery/integration/secret-manager/index.html +++ b/docs/using-qovery/integration/secret-manager/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/slack/index.html b/docs/using-qovery/integration/slack/index.html index 1710bd1a54..793ec78a5b 100644 --- a/docs/using-qovery/integration/slack/index.html +++ b/docs/using-qovery/integration/slack/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/terraform-provider/index.html b/docs/using-qovery/integration/terraform-provider/index.html index f6a61b26e1..5657b4f897 100644 --- a/docs/using-qovery/integration/terraform-provider/index.html +++ b/docs/using-qovery/integration/terraform-provider/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/webhook/index.html b/docs/using-qovery/integration/webhook/index.html index 3967b32d68..4264fd2975 100644 --- a/docs/using-qovery/integration/webhook/index.html +++ b/docs/using-qovery/integration/webhook/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/interface/cli/index.html b/docs/using-qovery/interface/cli/index.html index a820749c8a..de53d38803 100644 --- a/docs/using-qovery/interface/cli/index.html +++ b/docs/using-qovery/interface/cli/index.html @@ -26,27 +26,27 @@ - + - + - + - + - + - + - + - + @@ -89,27 +89,27 @@ - + - + - + - + - + - + - + - + diff --git a/docs/using-qovery/interface/index.html b/docs/using-qovery/interface/index.html index ce71c5034f..bea74d89b1 100644 --- a/docs/using-qovery/interface/index.html +++ b/docs/using-qovery/interface/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/interface/rest-api/index.html b/docs/using-qovery/interface/rest-api/index.html index 154e7676f8..d85019cc35 100644 --- a/docs/using-qovery/interface/rest-api/index.html +++ b/docs/using-qovery/interface/rest-api/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/interface/terraform-interface/index.html b/docs/using-qovery/interface/terraform-interface/index.html index 60dca2f3ec..a11d9d47ec 100644 --- a/docs/using-qovery/interface/terraform-interface/index.html +++ b/docs/using-qovery/interface/terraform-interface/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/interface/web-interface/index.html b/docs/using-qovery/interface/web-interface/index.html index f2dc076a57..f5fd918054 100644 --- a/docs/using-qovery/interface/web-interface/index.html +++ b/docs/using-qovery/interface/web-interface/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/maintenance/index.html b/docs/using-qovery/maintenance/index.html index 063a1495c0..ad19d4343a 100644 --- a/docs/using-qovery/maintenance/index.html +++ b/docs/using-qovery/maintenance/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -71,23 +71,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/troubleshoot/cluster-troubleshoot/index.html b/docs/using-qovery/troubleshoot/cluster-troubleshoot/index.html index 67c0ddb0d4..9d768200d0 100644 --- a/docs/using-qovery/troubleshoot/cluster-troubleshoot/index.html +++ b/docs/using-qovery/troubleshoot/cluster-troubleshoot/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/troubleshoot/index.html b/docs/using-qovery/troubleshoot/index.html index 93365a914c..f85c50465e 100644 --- a/docs/using-qovery/troubleshoot/index.html +++ b/docs/using-qovery/troubleshoot/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/troubleshoot/service-deployment-troubleshoot/index.html b/docs/using-qovery/troubleshoot/service-deployment-troubleshoot/index.html index 112824e58f..c77715c887 100644 --- a/docs/using-qovery/troubleshoot/service-deployment-troubleshoot/index.html +++ b/docs/using-qovery/troubleshoot/service-deployment-troubleshoot/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -59,23 +59,23 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/troubleshoot/service-run-troubleshoot/index.html b/docs/using-qovery/troubleshoot/service-run-troubleshoot/index.html index 5ee7a659d5..c3f6a47e21 100644 --- a/docs/using-qovery/troubleshoot/service-run-troubleshoot/index.html +++ b/docs/using-qovery/troubleshoot/service-run-troubleshoot/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + - + diff --git a/f7098925.ffd0ff3a.js b/f7098925.466f9032.js similarity index 99% rename from f7098925.ffd0ff3a.js rename to f7098925.466f9032.js index e365aa8004..e9e2e0a651 100644 --- a/f7098925.ffd0ff3a.js +++ b/f7098925.466f9032.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[297],{449:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return p})),n.d(t,"metadata",(function(){return d})),n.d(t,"rightToc",(function(){return h})),n.d(t,"default",(function(){return g}));var a=n(1),r=n(9),o=(n(0),n(465)),i=n(464),l=n(473),s=n(472),c=n(477),b=n(479),u=n(469),p={last_modified_on:"2024-05-03",$schema:"/.meta/.schemas/guides.json",title:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: kotlin","database: postgresql"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",permalink:"/guides/tutorial/url-shortener-api-with-kotlin",readingTime:"14 min read",source:"@site/guides/tutorial/url-shortener-api-with-kotlin.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: kotlin",permalink:"/guides/tags/language-kotlin"},{label:"database: postgresql",permalink:"/guides/tags/database-postgresql"}],title:"URL Shortener API with Kotlin (Part 1/2)",truncated:!1,prevItem:{title:"Terraform",permalink:"/guides/advanced/terraform"},nextItem:{title:"Use an API gateway in front of multiple services",permalink:"/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services"}},h=[{value:"Introduction",id:"introduction",children:[]},{value:"What is a URL shortener?",id:"what-is-a-url-shortener",children:[]},{value:"Ktor principles",id:"ktor-principles",children:[{value:"Kotlin",id:"kotlin",children:[]},{value:"Functional programming",id:"functional-programming",children:[]},{value:"Asynchronous",id:"asynchronous",children:[]}]},{value:"HTTP Server",id:"http-server",children:[]},{value:"URL Encoder",id:"url-encoder",children:[{value:"Handle identifier collision",id:"handle-identifier-collision",children:[]}]},{value:"URL Decoder",id:"url-decoder",children:[]},{value:"Redirect",id:"redirect",children:[]},{value:"Stats: clicks over time",id:"stats-clicks-over-time",children:[]},{value:"Try the API",id:"try-the-api",children:[]},{value:"Connect to a PostgreSQL database with Exposed",id:"connect-to-a-postgresql-database-with-exposed",children:[]},{value:"Deploy in the Cloud with Qovery",id:"deploy-in-the-cloud-with-qovery",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Create an application",id:"create-an-application",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Connect to PostgreSQL",id:"connect-to-postgresql",children:[]},{value:"Deploy",id:"deploy",children:[]}]},{value:"Conclusion",id:"conclusion",children:[]}],m={rightToc:h};function g(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},m,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"The source code for this post can be found on this ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener"}),"github repo")),Object(o.b)("h2",{id:"introduction"},"Introduction"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://ktor.io/"}),"Ktor")," is a brand new micro-framework created by the Jetbrains team, and running over the JVM. Jetbrains are the authors of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/"}),"Kotlin")," - which is now the official programming language for Android, and one of the most popular programming language on the JVM. Kotlin is gaining popularity on server-side and multi-platform application development."),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Ktor is a framework for building asynchronous servers and clients in connected systems using the powerful Kotlin programming language.")),Object(o.b)("p",null,"In this article, you will learn:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"How to design a simple URL shortener."),Object(o.b)("li",{parentName:"ul"},"How to use the Ktor micro-framework with Kotlin"),Object(o.b)("li",{parentName:"ul"},"How to deploy a Ktor application")),Object(o.b)("p",null,"I have +4 years of experience using Spring, and I wanted to give a try to Ktor, which seems promising. Creating a URL shortener is an excellent way to start."),Object(o.b)("h2",{id:"what-is-a-url-shortener"},"What is a URL shortener?"),Object(o.b)("p",null,"A URL shortener is a simple tool that takes a long URL and turns it into a very short one"),Object(o.b)("p",null,Object(o.b)("img",Object(a.a)({parentName:"p"},{src:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655859bc2ae5c7371efa36_urlshortener%20image.png",alt:"Flow of URL shortening - from original URL to short URL"}))),Object(o.b)("p",null,"It is commonly used for 3 reasons:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Tracking clicks"),Object(o.b)("li",{parentName:"ul"},"Make URL much more concise."),Object(o.b)("li",{parentName:"ul"},"Hide original URL")),Object(o.b)("p",null,"One famous freemium provider is bit.ly (see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655a34bc2ae5452b1f124b_bitly.gif"}),"here"),")"),Object(o.b)("p",null,"In this article we will make a basic bit.ly like URL shortener. Let\u2019s go"),Object(o.b)("h2",{id:"ktor-principles"},"Ktor principles"),Object(o.b)("p",null,"Before starting I want to introduce the 3 main principles of Ktor."),Object(o.b)("h3",{id:"kotlin"},"Kotlin"),Object(o.b)("p",null,"Kotlin is the language used to develop on Ktor. It is an object-oriented and functional language. It is very stable and runs on the JVM. Kotlin is 100% interoperable with Java and allows you to benefit from its ecosystem (libraries, build system, etc.)."),Object(o.b)("h3",{id:"functional-programming"},"Functional programming"),Object(o.b)("p",null,"Ktor leverages the power of Kotlin and has a very functional approach. When writing code, everything seems obvious. It's very similar to what you can see on NodeJS. For me, coming from the Spring world, I find it very efficient to read and use."),Object(o.b)("h3",{id:"asynchronous"},"Asynchronous"),Object(o.b)("p",null,"Kotlin provides asynchronous code execution, thanks to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/docs/reference/coroutines-overview.html"}),"coroutines"),". Ktor exploits this feature to its full potential, and even if you have the impression that you are writing code in a blocking manner, this is not the case. Ktor makes your life easier."),Object(o.b)("h2",{id:"http-server"},"HTTP Server"),Object(o.b)("p",null,"Here is a complete and simple example of how to expose an HTTP server (",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080"}),"http://localhost:8080"),") with Ktor."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun main(args: Array): Unit = io.ktor.server.netty.EngineMain.main(args)\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n routing {\n get("/") {\n call.respondText("Hello World", contentType = ContentType.Text.Plain)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-encoder"},"URL Encoder"),Object(o.b)("p",null,"The URL encoder will translate an incoming address into a smaller URL. The idea is to provide an ID that will identify the final URL. Using a hash function is perfect for this operation. However, the operation is non-reversible, meaning you can\u2019t retrieve the final URL by the generated identifier."),Object(o.b)("p",null,"Function to transform a long URL into a shorter URL"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension\nfun String.encodeToID(): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(6)\n // return id\n return truncatedHashString\n}\n')),Object(o.b)("p",null,"We expose the function through the REST API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// Request object\ndata class Request(val url: String) {\n fun toResponse(): Response = Response(url, url.encodeToID())\n}\n\n// Response object\ndata class Response(val originalURL: String, private val id: String) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n enable(SerializationFeature.INDENT_OUTPUT)\n propertyNamingStrategy = PropertyNamingStrategy.SNAKE_CASE\n }\n }\n\n // Hash Table Response object by ID\n val responseByID = mutableMapOf()\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val retrievedResponse = responseByID[request.url.encodeToID()]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[request.url.encodeToID()] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h3",{id:"handle-identifier-collision"},"Handle identifier collision"),Object(o.b)("p",null,"Using a hash function makes no guarantee that it is not already being used. If it is in use, then you need to change it to another one. Note: even if the probability to have a collision is very low, you should handle this case."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension (function signature has changed)\nfun String.encodeToID(truncateLength: Int = 6): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(truncateLength)\n // return id\n return truncatedHashString\n}\n\n//...\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n // Hash Table Response object by id\n val responseByID = mutableMapOf()\n\n fun getIdentifier(url: String, truncateLength: Int = 6): String {\n val id = url.encodeToID()\n\n val retrievedResponse = responseByID[id]\n if (retrievedResponse?.originalURL != url) {\n // collision spotted !\n return getIdentifier(url, truncateLength + 1)\n }\n\n return id\n }\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val id = getID(request.url)\n val retrievedResponse = responseByID[id]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[id] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-decoder"},"URL Decoder"),Object(o.b)("p",null,"Decoding the URL is the process of returning the original URL from the short URL. This is the reverse operation made by the URL Encoder"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),"val shortURL = getShortURL(request.url)\nval retrievedResponse = responseByID[shortURL]\nretrievedResponse?.originalURL // return original URL or null\n")),Object(o.b)("h2",{id:"redirect"},"Redirect"),Object(o.b)("p",null,"When a user clicks on a short URL, the user is redirected to the final URL. HTTP protocol allows to do this naturally by returning a 302 status code and a redirection URL."),Object(o.b)("p",null,"With Ktor the redirection is as simple as calling a method with the final URL as a parameter."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'call.respondRedirect("https://www.qovery.com")\n')),Object(o.b)("p",null,"What we expect is that when the user visits ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080/fbc951"}),"http://localhost:8080/fbc951")," he is redirected to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"https://www.qovery.com"),". If the URL is incorrect then redirect to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.google.com"}),"https://www.google.com")),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n routing {\n get("/{id}") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respondRedirect("https://www.google.com")\n }\n\n log.debug("redirect to: $retrievedResponse")\n call.respondRedirect(retrievedResponse.originalURL)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"stats-clicks-over-time"},"Stats: clicks over time"),Object(o.b)("p",null,"Something that is really useful on products like bit.ly is the stats provided (click over time, referrers, country of visitors). Here is how to store click over time and make them available through the API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// added\ndata class Stat(val clicksOverTime: MutableList = mutableListOf())\n\n// Response object (modified with Stat)\ndata class Response(val originalURL: String, private val id: String, val stat: Stat = Stat()) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n // ...\n // add this line to return Date object as ISO8601 format\n disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)\n }\n }\n // ...\n routing {\n // ...\n get("/api/v1/url/{id}/stat") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respond(HttpStatusCode.NoContent)\n }\n\n call.respond(retrievedResponse.stat)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"try-the-api"},"Try the API"),Object(o.b)("p",null,"Run the application"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ ./gradlew run\n//...\n2020-03-12 09:28:08.150 [main] INFO Application - No ktor.deployment.watch patterns specified, automatic reload is not active\n2020-03-12 09:28:08.606 [main] INFO Application - Responding at http://0.0.0.0:8080\n")),Object(o.b)("p",null,"Then execute the commands"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'# generate a short URL\n$ curl -X POST -d \'{"url": "https://www.qovery.com"}\' -H "Content-type: application/json" "http://localhost:8080/api/v1/encode"\n{\n "original_url": "https://www.qovery.com",\n "stat": {\n "clicks_over_time": []\n },\n "short_url": "http://localhost:8080/fbc951"\n}\n\n# generate 4 fake clicks\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n\n# show stat\n$ curl -X GET \'http://localhost:8080/api/v1/url/fbc951/stat\'\n{\n "clicks_over_time": [\n "2020-03-11T21:10:52.354+0000",\n "2020-03-11T21:10:54.093+0000",\n "2020-03-11T21:12:34.987+0000",\n "2020-03-11T21:12:37.223+0000"\n ]\n}\n')),Object(o.b)("h2",{id:"connect-to-a-postgresql-database-with-exposed"},"Connect to a PostgreSQL database with Exposed"),Object(o.b)("p",null,"By storing the data in memory, we lose all the data every time the application restart. Which is problematic for running in production. To make the data persistent we will store it in a PostgreSQL database. We will have to add 1 new dependency - ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/JetBrains/Exposed"}),"Exposed"),". Exposed (with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/brettwooldridge/HikariCP"}),"Hikari Connection Pool"),") is a lightweight SQL library on top of JDBC driver for Kotlin. With exposed it is possible to access databases in two flavours: typesafe SQL wrapping DSL and lightweight Data Access Objects (DAO)."),Object(o.b)("p",null,"Add the dependencies to your build.gradle (or POM.xml)"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'repositories {\n jcenter()\n}\n\ndependencies {\n // Connection Pool and PostgreSQL driver\n implementation("com.zaxxer:HikariCP:3.4.2")\n implementation("org.postgresql:postgresql:42.2.11")\n\n // Exposed\n implementation("org.jetbrains.exposed:exposed-core:0.22.1")\n implementation("org.jetbrains.exposed:exposed-dao:0.22.1")\n implementation("org.jetbrains.exposed:exposed-jdbc:0.22.1")\n implementation("org.jetbrains.exposed:exposed-java-time:0.22.1")\n}\n')),Object(o.b)("p",null,"We need to have 2 distincts tables, one containing all the final URLs with their correspond identifier"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ResponseTable : Table("response") {\n val id = varchar("id", 32)\n val originalURL = varchar("original_url", 2048)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"And a second one with all the clicking points"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ClickOverTimeTable : Table("click_over_time") {\n val id = integer("id").autoIncrement()\n val clickDate = datetime("click_date")\n val response = reference("response_id", onDelete = ReferenceOption.CASCADE, refColumn = ResponseTable.id)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"We need to create the tables as defined above programmatically"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:postgresql://127.0.0.1:5432/exposed"\n username = "exposed"\n password = "exposed"\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n initDatabase()\n // ...\n}\n')),Object(o.b)("p",null,"We have to replace the Hash Table used to store the data by the PostgreSQL database (see the final code ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener/blob/with_postgresql/src/Application.kt"}),"here"),")"),Object(o.b)("h2",{id:"deploy-in-the-cloud-with-qovery"},"Deploy in the Cloud with Qovery"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery")," is going to help us to deploy the final application in the Cloud without the need to configure the CI/CD, network, security, load balancing, database and all the DevOps tasks"),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Qovery is a deployment platform that helps all developers to deploy their applications in the Cloud in just a few seconds")),Object(o.b)(u.a,{name:"tutorial",mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Your code need to be hosted on Github/Gitlab/Bitbucket"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"https://ktor.io/quickstart/quickstart/docker.html"}),"Package your Ktor application to build and run it on Docker")))),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://console.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.png",alt:"Qovery Sign-up page"}))))),Object(o.b)(b.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(b.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(b.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")))),Object(o.b)("h3",{id:"create-an-application"},"Create an application"),Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(o.b)("p",null,"To follow the guide, ",Object(o.b)("a",{href:"https://github.com/evoxmusic/ktor-url-shortener.git"},"you can fork and use our repository")),Object(o.b)("p",null,"Use the forked repository (and branch ",Object(o.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("p",null,"After the application is created: "),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"})),Object(o.b)("p",null,"This will expose your application and make accessible in the public internet.")))),Object(o.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(o.b)("p",null,"Create and deploy a new database."),Object(o.b)(i.a,{type:"warning",mdxType:"Alert"},"Name the new database **my-pql-db** to follow the guide flawlessly"),Object(o.b)("p",null,"To learn how to do it, you can ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"),"."),Object(o.b)("h3",{id:"connect-to-postgresql"},"Connect to PostgreSQL"),Object(o.b)("p",null,"Qovery add dynamically all required environment variables to connect to the database at the runtime of the container."),Object(o.b)("p",null,"You can list them all in ",Object(o.b)("strong",{parentName:"p"},"Environment Variables")," ",Object(o.b)("strong",{parentName:"p"},"Secrets")," section in your application overview, as described in ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"envs guide"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/db-envs.png",alt:"DB Secrets"})),Object(o.b)("p",null,"To use them:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:${System.getenv("QOVERY_DATABASE_MY_PQL_DB_CONNECTION_URI_WITHOUT_CREDENTIALS")}"\n username = System.getenv("QOVERY_DATABASE_MY_PQL_DB_USERNAME")\n password = System.getenv("QOVERY_DATABASE_MY_PQL_DB_PASSWORD")\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n')),Object(o.b)("h3",{id:"deploy"},"Deploy"),Object(o.b)("p",null,"To deploy your application and database, click ",Object(o.b)("strong",{parentName:"p"},"Action")," and ",Object(o.b)("strong",{parentName:"p"},"Deploy")," button in your environments list view:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",null,"To get public URL to the application, open application details and click on ",Object(o.b)("strong",{parentName:"p"},"Action")," ",Object(o.b)("strong",{parentName:"p"},"Open"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env-1.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/open-app.png",alt:"Kotlin URL Shortener"})),Object(o.b)("h2",{id:"conclusion"},"Conclusion"),Object(o.b)("p",null,"We have seen that creating an URL shortener API with Ktor and Kotlin is extremely simple. Connecting the application to PostgreSQL is very easy with the Exposed library. In just a few lines of code, the service is fully functional and can be deployed in production very quickly with the help of Qovery. In the next part, we will see how to create a web interface connecting to this API to convert our URLs without using the curl command."),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"Part 2"),": bind a web interface to the API - ","[link coming soon]"),Object(o.b)(l.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),o=n(463),i=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return r.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:i()("feather","icon-"+(o||s))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),o=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},470:function(e,t,n){"use strict";var a=n(1),r=n(0),o=n.n(r),i=n(39),l=n(474),s=n(20),c=n.n(s);t.a=function(e){var t,n=e.to,s=e.href,b=n||s,u=Object(l.a)(b),p=Object(r.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?o.a.createElement(i.b,Object(a.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var n,a;d&&e&&u&&(n=e,a=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:b})):o.a.createElement("a",Object(a.a)({},e,{href:b}))}},472:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(463),n(471)),i=n.n(o);n(133);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(s),b=Object(a.useState)(null),u=b[0],p=b[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!u&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=n(470),i=n(463),l=n.n(i);n(134);t.a=function(e){var t=e.children,n=e.className,a=e.badge,i=e.leftIcon,s=e.rightIcon,c=e.size,b=e.target,u=e.to,p=l()("jump-to","jump-to--"+c,n),d=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},i&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+i})),r.a.createElement("div",{className:"jump-to--main"},a?r.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return b?r.a.createElement("a",{href:u,target:b,className:p},d):r.a.createElement(o.a,{to:u,className:p},d)}},474:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},477:function(e,t,n){"use strict";var a=n(1),r=(n(481),n(478),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),i=n(483),l=n(463),s=n.n(l),c=n(471),b=n.n(c),u=n(482),p=37,d=39;function h(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",r,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function m(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return o.a.createElement(i.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,g=e.size,v=(e.style,e.values),j=e.urlKey,O=Object(u.a)(),f=O.tabGroupChoices,y=O.setTabGroupChoices,w=Object(r.useState)(n),N=w[0],k=w[1];if(null!=i){var T=f[i];null!=T&&T!==N&&k(T)}var R=function(e){k(e),null!=i&&y(i,e)},S=[],I=function(e,t,n){switch(n.keyCode){case d:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=b.a.parse(window.location.search);e[j]&&k(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(g||"md")},l&&o.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?o.a.createElement(m,Object(a.a)({changeSelectedValue:R,handleKeydown:I,placeholder:s,selectedValue:N,size:g,tabRefs:S},e)):o.a.createElement(h,Object(a.a)({changeSelectedValue:R,handleKeydown:I,selectedValue:N,tabRefs:S},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},479:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[297],{449:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return p})),n.d(t,"metadata",(function(){return d})),n.d(t,"rightToc",(function(){return h})),n.d(t,"default",(function(){return g}));var a=n(1),r=n(9),o=(n(0),n(465)),i=n(464),l=n(473),s=n(472),c=n(477),b=n(478),u=n(469),p={last_modified_on:"2024-05-03",$schema:"/.meta/.schemas/guides.json",title:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: kotlin","database: postgresql"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",permalink:"/guides/tutorial/url-shortener-api-with-kotlin",readingTime:"14 min read",source:"@site/guides/tutorial/url-shortener-api-with-kotlin.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: kotlin",permalink:"/guides/tags/language-kotlin"},{label:"database: postgresql",permalink:"/guides/tags/database-postgresql"}],title:"URL Shortener API with Kotlin (Part 1/2)",truncated:!1,prevItem:{title:"Terraform",permalink:"/guides/advanced/terraform"},nextItem:{title:"Use an API gateway in front of multiple services",permalink:"/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services"}},h=[{value:"Introduction",id:"introduction",children:[]},{value:"What is a URL shortener?",id:"what-is-a-url-shortener",children:[]},{value:"Ktor principles",id:"ktor-principles",children:[{value:"Kotlin",id:"kotlin",children:[]},{value:"Functional programming",id:"functional-programming",children:[]},{value:"Asynchronous",id:"asynchronous",children:[]}]},{value:"HTTP Server",id:"http-server",children:[]},{value:"URL Encoder",id:"url-encoder",children:[{value:"Handle identifier collision",id:"handle-identifier-collision",children:[]}]},{value:"URL Decoder",id:"url-decoder",children:[]},{value:"Redirect",id:"redirect",children:[]},{value:"Stats: clicks over time",id:"stats-clicks-over-time",children:[]},{value:"Try the API",id:"try-the-api",children:[]},{value:"Connect to a PostgreSQL database with Exposed",id:"connect-to-a-postgresql-database-with-exposed",children:[]},{value:"Deploy in the Cloud with Qovery",id:"deploy-in-the-cloud-with-qovery",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Create an application",id:"create-an-application",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Connect to PostgreSQL",id:"connect-to-postgresql",children:[]},{value:"Deploy",id:"deploy",children:[]}]},{value:"Conclusion",id:"conclusion",children:[]}],m={rightToc:h};function g(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},m,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"The source code for this post can be found on this ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener"}),"github repo")),Object(o.b)("h2",{id:"introduction"},"Introduction"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://ktor.io/"}),"Ktor")," is a brand new micro-framework created by the Jetbrains team, and running over the JVM. Jetbrains are the authors of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/"}),"Kotlin")," - which is now the official programming language for Android, and one of the most popular programming language on the JVM. Kotlin is gaining popularity on server-side and multi-platform application development."),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Ktor is a framework for building asynchronous servers and clients in connected systems using the powerful Kotlin programming language.")),Object(o.b)("p",null,"In this article, you will learn:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"How to design a simple URL shortener."),Object(o.b)("li",{parentName:"ul"},"How to use the Ktor micro-framework with Kotlin"),Object(o.b)("li",{parentName:"ul"},"How to deploy a Ktor application")),Object(o.b)("p",null,"I have +4 years of experience using Spring, and I wanted to give a try to Ktor, which seems promising. Creating a URL shortener is an excellent way to start."),Object(o.b)("h2",{id:"what-is-a-url-shortener"},"What is a URL shortener?"),Object(o.b)("p",null,"A URL shortener is a simple tool that takes a long URL and turns it into a very short one"),Object(o.b)("p",null,Object(o.b)("img",Object(a.a)({parentName:"p"},{src:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655859bc2ae5c7371efa36_urlshortener%20image.png",alt:"Flow of URL shortening - from original URL to short URL"}))),Object(o.b)("p",null,"It is commonly used for 3 reasons:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Tracking clicks"),Object(o.b)("li",{parentName:"ul"},"Make URL much more concise."),Object(o.b)("li",{parentName:"ul"},"Hide original URL")),Object(o.b)("p",null,"One famous freemium provider is bit.ly (see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655a34bc2ae5452b1f124b_bitly.gif"}),"here"),")"),Object(o.b)("p",null,"In this article we will make a basic bit.ly like URL shortener. Let\u2019s go"),Object(o.b)("h2",{id:"ktor-principles"},"Ktor principles"),Object(o.b)("p",null,"Before starting I want to introduce the 3 main principles of Ktor."),Object(o.b)("h3",{id:"kotlin"},"Kotlin"),Object(o.b)("p",null,"Kotlin is the language used to develop on Ktor. It is an object-oriented and functional language. It is very stable and runs on the JVM. Kotlin is 100% interoperable with Java and allows you to benefit from its ecosystem (libraries, build system, etc.)."),Object(o.b)("h3",{id:"functional-programming"},"Functional programming"),Object(o.b)("p",null,"Ktor leverages the power of Kotlin and has a very functional approach. When writing code, everything seems obvious. It's very similar to what you can see on NodeJS. For me, coming from the Spring world, I find it very efficient to read and use."),Object(o.b)("h3",{id:"asynchronous"},"Asynchronous"),Object(o.b)("p",null,"Kotlin provides asynchronous code execution, thanks to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/docs/reference/coroutines-overview.html"}),"coroutines"),". Ktor exploits this feature to its full potential, and even if you have the impression that you are writing code in a blocking manner, this is not the case. Ktor makes your life easier."),Object(o.b)("h2",{id:"http-server"},"HTTP Server"),Object(o.b)("p",null,"Here is a complete and simple example of how to expose an HTTP server (",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080"}),"http://localhost:8080"),") with Ktor."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun main(args: Array): Unit = io.ktor.server.netty.EngineMain.main(args)\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n routing {\n get("/") {\n call.respondText("Hello World", contentType = ContentType.Text.Plain)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-encoder"},"URL Encoder"),Object(o.b)("p",null,"The URL encoder will translate an incoming address into a smaller URL. The idea is to provide an ID that will identify the final URL. Using a hash function is perfect for this operation. However, the operation is non-reversible, meaning you can\u2019t retrieve the final URL by the generated identifier."),Object(o.b)("p",null,"Function to transform a long URL into a shorter URL"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension\nfun String.encodeToID(): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(6)\n // return id\n return truncatedHashString\n}\n')),Object(o.b)("p",null,"We expose the function through the REST API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// Request object\ndata class Request(val url: String) {\n fun toResponse(): Response = Response(url, url.encodeToID())\n}\n\n// Response object\ndata class Response(val originalURL: String, private val id: String) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n enable(SerializationFeature.INDENT_OUTPUT)\n propertyNamingStrategy = PropertyNamingStrategy.SNAKE_CASE\n }\n }\n\n // Hash Table Response object by ID\n val responseByID = mutableMapOf()\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val retrievedResponse = responseByID[request.url.encodeToID()]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[request.url.encodeToID()] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h3",{id:"handle-identifier-collision"},"Handle identifier collision"),Object(o.b)("p",null,"Using a hash function makes no guarantee that it is not already being used. If it is in use, then you need to change it to another one. Note: even if the probability to have a collision is very low, you should handle this case."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension (function signature has changed)\nfun String.encodeToID(truncateLength: Int = 6): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(truncateLength)\n // return id\n return truncatedHashString\n}\n\n//...\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n // Hash Table Response object by id\n val responseByID = mutableMapOf()\n\n fun getIdentifier(url: String, truncateLength: Int = 6): String {\n val id = url.encodeToID()\n\n val retrievedResponse = responseByID[id]\n if (retrievedResponse?.originalURL != url) {\n // collision spotted !\n return getIdentifier(url, truncateLength + 1)\n }\n\n return id\n }\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val id = getID(request.url)\n val retrievedResponse = responseByID[id]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[id] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-decoder"},"URL Decoder"),Object(o.b)("p",null,"Decoding the URL is the process of returning the original URL from the short URL. This is the reverse operation made by the URL Encoder"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),"val shortURL = getShortURL(request.url)\nval retrievedResponse = responseByID[shortURL]\nretrievedResponse?.originalURL // return original URL or null\n")),Object(o.b)("h2",{id:"redirect"},"Redirect"),Object(o.b)("p",null,"When a user clicks on a short URL, the user is redirected to the final URL. HTTP protocol allows to do this naturally by returning a 302 status code and a redirection URL."),Object(o.b)("p",null,"With Ktor the redirection is as simple as calling a method with the final URL as a parameter."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'call.respondRedirect("https://www.qovery.com")\n')),Object(o.b)("p",null,"What we expect is that when the user visits ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080/fbc951"}),"http://localhost:8080/fbc951")," he is redirected to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"https://www.qovery.com"),". If the URL is incorrect then redirect to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.google.com"}),"https://www.google.com")),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n routing {\n get("/{id}") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respondRedirect("https://www.google.com")\n }\n\n log.debug("redirect to: $retrievedResponse")\n call.respondRedirect(retrievedResponse.originalURL)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"stats-clicks-over-time"},"Stats: clicks over time"),Object(o.b)("p",null,"Something that is really useful on products like bit.ly is the stats provided (click over time, referrers, country of visitors). Here is how to store click over time and make them available through the API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// added\ndata class Stat(val clicksOverTime: MutableList = mutableListOf())\n\n// Response object (modified with Stat)\ndata class Response(val originalURL: String, private val id: String, val stat: Stat = Stat()) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n // ...\n // add this line to return Date object as ISO8601 format\n disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)\n }\n }\n // ...\n routing {\n // ...\n get("/api/v1/url/{id}/stat") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respond(HttpStatusCode.NoContent)\n }\n\n call.respond(retrievedResponse.stat)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"try-the-api"},"Try the API"),Object(o.b)("p",null,"Run the application"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ ./gradlew run\n//...\n2020-03-12 09:28:08.150 [main] INFO Application - No ktor.deployment.watch patterns specified, automatic reload is not active\n2020-03-12 09:28:08.606 [main] INFO Application - Responding at http://0.0.0.0:8080\n")),Object(o.b)("p",null,"Then execute the commands"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'# generate a short URL\n$ curl -X POST -d \'{"url": "https://www.qovery.com"}\' -H "Content-type: application/json" "http://localhost:8080/api/v1/encode"\n{\n "original_url": "https://www.qovery.com",\n "stat": {\n "clicks_over_time": []\n },\n "short_url": "http://localhost:8080/fbc951"\n}\n\n# generate 4 fake clicks\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n\n# show stat\n$ curl -X GET \'http://localhost:8080/api/v1/url/fbc951/stat\'\n{\n "clicks_over_time": [\n "2020-03-11T21:10:52.354+0000",\n "2020-03-11T21:10:54.093+0000",\n "2020-03-11T21:12:34.987+0000",\n "2020-03-11T21:12:37.223+0000"\n ]\n}\n')),Object(o.b)("h2",{id:"connect-to-a-postgresql-database-with-exposed"},"Connect to a PostgreSQL database with Exposed"),Object(o.b)("p",null,"By storing the data in memory, we lose all the data every time the application restart. Which is problematic for running in production. To make the data persistent we will store it in a PostgreSQL database. We will have to add 1 new dependency - ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/JetBrains/Exposed"}),"Exposed"),". Exposed (with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/brettwooldridge/HikariCP"}),"Hikari Connection Pool"),") is a lightweight SQL library on top of JDBC driver for Kotlin. With exposed it is possible to access databases in two flavours: typesafe SQL wrapping DSL and lightweight Data Access Objects (DAO)."),Object(o.b)("p",null,"Add the dependencies to your build.gradle (or POM.xml)"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'repositories {\n jcenter()\n}\n\ndependencies {\n // Connection Pool and PostgreSQL driver\n implementation("com.zaxxer:HikariCP:3.4.2")\n implementation("org.postgresql:postgresql:42.2.11")\n\n // Exposed\n implementation("org.jetbrains.exposed:exposed-core:0.22.1")\n implementation("org.jetbrains.exposed:exposed-dao:0.22.1")\n implementation("org.jetbrains.exposed:exposed-jdbc:0.22.1")\n implementation("org.jetbrains.exposed:exposed-java-time:0.22.1")\n}\n')),Object(o.b)("p",null,"We need to have 2 distincts tables, one containing all the final URLs with their correspond identifier"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ResponseTable : Table("response") {\n val id = varchar("id", 32)\n val originalURL = varchar("original_url", 2048)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"And a second one with all the clicking points"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ClickOverTimeTable : Table("click_over_time") {\n val id = integer("id").autoIncrement()\n val clickDate = datetime("click_date")\n val response = reference("response_id", onDelete = ReferenceOption.CASCADE, refColumn = ResponseTable.id)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"We need to create the tables as defined above programmatically"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:postgresql://127.0.0.1:5432/exposed"\n username = "exposed"\n password = "exposed"\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n initDatabase()\n // ...\n}\n')),Object(o.b)("p",null,"We have to replace the Hash Table used to store the data by the PostgreSQL database (see the final code ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener/blob/with_postgresql/src/Application.kt"}),"here"),")"),Object(o.b)("h2",{id:"deploy-in-the-cloud-with-qovery"},"Deploy in the Cloud with Qovery"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery")," is going to help us to deploy the final application in the Cloud without the need to configure the CI/CD, network, security, load balancing, database and all the DevOps tasks"),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Qovery is a deployment platform that helps all developers to deploy their applications in the Cloud in just a few seconds")),Object(o.b)(u.a,{name:"tutorial",mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Your code need to be hosted on Github/Gitlab/Bitbucket"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"https://ktor.io/quickstart/quickstart/docker.html"}),"Package your Ktor application to build and run it on Docker")))),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://console.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.png",alt:"Qovery Sign-up page"}))))),Object(o.b)(b.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(b.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(b.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using a headless (without GUI) environment, you can use the following command to sign up and sign in:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with Qovery sign-up page will open. Follow the instructions to sign up and sign in.")))),Object(o.b)("h3",{id:"create-an-application"},"Create an application"),Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(o.b)("p",null,"To follow the guide, ",Object(o.b)("a",{href:"https://github.com/evoxmusic/ktor-url-shortener.git"},"you can fork and use our repository")),Object(o.b)("p",null,"Use the forked repository (and branch ",Object(o.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("p",null,"After the application is created: "),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"})),Object(o.b)("p",null,"This will expose your application and make accessible in the public internet.")))),Object(o.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(o.b)("p",null,"Create and deploy a new database."),Object(o.b)(i.a,{type:"warning",mdxType:"Alert"},"Name the new database **my-pql-db** to follow the guide flawlessly"),Object(o.b)("p",null,"To learn how to do it, you can ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"),"."),Object(o.b)("h3",{id:"connect-to-postgresql"},"Connect to PostgreSQL"),Object(o.b)("p",null,"Qovery add dynamically all required environment variables to connect to the database at the runtime of the container."),Object(o.b)("p",null,"You can list them all in ",Object(o.b)("strong",{parentName:"p"},"Environment Variables")," ",Object(o.b)("strong",{parentName:"p"},"Secrets")," section in your application overview, as described in ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"envs guide"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/db-envs.png",alt:"DB Secrets"})),Object(o.b)("p",null,"To use them:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:${System.getenv("QOVERY_DATABASE_MY_PQL_DB_CONNECTION_URI_WITHOUT_CREDENTIALS")}"\n username = System.getenv("QOVERY_DATABASE_MY_PQL_DB_USERNAME")\n password = System.getenv("QOVERY_DATABASE_MY_PQL_DB_PASSWORD")\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n')),Object(o.b)("h3",{id:"deploy"},"Deploy"),Object(o.b)("p",null,"To deploy your application and database, click ",Object(o.b)("strong",{parentName:"p"},"Action")," and ",Object(o.b)("strong",{parentName:"p"},"Deploy")," button in your environments list view:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",null,"To get public URL to the application, open application details and click on ",Object(o.b)("strong",{parentName:"p"},"Action")," ",Object(o.b)("strong",{parentName:"p"},"Open"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env-1.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/open-app.png",alt:"Kotlin URL Shortener"})),Object(o.b)("h2",{id:"conclusion"},"Conclusion"),Object(o.b)("p",null,"We have seen that creating an URL shortener API with Ktor and Kotlin is extremely simple. Connecting the application to PostgreSQL is very easy with the Exposed library. In just a few lines of code, the service is fully functional and can be deployed in production very quickly with the help of Qovery. In the next part, we will see how to create a web interface connecting to this API to convert our URLs without using the curl command."),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"Part 2"),": bind a web interface to the API - ","[link coming soon]"),Object(o.b)(l.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},464:function(e,t,n){"use strict";n(466);var a=n(0),r=n.n(a),o=n(463),i=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return r.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:i()("feather","icon-"+(o||s))}),t)}},468:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},469:function(e,t,n){"use strict";n(468);var a=n(0),r=n.n(a),o=n(464);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},470:function(e,t,n){"use strict";var a=n(1),r=n(0),o=n.n(r),i=n(39),l=n(474),s=n(20),c=n.n(s);t.a=function(e){var t,n=e.to,s=e.href,b=n||s,u=Object(l.a)(b),p=Object(r.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?o.a.createElement(i.b,Object(a.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var n,a;d&&e&&u&&(n=e,a=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:b})):o.a.createElement("a",Object(a.a)({},e,{href:b}))}},472:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(463),n(471)),i=n.n(o);n(133);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(s),b=Object(a.useState)(null),u=b[0],p=b[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!u&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},473:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=n(470),i=n(463),l=n.n(i);n(134);t.a=function(e){var t=e.children,n=e.className,a=e.badge,i=e.leftIcon,s=e.rightIcon,c=e.size,b=e.target,u=e.to,p=l()("jump-to","jump-to--"+c,n),d=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},i&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+i})),r.a.createElement("div",{className:"jump-to--main"},a?r.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return b?r.a.createElement("a",{href:u,target:b,className:p},d):r.a.createElement(o.a,{to:u,className:p},d)}},474:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},477:function(e,t,n){"use strict";var a=n(1),r=(n(480),n(479),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),i=n(483),l=n(463),s=n.n(l),c=n(471),b=n.n(c),u=n(482),p=37,d=39;function h(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",r,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function m(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return o.a.createElement(i.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,g=e.size,v=(e.style,e.values),j=e.urlKey,O=Object(u.a)(),f=O.tabGroupChoices,y=O.setTabGroupChoices,w=Object(r.useState)(n),N=w[0],k=w[1];if(null!=i){var T=f[i];null!=T&&T!==N&&k(T)}var R=function(e){k(e),null!=i&&y(i,e)},S=[],I=function(e,t,n){switch(n.keyCode){case d:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=b.a.parse(window.location.search);e[j]&&k(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(g||"md")},l&&o.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?o.a.createElement(m,Object(a.a)({changeSelectedValue:R,handleKeydown:I,placeholder:s,selectedValue:N,size:g,tabRefs:S},e)):o.a.createElement(h,Object(a.a)({changeSelectedValue:R,handleKeydown:I,selectedValue:N,tabRefs:S},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},478:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/guides/advanced/adding-multi-region-backup-rds/index.html b/guides/advanced/adding-multi-region-backup-rds/index.html index 729494b1e3..9aac01d06f 100644 --- a/guides/advanced/adding-multi-region-backup-rds/index.html +++ b/guides/advanced/adding-multi-region-backup-rds/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/continuous-integration/index.html b/guides/advanced/continuous-integration/index.html index 4fa5e0eeff..66e6e75fee 100644 --- a/guides/advanced/continuous-integration/index.html +++ b/guides/advanced/continuous-integration/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/costs-control/index.html b/guides/advanced/costs-control/index.html index 7754634d69..299e9da4b1 100644 --- a/guides/advanced/costs-control/index.html +++ b/guides/advanced/costs-control/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/advanced/deploy-api-gateway/index.html b/guides/advanced/deploy-api-gateway/index.html index 1943b6487a..ae6338dc5b 100644 --- a/guides/advanced/deploy-api-gateway/index.html +++ b/guides/advanced/deploy-api-gateway/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/deploy-aws-services/index.html b/guides/advanced/deploy-aws-services/index.html index 4d52933c65..36a9bac9f6 100644 --- a/guides/advanced/deploy-aws-services/index.html +++ b/guides/advanced/deploy-aws-services/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/deploy-daemonset-with-karpenter/index.html b/guides/advanced/deploy-daemonset-with-karpenter/index.html index 30c8f558a3..555cbbde59 100644 --- a/guides/advanced/deploy-daemonset-with-karpenter/index.html +++ b/guides/advanced/deploy-daemonset-with-karpenter/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -49,17 +49,17 @@ - + - + - + - + - + diff --git a/guides/advanced/deploy-external-services/index.html b/guides/advanced/deploy-external-services/index.html index 73aa219e26..be949fe32e 100644 --- a/guides/advanced/deploy-external-services/index.html +++ b/guides/advanced/deploy-external-services/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/deploy-frontend/index.html b/guides/advanced/deploy-frontend/index.html index d5b424ec25..003dfc726a 100644 --- a/guides/advanced/deploy-frontend/index.html +++ b/guides/advanced/deploy-frontend/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -53,17 +53,17 @@ - + - + - + - + - + diff --git a/guides/advanced/helm-chart/index.html b/guides/advanced/helm-chart/index.html index 3563e4aba4..d2f1d64729 100644 --- a/guides/advanced/helm-chart/index.html +++ b/guides/advanced/helm-chart/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/index.html b/guides/advanced/index.html index 630404d3d9..882e3cdb10 100644 --- a/guides/advanced/index.html +++ b/guides/advanced/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -85,17 +85,17 @@ - + - + - + - + - + diff --git a/guides/advanced/microservices/index.html b/guides/advanced/microservices/index.html index 3282b33963..3fc3aff8f5 100644 --- a/guides/advanced/microservices/index.html +++ b/guides/advanced/microservices/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -58,17 +58,17 @@ - + - + - + - + - + diff --git a/guides/advanced/migration/index.html b/guides/advanced/migration/index.html index cb677a5b27..29909dad21 100644 --- a/guides/advanced/migration/index.html +++ b/guides/advanced/migration/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/monitoring/index.html b/guides/advanced/monitoring/index.html index 5c2194db08..157dd81220 100644 --- a/guides/advanced/monitoring/index.html +++ b/guides/advanced/monitoring/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/monorepository/index.html b/guides/advanced/monorepository/index.html index d3502212ae..3674af5c5b 100644 --- a/guides/advanced/monorepository/index.html +++ b/guides/advanced/monorepository/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/advanced/production/index.html b/guides/advanced/production/index.html index c0608b9d05..a99e4d229e 100644 --- a/guides/advanced/production/index.html +++ b/guides/advanced/production/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/seed-database/index.html b/guides/advanced/seed-database/index.html index 418d45493a..fd2dfab1ba 100644 --- a/guides/advanced/seed-database/index.html +++ b/guides/advanced/seed-database/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/advanced/terraform/index.html b/guides/advanced/terraform/index.html index 78013230c0..2f3743b136 100644 --- a/guides/advanced/terraform/index.html +++ b/guides/advanced/terraform/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/upgrading-rds-instance/index.html b/guides/advanced/upgrading-rds-instance/index.html index a85f88c856..e5c3a73445 100644 --- a/guides/advanced/upgrading-rds-instance/index.html +++ b/guides/advanced/upgrading-rds-instance/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -49,17 +49,17 @@ - + - + - + - + - + diff --git a/guides/advanced/use-preview-environments/index.html b/guides/advanced/use-preview-environments/index.html index fbc11df14a..f893aab101 100644 --- a/guides/advanced/use-preview-environments/index.html +++ b/guides/advanced/use-preview-environments/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -52,17 +52,17 @@ - + - + - + - + - + diff --git a/guides/getting-started/create-a-database/index.html b/guides/getting-started/create-a-database/index.html index 5b8b45c2cb..bfa9b61164 100644 --- a/guides/getting-started/create-a-database/index.html +++ b/guides/getting-started/create-a-database/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -55,17 +55,17 @@ - + - + - + - + - + diff --git a/guides/getting-started/debugging/index.html b/guides/getting-started/debugging/index.html index 91eca0bd58..f6b2a4740c 100644 --- a/guides/getting-started/debugging/index.html +++ b/guides/getting-started/debugging/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -52,17 +52,17 @@ - + - + - + - + - + diff --git a/guides/getting-started/deploy-your-first-application/index.html b/guides/getting-started/deploy-your-first-application/index.html index fb60b386a6..98c0823b0c 100644 --- a/guides/getting-started/deploy-your-first-application/index.html +++ b/guides/getting-started/deploy-your-first-application/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/getting-started/index.html b/guides/getting-started/index.html index 76df19e905..eba2fc4083 100644 --- a/guides/getting-started/index.html +++ b/guides/getting-started/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -59,17 +59,17 @@ - + - + - + - + - + diff --git a/guides/getting-started/managing-environment-variables/index.html b/guides/getting-started/managing-environment-variables/index.html index 81347249b6..7705b249d2 100644 --- a/guides/getting-started/managing-environment-variables/index.html +++ b/guides/getting-started/managing-environment-variables/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -60,17 +60,17 @@ - + - + - + - + - + diff --git a/guides/getting-started/setting-custom-domain/index.html b/guides/getting-started/setting-custom-domain/index.html index be2f43aecf..369416afe9 100644 --- a/guides/getting-started/setting-custom-domain/index.html +++ b/guides/getting-started/setting-custom-domain/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -52,17 +52,17 @@ - + - + - + - + - + diff --git a/guides/index.html b/guides/index.html index eed25a9f37..421123f381 100644 --- a/guides/index.html +++ b/guides/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -60,19 +60,19 @@ - + - + - + - + - + @@ -88,7 +88,7 @@ - + @@ -96,7 +96,7 @@ - + @@ -118,7 +118,7 @@ - + @@ -134,17 +134,17 @@ - + - + - + @@ -168,7 +168,7 @@ - + @@ -191,17 +191,17 @@ - + - + - + - + - + @@ -225,19 +225,19 @@ - + - + - + - + - + @@ -253,7 +253,7 @@ - + @@ -261,7 +261,7 @@ - + @@ -283,7 +283,7 @@ - + @@ -299,17 +299,17 @@ - + - + - + @@ -333,7 +333,7 @@ - + diff --git a/guides/installation-guide/guide-amazon-web-services/index.html b/guides/installation-guide/guide-amazon-web-services/index.html index 984768a19d..f59f3966c7 100644 --- a/guides/installation-guide/guide-amazon-web-services/index.html +++ b/guides/installation-guide/guide-amazon-web-services/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/installation-guide/guide-google-cloud-platform/index.html b/guides/installation-guide/guide-google-cloud-platform/index.html index 56c0acf672..5ec0db1f0c 100644 --- a/guides/installation-guide/guide-google-cloud-platform/index.html +++ b/guides/installation-guide/guide-google-cloud-platform/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/installation-guide/guide-kubernetes/index.html b/guides/installation-guide/guide-kubernetes/index.html index 1938b6568e..68e5bcf5f3 100644 --- a/guides/installation-guide/guide-kubernetes/index.html +++ b/guides/installation-guide/guide-kubernetes/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/installation-guide/guide-microsoft-azure/index.html b/guides/installation-guide/guide-microsoft-azure/index.html index da1c7a83ac..c78b3083c9 100644 --- a/guides/installation-guide/guide-microsoft-azure/index.html +++ b/guides/installation-guide/guide-microsoft-azure/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/installation-guide/guide-scaleway/index.html b/guides/installation-guide/guide-scaleway/index.html index 3d3300143d..4fca3634a2 100644 --- a/guides/installation-guide/guide-scaleway/index.html +++ b/guides/installation-guide/guide-scaleway/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/installation-guide/index.html b/guides/installation-guide/index.html index b0fbc1a4d1..7e14355e5e 100644 --- a/guides/installation-guide/index.html +++ b/guides/installation-guide/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -59,17 +59,17 @@ - + - + - + - + - + diff --git a/guides/tags/database-postgresql/index.html b/guides/tags/database-postgresql/index.html index a7b7d90412..b6e97d16e6 100644 --- a/guides/tags/database-postgresql/index.html +++ b/guides/tags/database-postgresql/index.html @@ -26,25 +26,25 @@ - + - + - + - + - + - + - + @@ -57,25 +57,25 @@ - + - + - + - + - + - + - + diff --git a/guides/tags/database-rds/index.html b/guides/tags/database-rds/index.html index 96e0cff422..7dee88b4f1 100644 --- a/guides/tags/database-rds/index.html +++ b/guides/tags/database-rds/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -53,17 +53,17 @@ - + - + - + - + - + diff --git a/guides/tags/domain-operations/index.html b/guides/tags/domain-operations/index.html index c91471014a..3b28f6e8ed 100644 --- a/guides/tags/domain-operations/index.html +++ b/guides/tags/domain-operations/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tags/framework-rails/index.html b/guides/tags/framework-rails/index.html index a72ba62130..ce7723e571 100644 --- a/guides/tags/framework-rails/index.html +++ b/guides/tags/framework-rails/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tags/index.html b/guides/tags/index.html index c8e11eb1ae..39878d6dd4 100644 --- a/guides/tags/index.html +++ b/guides/tags/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -49,17 +49,17 @@ - + - + - + - + - + diff --git a/guides/tags/installation-guide-aws/index.html b/guides/tags/installation-guide-aws/index.html index bc44da9840..ad256e74cf 100644 --- a/guides/tags/installation-guide-aws/index.html +++ b/guides/tags/installation-guide-aws/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -56,9 +56,9 @@ - + - + @@ -77,17 +77,17 @@ - + - + - + - + - + @@ -107,9 +107,9 @@ - + - + diff --git a/guides/tags/installation-guide-azure/index.html b/guides/tags/installation-guide-azure/index.html index 45c094f90a..7a361c326b 100644 --- a/guides/tags/installation-guide-azure/index.html +++ b/guides/tags/installation-guide-azure/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tags/installation-guide-gcp/index.html b/guides/tags/installation-guide-gcp/index.html index a29e4eca07..03359a9d84 100644 --- a/guides/tags/installation-guide-gcp/index.html +++ b/guides/tags/installation-guide-gcp/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tags/installation-guide-kubernetes/index.html b/guides/tags/installation-guide-kubernetes/index.html index b403d3d57b..424c9cd9e1 100644 --- a/guides/tags/installation-guide-kubernetes/index.html +++ b/guides/tags/installation-guide-kubernetes/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tags/installation-guide-scaleway/index.html b/guides/tags/installation-guide-scaleway/index.html index d3a29c841f..6bafb170f6 100644 --- a/guides/tags/installation-guide-scaleway/index.html +++ b/guides/tags/installation-guide-scaleway/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tags/language-javascript/index.html b/guides/tags/language-javascript/index.html index d0694eb1ff..7392abfa03 100644 --- a/guides/tags/language-javascript/index.html +++ b/guides/tags/language-javascript/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -53,17 +53,17 @@ - + - + - + - + - + diff --git a/guides/tags/language-kotlin/index.html b/guides/tags/language-kotlin/index.html index 650bb19667..30478f0e27 100644 --- a/guides/tags/language-kotlin/index.html +++ b/guides/tags/language-kotlin/index.html @@ -26,21 +26,21 @@ - + - + - + - + - + - + - + @@ -53,21 +53,21 @@ - + - + - + - + - + - + - + diff --git a/guides/tags/language-ruby/index.html b/guides/tags/language-ruby/index.html index c89ae67e28..28839fa020 100644 --- a/guides/tags/language-ruby/index.html +++ b/guides/tags/language-ruby/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tags/language-rust/index.html b/guides/tags/language-rust/index.html index 57411d80ae..3836f557a3 100644 --- a/guides/tags/language-rust/index.html +++ b/guides/tags/language-rust/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + - + - + diff --git a/guides/tags/technology-docker/index.html b/guides/tags/technology-docker/index.html index fb7b9a96a3..e35174d3c4 100644 --- a/guides/tags/technology-docker/index.html +++ b/guides/tags/technology-docker/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tags/technology-github/index.html b/guides/tags/technology-github/index.html index ea70725dd4..b08277e7e0 100644 --- a/guides/tags/technology-github/index.html +++ b/guides/tags/technology-github/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tags/technology-helm/index.html b/guides/tags/technology-helm/index.html index 37506b7725..f1072b8217 100644 --- a/guides/tags/technology-helm/index.html +++ b/guides/tags/technology-helm/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tags/technology-qovery/index.html b/guides/tags/technology-qovery/index.html index bcc8f38f3e..1b77924366 100644 --- a/guides/tags/technology-qovery/index.html +++ b/guides/tags/technology-qovery/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -48,17 +48,17 @@ - + - + - + - + @@ -70,11 +70,11 @@ - + - + @@ -94,11 +94,11 @@ - + - + @@ -135,17 +135,17 @@ - + - + - + - + - + @@ -157,17 +157,17 @@ - + - + - + - + @@ -179,11 +179,11 @@ - + - + @@ -203,11 +203,11 @@ - + - + diff --git a/guides/tags/technology-terraform/index.html b/guides/tags/technology-terraform/index.html index b6eabe4ca8..11222414eb 100644 --- a/guides/tags/technology-terraform/index.html +++ b/guides/tags/technology-terraform/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tags/type-guide/index.html b/guides/tags/type-guide/index.html index df4fe3a9c4..1f0fd32459 100644 --- a/guides/tags/type-guide/index.html +++ b/guides/tags/type-guide/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -103,17 +103,17 @@ - + - + - + - + - + diff --git a/guides/tags/type-tutorial/index.html b/guides/tags/type-tutorial/index.html index cee5991df8..7a24d7a5b0 100644 --- a/guides/tags/type-tutorial/index.html +++ b/guides/tags/type-tutorial/index.html @@ -26,29 +26,29 @@ - + - + - + - + - + - + - + - + - + - + @@ -56,13 +56,13 @@ - + - + @@ -82,7 +82,7 @@ - + @@ -98,15 +98,15 @@ - + - + - + @@ -114,7 +114,7 @@ - + @@ -137,29 +137,29 @@ - + - + - + - + - + - + - + - + - + - + @@ -167,13 +167,13 @@ - + - + @@ -193,7 +193,7 @@ - + @@ -209,15 +209,15 @@ - + - + - + @@ -225,7 +225,7 @@ - + diff --git a/guides/tutorial/aws-sqs-lambda-with-qovery/index.html b/guides/tutorial/aws-sqs-lambda-with-qovery/index.html index 8941921287..75e24b0ef5 100644 --- a/guides/tutorial/aws-sqs-lambda-with-qovery/index.html +++ b/guides/tutorial/aws-sqs-lambda-with-qovery/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/aws-vpc-peering-with-qovery/index.html b/guides/tutorial/aws-vpc-peering-with-qovery/index.html index 6dccb0e2e9..9922e41d08 100644 --- a/guides/tutorial/aws-vpc-peering-with-qovery/index.html +++ b/guides/tutorial/aws-vpc-peering-with-qovery/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -56,17 +56,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws/index.html b/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws/index.html index 212b31ba39..6394a1c555 100644 --- a/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws/index.html +++ b/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -59,17 +59,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/build-e2e-testing-ephemeral-environments/index.html b/guides/tutorial/build-e2e-testing-ephemeral-environments/index.html index 679c708e9b..5e8a5ce998 100644 --- a/guides/tutorial/build-e2e-testing-ephemeral-environments/index.html +++ b/guides/tutorial/build-e2e-testing-ephemeral-environments/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -81,19 +81,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/cloudwatch-integration/index.html b/guides/tutorial/cloudwatch-integration/index.html index f1e07359b3..8be91463ea 100644 --- a/guides/tutorial/cloudwatch-integration/index.html +++ b/guides/tutorial/cloudwatch-integration/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -55,17 +55,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1/index.html b/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1/index.html index 74ebeb39f7..00372309e3 100644 --- a/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1/index.html +++ b/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -69,19 +69,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/create-a-playground-environment-on-aws/index.html b/guides/tutorial/create-a-playground-environment-on-aws/index.html index 4ac3d9b135..1e799bcb87 100644 --- a/guides/tutorial/create-a-playground-environment-on-aws/index.html +++ b/guides/tutorial/create-a-playground-environment-on-aws/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -50,19 +50,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws/index.html b/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws/index.html index 5b85755dea..afb47589bb 100644 --- a/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws/index.html +++ b/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -50,19 +50,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/customizing-preview-url-with-qovery-cli/index.html b/guides/tutorial/customizing-preview-url-with-qovery-cli/index.html index 1161816922..5aff62ca15 100644 --- a/guides/tutorial/customizing-preview-url-with-qovery-cli/index.html +++ b/guides/tutorial/customizing-preview-url-with-qovery-cli/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/data-seeding-in-postgres/index.html b/guides/tutorial/data-seeding-in-postgres/index.html index 3eda892737..0c3b741ae9 100644 --- a/guides/tutorial/data-seeding-in-postgres/index.html +++ b/guides/tutorial/data-seeding-in-postgres/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -64,17 +64,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/deploy-jupyterhub-qovery/index.html b/guides/tutorial/deploy-jupyterhub-qovery/index.html index 1f8ef7b315..cc99fc0cb4 100644 --- a/guides/tutorial/deploy-jupyterhub-qovery/index.html +++ b/guides/tutorial/deploy-jupyterhub-qovery/index.html @@ -26,42 +26,42 @@ - + - + - + - + - + - +
-

Deploy JupyterHub using Helm

How to deploy JupyterHub on Qovery using the official Helm chart.

JupyterHub is an easy way to interact with a computing environment through a webpage. It provides a standardized way to serve Jupyter Notebooks for multiple users. Pairing it with Kubernetes and Qovery makes it easier to manage and scale.

Installation

The easiest way to deploy JupyterHub is using the official Helm Chart. It will create all the resources you need to run JupyterHub.

For more information, the official documentation is available here.

  1. Add the JupyterHub helm repository

    Add the JupyterHub helm repository in your Qovery settings by following this documentation

    • Repository name: JupyterHub
    • Kind: HTTPS
    • Repository URL: https://hub.jupyter.org/helm-chart/
  2. Create the JupyterHub service within Qovery

    Create the JupyterHub service in the Qovery environment of your choice (preferably within a dedicated JupyterHub project) by following this documentation and these values:

    • General:
      • Application name: JupyterHub
      • Source:
        • Helm source: Helm repository
        • Repository: JupyterHub (the name given during the JupyterHub helm repository added in the previous step)
        • Chart name: jupyterhub
        • Version: 3.3.7 (this is the version we used for this setup, update it based on the chosen version)
        • Allow cluster-wide resources ✔️
    • Values
      • Values override as file:
      • File source: Raw YAML
      • Raw YAML:
    fullnameOverride: "jupyterhub"
    proxy:
    service:
    type: ClusterIP

    There are many other values you can set to modify the JupyterHub behavior. For advanced usage, check: JupyterHub Customization

    Now get to the last step and Create the service on Qovery.

  3. Add Network configuration

    In the previous step, we created the JupyterHub service. In this step, we will update its configuration to make it available on the public network (through Qovery Nginx Ingress).

    • Open the JupyterHub service details
    • Enter the Settings section
    • Click on Networking
    • Add a new Port with:
      • Service name: jupyterhub-proxy-public
      • Service port: 80
      • Select protocol: HTTP
      • External port: 443
      • Port name: jupyterhub-proxy-public-p80

    If you need more information on how to manage your ports, have a look at this

  4. Deploy your chart

    Open the Play button and trigger the deployment of your chart.

    JupyterHub - Deploy

  5. Access JupyterHub

    You can click the Link button to access JupyterHub on your cluster.

    JupyterHub - Link

    Now you can login to the webUI and start playing with Jupyter Notebooks.

Conclusion

JupyterHub is running on your Qovery cluster. This is a simple installation and you should try to customize it according to your needs. You can also check theAdminstrator Guideto better understand how it works.

+

Deploy JupyterHub using Helm

How to deploy JupyterHub on Qovery using the official Helm chart.

JupyterHub is an easy way to interact with a computing environment through a webpage. It provides a standardized way to serve Jupyter Notebooks for multiple users. Pairing it with Kubernetes and Qovery makes it easier to manage and scale.

Installation

The easiest way to deploy JupyterHub is using the official Helm Chart. It will create all the resources you need to run JupyterHub.

For more information, the official documentation is available here.

  1. Add the JupyterHub helm repository

    Add the JupyterHub helm repository in your Qovery settings by following this documentation

    • Repository name: JupyterHub
    • Kind: HTTPS
    • Repository URL: https://hub.jupyter.org/helm-chart/
  2. Create the JupyterHub service within Qovery

    Create the JupyterHub service in the Qovery environment of your choice (preferably within a dedicated JupyterHub project) by following this documentation and these values:

    • General:
      • Application name: JupyterHub
      • Source:
        • Helm source: Helm repository
        • Repository: JupyterHub (the name given during the JupyterHub helm repository added in the previous step)
        • Chart name: jupyterhub
        • Version: 3.3.7 (this is the version we used for this setup, update it based on the chosen version)
        • Allow cluster-wide resources ✔️
    • Values
      • Values override as file:
      • File source: Raw YAML
      • Raw YAML:
    fullnameOverride: "jupyterhub"
    proxy:
    service:
    type: ClusterIP

    There are many other values you can set to modify the JupyterHub behavior. For advanced usage, check: JupyterHub Customization

    Now get to the last step and Create the service on Qovery.

  3. Add Network configuration

    In the previous step, we created the JupyterHub service. In this step, we will update its configuration to make it available on the public network (through Qovery Nginx Ingress).

    • Open the JupyterHub service details
    • Enter the Settings section
    • Click on Networking
    • Add a new Port with:
      • Service name: jupyterhub-proxy-public
      • Service port: 80
      • Select protocol: HTTP
      • External port: 443
      • Port name: jupyterhub-proxy-public-p80

    If you need more information on how to manage your ports, have a look at this

  4. Deploy your chart

    Open the Play button and trigger the deployment of your chart.

    JupyterHub - Deploy

  5. Access JupyterHub

    You can click the Link button to access JupyterHub on your cluster.

    JupyterHub - Link

    Now you can login to the webUI and start playing with Jupyter Notebooks.

Conclusion

JupyterHub is running on your Qovery cluster. This is a simple installation and you should try to customize it according to your needs. You can also check theAdminstrator Guideto better understand how it works.

- + - + - + - + - + - + diff --git a/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq/index.html b/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq/index.html index d9f6d94e6e..570e1e5fcc 100644 --- a/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq/index.html +++ b/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -104,17 +104,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/deploy-temporal-on-kubernetes/index.html b/guides/tutorial/deploy-temporal-on-kubernetes/index.html index 07d1d7dcb8..797506bf33 100644 --- a/guides/tutorial/deploy-temporal-on-kubernetes/index.html +++ b/guides/tutorial/deploy-temporal-on-kubernetes/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -55,17 +55,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/generate-qovery-api-client/index.html b/guides/tutorial/generate-qovery-api-client/index.html index df2002ec5c..7f66269f32 100644 --- a/guides/tutorial/generate-qovery-api-client/index.html +++ b/guides/tutorial/generate-qovery-api-client/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -55,17 +55,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners/index.html b/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners/index.html index 03188e82c3..4b25485d50 100644 --- a/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners/index.html +++ b/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -50,19 +50,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/github-organization-repository-access/index.html b/guides/tutorial/github-organization-repository-access/index.html index 70ed18807e..8b0dd394f8 100644 --- a/guides/tutorial/github-organization-repository-access/index.html +++ b/guides/tutorial/github-organization-repository-access/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/gitops-with-qovery/index.html b/guides/tutorial/gitops-with-qovery/index.html index 082d1c1613..f606172c2a 100644 --- a/guides/tutorial/gitops-with-qovery/index.html +++ b/guides/tutorial/gitops-with-qovery/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -94,17 +94,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/grafana-install/index.html b/guides/tutorial/grafana-install/index.html index 44c4e6edfe..5eb6f7fa93 100644 --- a/guides/tutorial/grafana-install/index.html +++ b/guides/tutorial/grafana-install/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster/index.html b/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster/index.html index f34389e2af..f1f950fada 100644 --- a/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster/index.html +++ b/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -55,17 +55,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1/index.html b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1/index.html index bdc725a57c..ce325b0781 100644 --- a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1/index.html +++ b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2/index.html b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2/index.html index 4b2c520ef3..0ace983b42 100644 --- a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2/index.html +++ b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -53,17 +53,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3/index.html b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3/index.html index 1b7b1eea91..96e8515b1d 100644 --- a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3/index.html +++ b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -67,17 +67,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws/index.html b/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws/index.html index 636500d423..2bd82338ec 100644 --- a/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws/index.html +++ b/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -53,17 +53,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl/index.html b/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl/index.html index 4cdb8bd070..727d598417 100644 --- a/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl/index.html +++ b/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -56,17 +56,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-create-an-rds-instance-through-aws-console/index.html b/guides/tutorial/how-to-create-an-rds-instance-through-aws-console/index.html index 420e0bb559..15ffa1d6fb 100644 --- a/guides/tutorial/how-to-create-an-rds-instance-through-aws-console/index.html +++ b/guides/tutorial/how-to-create-an-rds-instance-through-aws-console/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -52,17 +52,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease/index.html b/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease/index.html index d79f96e9fd..4c6106c3ca 100644 --- a/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease/index.html +++ b/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -75,19 +75,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/index.html b/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/index.html index 7860713e40..a7b55c6caf 100644 --- a/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/index.html +++ b/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-integrate-qovery-with-github-actions/index.html b/guides/tutorial/how-to-integrate-qovery-with-github-actions/index.html index 9fbaf61858..7f4c41598c 100644 --- a/guides/tutorial/how-to-integrate-qovery-with-github-actions/index.html +++ b/guides/tutorial/how-to-integrate-qovery-with-github-actions/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -56,17 +56,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-run-commands-at-application-startup/index.html b/guides/tutorial/how-to-run-commands-at-application-startup/index.html index 836dc2b81e..250da39998 100644 --- a/guides/tutorial/how-to-run-commands-at-application-startup/index.html +++ b/guides/tutorial/how-to-run-commands-at-application-startup/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -59,17 +59,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery/index.html b/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery/index.html index cd8d2cf15d..6417b028a4 100644 --- a/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery/index.html +++ b/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -52,17 +52,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources/index.html b/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources/index.html index 5336414a45..8eb5b57542 100644 --- a/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources/index.html +++ b/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-write-a-dockerfile/index.html b/guides/tutorial/how-to-write-a-dockerfile/index.html index 8816a8c496..dea3e4ff69 100644 --- a/guides/tutorial/how-to-write-a-dockerfile/index.html +++ b/guides/tutorial/how-to-write-a-dockerfile/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -49,17 +49,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/index.html b/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/index.html index 0b803d9ac0..b2bc8a7653 100644 --- a/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/index.html +++ b/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -54,19 +54,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/index.html b/guides/tutorial/index.html index 6d2f58065c..af7a7d35c0 100644 --- a/guides/tutorial/index.html +++ b/guides/tutorial/index.html @@ -26,41 +26,41 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -80,7 +80,7 @@ - + @@ -96,15 +96,15 @@ - + - + - + @@ -112,7 +112,7 @@ - + @@ -135,41 +135,41 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -189,7 +189,7 @@ - + @@ -205,15 +205,15 @@ - + - + - + @@ -221,7 +221,7 @@ - + diff --git a/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/index.html b/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/index.html index 2ae1052863..c0100db056 100644 --- a/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/index.html +++ b/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/index.html @@ -26,43 +26,43 @@ - + - + - + - + - + - +
-

Kubernetes observability and monitoring with Datadog

How to integrate Datadog with Kubernetes on Qovery.

While Qovery will soon provide basic metrics on apps resources usage, you might need a more advanced view on what happens on your infrastructure. There are many solutions on the market, one of them being Datadog. -Datadog is one of the leading platforms for monitoring and observability, and it's pretty easy to integrate it with Qovery.

Installation

In this tutorial, we will install the Datadog agent on a Qovery cluster to gather metrics about infrastructure and applications.

  1. Add the Datadog helm repository

    Add the Datadog helm repository in your Qovery settings by following this documentation

    • Repository name: Datadog
    • Kind: HTTPS
    • Repository URL: https://helm.datadoghq.com
  2. Create the datadog service within Qovery

    Create the Datadog helm service in the Qovery environment of your choice (preferrably within a dedicated Tooling project) by following this documentation and these values:

    • General:
      • Application name: Datadog
      • Source:
        • Helm source: Helm repository
        • Repository: Datadog (the name given during the datadog helm repository added in the previous step)
        • Chart name: datadog
        • Version: 3.49.5 (this is the version we used for this setup, update it based on the chosen version)
        • Allow cluster-wide resources ✔️
    • Values
      • Values override as file:
      • File source: Raw YAML
      • Raw YAML:
    # The following YAML contains the minimum configuration required to deploy the Datadog Agent
    # on your cluster. Update it accordingly to your needs
    datadog:
    # here we use a Qovery secret to retrieve the Datadog API Key (See next step)
    apiKey: qovery.env.DD_API_KEY
    # Update the site depending on where you want to store your data in Datadog
    site: datadoghq.eu
    # Update the cluster name with the name of your choice
    clusterName: qoverycluster

    There are many other values you can set and modify the Datadog agent behaviour. For advanced usage, check: https://github.com/Datadog/helm-charts/blob/main/charts/datadog/values.yaml

    Now get to the last step and just Create the service on Qovery.

  3. Store the Datadog API Key as secret

    In the previous step we have assigned the macro qovery.env.DD_API_KEY to the API Key value. In this step we will create this secret within the Qovery console.

    • Open the service overview of the created Datadog service
    • Enter the Variables section
    • Add a new Variable with:
      • Variable = DD_API_KEY
      • Value = <your_API_KEY>
      • Scope = Service (so that it is accessible only to this service)
      • Secret variable ✔️

    Datadog - API Key

    If you need more information on how to manage your environment variables, have a look at this documentation

  4. Deploy your chart

    Open the Play button and trigger the deployment of your chart (see point 1 in the picture below).

    Datadog - Deploy

    You can follow the deployment and access the deployment logs by pressing the Log button (see point 2 in the picutre above).

    Once the deployment is completed, you should see the Datadog agent pods and their status directly within the Qovery console.

    Datadog - Pods

    You can also look at the Pod logs by pressing the Log button.

  5. Verify the setup on Datadog

    Access again your Datadog interface and access the Infrastructure > Containers > Kubernetes sections. You should now see the data coming from your Qovery cluster

    Datadog - Console

Conclusion

You now have Datadog agent running on your Qovery cluster. You can check their Getting Started guide to familiarize yourself with the product: https://docs.datadoghq.com/fr/getting_started.

+

Kubernetes observability and monitoring with Datadog

How to integrate Datadog with Kubernetes on Qovery.

While Qovery will soon provide basic metrics on apps resources usage, you might need a more advanced view on what happens on your infrastructure. There are many solutions on the market, one of them being Datadog. +Datadog is one of the leading platforms for monitoring and observability, and it is pretty easy to integrate it with Qovery.

Installation

In this tutorial, we will install the Datadog agent on a Qovery cluster to gather metrics about infrastructure and applications.

  1. Add the Datadog helm repository

    Add the Datadog helm repository in your Qovery settings by following this documentation

    • Repository name: Datadog
    • Kind: HTTPS
    • Repository URL: https://helm.datadoghq.com
  2. Create the datadog service within Qovery

    Create the Datadog helm service in the Qovery environment of your choice (preferrably within a dedicated Tooling project) by following this documentation and these values:

    • General:
      • Application name: Datadog
      • Source:
        • Helm source: Helm repository
        • Repository: Datadog (the name given during the datadog helm repository added in the previous step)
        • Chart name: datadog
        • Version: 3.49.5 (this is the version we used for this setup, update it based on the chosen version)
        • Allow cluster-wide resources ✔️
    • Values
      • Values override as file:
      • File source: Raw YAML
      • Raw YAML:
    # The following YAML contains the minimum configuration required to deploy the Datadog Agent
    # on your cluster. Update it accordingly to your needs
    datadog:
    # here we use a Qovery secret to retrieve the Datadog API Key (See next step)
    apiKey: qovery.env.DD_API_KEY
    # Update the site depending on where you want to store your data in Datadog
    site: datadoghq.eu
    # Update the cluster name with the name of your choice
    clusterName: qoverycluster

    There are many other values you can set and modify the Datadog agent behaviour. For advanced usage, check: https://github.com/Datadog/helm-charts/blob/main/charts/datadog/values.yaml

    Now get to the last step and just Create the service on Qovery.

  3. Store the Datadog API Key as secret

    In the previous step we have assigned the macro qovery.env.DD_API_KEY to the API Key value. In this step we will create this secret within the Qovery console.

    • Open the service overview of the created Datadog service
    • Enter the Variables section
    • Add a new Variable with:
      • Variable = DD_API_KEY
      • Value = <your_API_KEY>
      • Scope = Service (so that it is accessible only to this service)
      • Secret variable ✔️

    Datadog - API Key

    If you need more information on how to manage your environment variables, have a look at this documentation

  4. Deploy your chart

    Open the Play button and trigger the deployment of your chart (see point 1 in the picture below).

    Datadog - Deploy

    You can follow the deployment and access the deployment logs by pressing the Log button (see point 2 in the picutre above).

    Once the deployment is completed, you should see the Datadog agent pods and their status directly within the Qovery console.

    Datadog - Pods

    You can also look at the Pod logs by pressing the Log button.

  5. Verify the setup on Datadog

    Access again your Datadog interface and access the Infrastructure > Containers > Kubernetes sections. You should now see the data coming from your Qovery cluster

    Datadog - Console

Conclusion

You now have Datadog agent running on your Qovery cluster. You can check their Getting Started guide to familiarize yourself with the product: https://docs.datadoghq.com/fr/getting_started.

- + - + - + - + - + - + diff --git a/guides/tutorial/managing-env-variables-in-create-react-app/index.html b/guides/tutorial/managing-env-variables-in-create-react-app/index.html index 99978e7ba1..69c0217d2b 100644 --- a/guides/tutorial/managing-env-variables-in-create-react-app/index.html +++ b/guides/tutorial/managing-env-variables-in-create-react-app/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -59,17 +59,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/migrate-your-application-from-heroku-to-aws/index.html b/guides/tutorial/migrate-your-application-from-heroku-to-aws/index.html index e45240c243..a192b24f41 100644 --- a/guides/tutorial/migrate-your-application-from-heroku-to-aws/index.html +++ b/guides/tutorial/migrate-your-application-from-heroku-to-aws/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -60,19 +60,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/monitor-and-reduce-kubernetes-spend-with-kubecost/index.html b/guides/tutorial/monitor-and-reduce-kubernetes-spend-with-kubecost/index.html index 153e5868e0..633a199967 100644 --- a/guides/tutorial/monitor-and-reduce-kubernetes-spend-with-kubecost/index.html +++ b/guides/tutorial/monitor-and-reduce-kubernetes-spend-with-kubecost/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -49,17 +49,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery/index.html b/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery/index.html index ae631ebff2..5a03c9f199 100644 --- a/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery/index.html +++ b/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/url-shortener-api-with-kotlin/index.html b/guides/tutorial/url-shortener-api-with-kotlin/index.html index 31a2c091fc..1fa6290c60 100644 --- a/guides/tutorial/url-shortener-api-with-kotlin/index.html +++ b/guides/tutorial/url-shortener-api-with-kotlin/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -82,19 +82,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services/index.html b/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services/index.html index 4ec767aa2a..129b80ec5f 100644 --- a/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services/index.html +++ b/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -55,17 +55,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/use-aws-iam-roles-with-qovery/index.html b/guides/tutorial/use-aws-iam-roles-with-qovery/index.html index a248254063..d24fd51514 100644 --- a/guides/tutorial/use-aws-iam-roles-with-qovery/index.html +++ b/guides/tutorial/use-aws-iam-roles-with-qovery/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/working-with-git-submodules/index.html b/guides/tutorial/working-with-git-submodules/index.html index f5f6ce9406..83095ab34d 100644 --- a/guides/tutorial/working-with-git-submodules/index.html +++ b/guides/tutorial/working-with-git-submodules/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -53,17 +53,17 @@ - + - + - + - + - + diff --git a/index.html b/index.html index 5fba71c911..4b3f4b15a9 100644 --- a/index.html +++ b/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -47,17 +47,17 @@ - + - + - + - + - + diff --git a/mailing_list/index.html b/mailing_list/index.html index 064127d644..3a5a3f5820 100644 --- a/mailing_list/index.html +++ b/mailing_list/index.html @@ -22,9 +22,9 @@ - + - + @@ -37,9 +37,9 @@ - + - + diff --git a/main.775fd06f.js b/main.72f4c72c.js similarity index 81% rename from main.775fd06f.js rename to main.72f4c72c.js index b4a10306d4..acd55a41d9 100644 --- a/main.775fd06f.js +++ b/main.72f4c72c.js @@ -1,2 +1,2 @@ -/*! For license information please see main.775fd06f.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[307],[function(e,t,n){"use strict";e.exports=n(98)},function(e,t,n){"use strict";function o(){return(o=Object.assign||function(e){for(var t=1;t=0;p--){var f=a[p];"."===f?i(a,p):".."===f?(i(a,p),d++):d&&(i(a,p),d--)}if(!u)for(;d--;d)a.unshift("..");!u||""===a[0]||a[0]&&r(a[0])||a.unshift("");var g=a.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};function s(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}var l=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,o){return e(t,n[o])}));if("object"==typeof t||"object"==typeof n){var o=s(t),r=s(n);return o!==t||r!==n?e(o,r):Object.keys(Object.assign({},t,n)).every((function(o){return e(t[o],n[o])}))}return!1},u=n(4);function c(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function p(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function f(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function g(e){var t=e.pathname,n=e.search,o=e.hash,r=t||"/";return n&&"?"!==n&&(r+="?"===n.charAt(0)?n:"?"+n),o&&"#"!==o&&(r+="#"===o.charAt(0)?o:"#"+o),r}function m(e,t,n,r){var i;"string"==typeof e?(i=function(e){var t=e||"/",n="",o="",r=t.indexOf("#");-1!==r&&(o=t.substr(r),t=t.substr(0,r));var i=t.indexOf("?");return-1!==i&&(n=t.substr(i),t=t.substr(0,i)),{pathname:t,search:"?"===n?"":n,hash:"#"===o?"":o}}(e)).state=t:(void 0===(i=Object(o.a)({},e)).pathname&&(i.pathname=""),i.search?"?"!==i.search.charAt(0)&&(i.search="?"+i.search):i.search="",i.hash?"#"!==i.hash.charAt(0)&&(i.hash="#"+i.hash):i.hash="",void 0!==t&&void 0===i.state&&(i.state=t));try{i.pathname=decodeURI(i.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+i.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(i.key=n),r?i.pathname?"/"!==i.pathname.charAt(0)&&(i.pathname=a(i.pathname,r.pathname)):i.pathname=r.pathname:i.pathname||(i.pathname="/"),i}function h(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&l(e.state,t.state)}function b(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,o,r){if(null!=e){var i="function"==typeof e?e(t,n):e;"string"==typeof i?"function"==typeof o?o(i,r):r(!0):r(!1!==i)}else r(!0)},appendListener:function(e){var n=!0;function o(){n&&e.apply(void 0,arguments)}return t.push(o),function(){n=!1,t=t.filter((function(e){return e!==o}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),o=0;ot?n.splice(t,n.length-t,o):n.push(o),d({action:"PUSH",location:o,index:t,entries:n})}}))},replace:function(e,t){var o=m(e,t,p(),w.location);c.confirmTransitionTo(o,"REPLACE",n,(function(e){e&&(w.entries[w.index]=o,d({action:"REPLACE",location:o}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t=0||(r[n]=e[n]);return r}n.d(t,"a",(function(){return o}))},function(e,t,n){e.exports=!n(14)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(e,t,n){var o=n(28),r=n(57);e.exports=n(10)?function(e,t,n){return o.f(e,t,r(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var o=n(5),r=n(17),i=n(11),a=n(16),s=n(30),l=function(e,t,n){var u,c,d,p,f=e&l.F,g=e&l.G,m=e&l.S,h=e&l.P,b=e&l.B,v=g?o:m?o[t]||(o[t]={}):(o[t]||{}).prototype,y=g?r:r[t]||(r[t]={}),w=y.prototype||(y.prototype={});for(u in g&&(n=t),n)d=((c=!f&&v&&void 0!==v[u])?v:n)[u],p=b&&c?s(d,o):h&&"function"==typeof d?s(Function.call,d):d,v&&a(v,u,d,e&l.U),y[u]!=d&&i(y,u,p),h&&w[u]!=d&&(w[u]=d)};o.core=r,l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,e.exports=l},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t){e.exports=function(e){try{return!!e()}catch(t){return!0}}},function(e,t,n){e.exports=n(110)()},function(e,t,n){var o=n(5),r=n(11),i=n(31),a=n(40)("src"),s=n(104),l=(""+s).split("toString");n(17).inspectSource=function(e){return s.call(e)},(e.exports=function(e,t,n,s){var u="function"==typeof n;u&&(i(n,"name")||r(n,"name",t)),e[t]!==n&&(u&&(i(n,a)||r(n,a,e[t]?""+e[t]:l.join(String(t)))),e===o?e[t]=n:s?e[t]?e[t]=n:r(e,t,n):(delete e[t],r(e,t,n)))})(Function.prototype,"toString",(function(){return"function"==typeof this&&this[a]||s.call(this)}))},function(e,t){var n=e.exports={version:"2.6.11"};"number"==typeof __e&&(__e=n)},function(e,t,n){"use strict";t.a={plugins:["plugin-image-zoom","posthog-docusaurus",["@docusaurus/plugin-content-docs",{sidebarPath:"/home/runner/work/documentation/documentation/website/sidebars.js"}],["@docusaurus/plugin-content-blog",{feedOptions:{type:"all",copyright:"Copyright \xa9 2024 Qovery, Inc.",baseUrl:""}}],"/home/runner/work/documentation/documentation/website/plugins/guides",["@docusaurus/plugin-content-pages",{}],["/home/runner/work/documentation/documentation/website/plugins/sitemap",{}]],themes:[["@docusaurus/theme-classic",{customCss:"/home/runner/work/documentation/documentation/website/src/css/custom.css"}],"@docusaurus/theme-search-algolia"],customFields:{metadata:{databases:[{dark_logo_path:"/img/logos/docker.svg",logo_path:"/img/logos/docker.svg",name:"mysql"},{dark_logo_path:"/img/logos/docker.svg",logo_path:"/img/logos/docker.svg",name:"postgresql"},{dark_logo_path:"/img/logos/docker.svg",logo_path:"/img/logos/docker.svg",name:"mongodb"},{dark_logo_path:"/img/logos/aws_white.svg",logo_path:"/img/logos/aws.svg",name:"rds"}],event_types:[],frameworks:[{dark_logo_path:"/img/logos/hasura_white.svg",logo_path:"/img/logos/hasura.svg",name:"hasura"},{dark_logo_path:"/img/logos/laravel.svg",logo_path:"/img/logos/laravel.svg",name:"laravel"},{dark_logo_path:"/img/logos/springboot.svg",logo_path:"/img/logos/springboot.svg",name:"springboot"},{dark_logo_path:"/img/logos/nodejs.svg",logo_path:"/img/logos/nodejs.svg",name:"nodejs"},{dark_logo_path:"/img/logos/flask_white.svg",logo_path:"/img/logos/flask.svg",name:"flask"},{dark_logo_path:"/img/logos/jhipster.svg",logo_path:"/img/logos/jhipster.svg",name:"jhipster"},{dark_logo_path:"/img/logos/gin.svg",logo_path:"/img/logos/gin.svg",name:"gin"},{dark_logo_path:"/img/logos/rails.svg",logo_path:"/img/logos/rails.svg",name:"rails"},{dark_logo_path:"/img/logos/django.svg",logo_path:"/img/logos/django.svg",name:"django"},{dark_logo_path:"/img/logos/deno.svg",logo_path:"/img/logos/deno.svg",name:"deno"},{dark_logo_path:"/img/logos/strapi.svg",logo_path:"/img/logos/strapi.svg",name:"strapi"},{dark_logo_path:"/img/logos/nuxtjs.svg",logo_path:"/img/logos/nuxtjs.svg",name:"nuxtjs"},{dark_logo_path:"/img/logos/sinatra.svg",logo_path:"/img/logos/sinatra.svg",name:"sinatra"},{dark_logo_path:"/img/logos/meilisearch.svg",logo_path:"/img/logos/meilisearch.svg",name:"meilisearch"}],guides:{"getting-started":{children:{},description:"Take Qovery from zero to production in less than 10 minutes.",guides:[{author_github:"https://github.com/evoxmusic",description:null,id:"/getting-started/create-a-database",last_modified_on:null,path:"website/guides/getting-started/create-a-database.md",series_position:null,title:"Create a database"},{author_github:"https://github.com/evoxmusic",description:null,id:"/getting-started/setting-custom-domain",last_modified_on:null,path:"website/guides/getting-started/setting-custom-domain.md",series_position:null,title:"Custom domain"},{author_github:"https://github.com/evoxmusic",description:null,id:"/getting-started/debugging",last_modified_on:null,path:"website/guides/getting-started/debugging.md",series_position:null,title:"Debugging"},{author_github:"https://github.com/evoxmusic",description:null,id:"/getting-started/managing-environment-variables",last_modified_on:null,path:"website/guides/getting-started/managing-environment-variables.md",series_position:null,title:"Environment variables"},{author_github:"https://github.com/evoxmusic",description:null,id:"/getting-started/deploy-your-first-application",last_modified_on:null,path:"website/guides/getting-started/deploy-your-first-application.md",series_position:null,title:"Hello World. Deploy your first application."}],name:"getting-started",series:!0,title:"Getting Started"},"installation-guide":{children:{},description:"Install Qovery on your technical stack.",guides:[{author_github:"https://github.com/evoxmusic",description:null,id:"/installation-guide/guide-amazon-web-services",last_modified_on:null,path:"website/guides/installation-guide/guide-amazon-web-services.md",series_position:null,title:"Install Qovery on your Amazon Web Services account"},{author_github:"https://github.com/evoxmusic",description:null,id:"/installation-guide/guide-kubernetes",last_modified_on:null,path:"website/guides/installation-guide/guide-kubernetes.md",series_position:null,title:"Install Qovery on your Kubernetes cluster"},{author_github:"https://github.com/evoxmusic",description:null,id:"/installation-guide/guide-microsoft-azure",last_modified_on:null,path:"website/guides/installation-guide/guide-microsoft-azure.md",series_position:null,title:"Install Qovery on your Microsoft Azure account"},{author_github:"https://github.com/evoxmusic",description:null,id:"/installation-guide/guide-scaleway",last_modified_on:null,path:"website/guides/installation-guide/guide-scaleway.md",series_position:null,title:"Install Qovery on your Scaleway account"},{author_github:"https://github.com/evoxmusic",description:null,id:"/installation-guide/guide-google-cloud-platform",last_modified_on:null,path:"website/guides/installation-guide/guide-google-cloud-platform.md",series_position:null,title:"Install Qovery your Google Cloud Platform account"}],name:"installation-guide",series:!1,title:"Installation Guide"},advanced:{children:{},description:"Go beyond the basics, become a Qovery pro, and extract the full potential of Qovery.",guides:[{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/continuous-integration",last_modified_on:null,path:"website/guides/advanced/continuous-integration.md",series_position:null,title:"Continuous Integration"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/costs-control",last_modified_on:null,path:"website/guides/advanced/costs-control.md",series_position:null,title:"Costs Control"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/deploy-api-gateway",last_modified_on:null,path:"website/guides/advanced/deploy-api-gateway.md",series_position:null,title:"Deploy API Gateway"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/deploy-aws-services",last_modified_on:null,path:"website/guides/advanced/deploy-aws-services.md",series_position:null,title:"Deploy AWS Services"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/deploy-external-services",last_modified_on:null,path:"website/guides/advanced/deploy-external-services.md",series_position:null,title:"Deploy External Services"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/deploy-frontend",last_modified_on:null,path:"website/guides/advanced/deploy-frontend.md",series_position:null,title:"Deploy Frontend App"},{author_github:"https://github.com/baalooos",description:null,id:"/advanced/deploy-daemonset-with-karpenter",last_modified_on:null,path:"website/guides/advanced/deploy-daemonset-with-karpenter.md",series_position:null,title:"Deploy a DaemonSet in a Karpenter context"},{author_github:"https://github.com/acarranoqovery",description:null,id:"/advanced/adding-multi-region-backup-rds",last_modified_on:null,path:"website/guides/advanced/adding-multi-region-backup-rds.md",series_position:null,title:"Enable multi-region backup on your RDS instances with AWS Backup"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/helm-chart",last_modified_on:null,path:"website/guides/advanced/helm-chart.md",series_position:null,title:"Helm Charts"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/advanced/microservices",last_modified_on:null,path:"website/guides/advanced/microservices.md",series_position:null,title:"Microservices"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/migration",last_modified_on:null,path:"website/guides/advanced/migration.md",series_position:null,title:"Migration"},{author_github:"https://github.com/acarranoqovery",description:null,id:"/advanced/upgrading-rds-instance",last_modified_on:null,path:"website/guides/advanced/upgrading-rds-instance.md",series_position:null,title:"Minimize downtime while upgrading RDS instances"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/monitoring",last_modified_on:null,path:"website/guides/advanced/monitoring.md",series_position:null,title:"Monitoring"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/advanced/monorepository",last_modified_on:null,path:"website/guides/advanced/monorepository.md",series_position:null,title:"Mono repository"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/use-preview-environments",last_modified_on:null,path:"website/guides/advanced/use-preview-environments.md",series_position:null,title:"Preview Environments"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/production",last_modified_on:null,path:"website/guides/advanced/production.md",series_position:null,title:"Production"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/seed-database",last_modified_on:null,path:"website/guides/advanced/seed-database.md",series_position:null,title:"Seed Database"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/terraform",last_modified_on:null,path:"website/guides/advanced/terraform.md",series_position:null,title:"Terraform"}],name:"advanced",series:!1,title:"Advanced"},tutorial:{children:{},description:"Additional step-by-step resources to leverage even more Qovery. ",guides:[{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws",last_modified_on:null,path:"website/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws.md",series_position:null,title:"Blazingly fast Preview Environments for NextJS, NodeJS, and MongoDB on AWS"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/build-e2e-testing-ephemeral-environments",last_modified_on:null,path:"website/guides/tutorial/build-e2e-testing-ephemeral-environments.md",series_position:null,title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/create-a-playground-environment-on-aws",last_modified_on:null,path:"website/guides/tutorial/create-a-playground-environment-on-aws.md",series_position:null,title:"Create a Playground Environment on AWS"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/create-a-blazingly-fast-api-in-rust-part-1",last_modified_on:null,path:"website/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1.md",series_position:null,title:"Create a blazingly fast REST API in Rust (Part 1/2)"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/create-your-staging-environment-from-your-production-environment-on-aws",last_modified_on:null,path:"website/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws.md",series_position:null,title:"Create your Staging environment from your Production environment on AWS"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/generate-qovery-api-client",last_modified_on:null,path:"website/guides/tutorial/generate-qovery-api-client.md",series_position:null,title:"Creating API clients using OpenAPI Tools"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/customizing-preview-url-with-qovery-cli",last_modified_on:null,path:"website/guides/tutorial/customizing-preview-url-with-qovery-cli.md",series_position:null,title:"Customizing Preview URL with Qovery CLI"},{author_github:"https://github.com/baalooos",description:null,id:"/tutorial/deploy-jupyterhub-qovery",last_modified_on:null,path:"website/guides/tutorial/deploy-jupyterhub-qovery.md",series_position:null,title:"Deploy JupyterHub using Helm"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/deploy-rails-with-postgresql-and-sidekiq",last_modified_on:null,path:"website/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq.md",series_position:null,title:"Deploy Rails with PostgreSQL and Sidekiq"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/deploy-temporal-on-kubernetes",last_modified_on:null,path:"website/guides/tutorial/deploy-temporal-on-kubernetes.md",series_position:null,title:"Deploy Temporal on Kubernetes"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/getting-started-with-preview-environments-on-aws-for-beginners",last_modified_on:null,path:"website/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners.md",series_position:null,title:"Getting Started with Preview Environments on AWS"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/gitops-with-qovery",last_modified_on:null,path:"website/guides/tutorial/gitops-with-qovery.md",series_position:null,title:"GitOps with Qovery"},{author_github:"https://github.com/deimosfr",description:null,id:"/tutorial/grafana-install",last_modified_on:null,path:"website/guides/tutorial/grafana-install.md",series_position:null,title:"Grafana setup with Qovery"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources",last_modified_on:null,path:"website/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources.md",series_position:null,title:"How To Use Lifecycle Job To Deploy Any Kind Of Resources"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1",last_modified_on:null,path:"website/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1.md",series_position:null,title:"How to Build a Cloud Version of Your Open Source Software - A Case Study with AppWrite - Part 1"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2",last_modified_on:null,path:"website/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2.md",series_position:null,title:"How to Build a Cloud Version of Your Open Source Software - A Case Study with AppWrite - Part 2"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3",last_modified_on:null,path:"website/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3.md",series_position:null,title:"How to Build a Cloud Version of Your Open Source Software - A Case Study with AppWrite - Part 3"},{author_github:"https://github.com/benjaminch",description:null,id:"/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster",last_modified_on:null,path:"website/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster.md",series_position:null,title:"How to activate SSO to connect to your EKS cluster"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws",last_modified_on:null,path:"website/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws.md",series_position:null,title:"How to connect to a managed MongoDB instance on AWS"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl",last_modified_on:null,path:"website/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl.md",series_position:null,title:"How to connect to your EKS cluster with kubectl"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/how-to-create-an-rds-instance-through-aws-console",last_modified_on:null,path:"website/guides/tutorial/how-to-create-an-rds-instance-through-aws-console.md",series_position:null,title:"How to create an RDS instance through the AWS console"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease",last_modified_on:null,path:"website/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease.md",series_position:null,title:"How to deploy a Rust REST API application on AWS with ease"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/how-to-integrate-qovery-with-github-actions",last_modified_on:null,path:"website/guides/tutorial/how-to-integrate-qovery-with-github-actions.md",series_position:null,title:"How to integrate Qovery with GitHub Actions"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/how-to-run-commands-at-application-startup",last_modified_on:null,path:"website/guides/tutorial/how-to-run-commands-at-application-startup.md",series_position:null,title:"How to run commands before the application starts"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/data-seeding-in-postgres",last_modified_on:null,path:"website/guides/tutorial/data-seeding-in-postgres.md",series_position:null,title:"How to seed a Postgres database on a dev environment"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery",last_modified_on:null,path:"website/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery.md",series_position:null,title:"How to use CloudFront with a React frontend application on Qovery"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/github-organization-repository-access",last_modified_on:null,path:"website/guides/tutorial/github-organization-repository-access.md",series_position:null,title:"How to use Github Organizations with Qovery"},{author_github:"https://github.com/MacLikorne",description:null,id:"/tutorial/how-to-write-a-dockerfile",last_modified_on:null,path:"website/guides/tutorial/how-to-write-a-dockerfile.md",series_position:null,title:"How to write a Dockerfile"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/import-your-environment-variables-with-the-qovery-cli",last_modified_on:null,path:"website/guides/tutorial/import-your-environment-variables-with-the-qovery-cli.md",series_position:null,title:"Import your environment variables with the Qovery CLI"},{author_github:"https://github.com/deimosfr",description:null,id:"/tutorial/cloudwatch-integration",last_modified_on:null,path:"website/guides/tutorial/cloudwatch-integration.md",series_position:null,title:"Integrate your application logs to Cloudwatch"},{author_github:"https://github.com/acarranoqovery",description:null,id:"/tutorial/kubernetes-observability-and-monitoring-with-datadog",last_modified_on:null,path:"website/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog.md",series_position:null,title:"Kubernetes observability and monitoring with Datadog"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/managing-env-variables-in-create-react-app",last_modified_on:null,path:"website/guides/tutorial/managing-env-variables-in-create-react-app.md",series_position:null,title:"Managing Environment Variables in React (create-react-app)"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/migrate-your-application-from-heroku-to-aws",last_modified_on:null,path:"website/guides/tutorial/migrate-your-application-from-heroku-to-aws.md",series_position:null,title:"Migrate your application from Heroku to AWS"},{author_github:"https://github.com/jul-dan",description:null,id:"/tutorial/monitor-and-reduce-kubernetes-spend-with-kubecost",last_modified_on:null,path:"website/guides/tutorial/monitor-and-reduce-kubernetes-spend-with-kubecost.md",series_position:null,title:"Monitor and reduce Kubernetes spend with Kubecost"},{author_github:"https://github.com/jul-dan",description:null,id:"/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery",last_modified_on:null,path:"website/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery.md",series_position:null,title:"Setting up Cloudflare and Custom Domain on Qovery"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/aws-vpc-peering-with-qovery",last_modified_on:null,path:"website/guides/tutorial/aws-vpc-peering-with-qovery.md",series_position:null,title:"Setup VPC peering on AWS with Qovery"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/url-shortener-api-with-kotlin",last_modified_on:null,path:"website/guides/tutorial/url-shortener-api-with-kotlin.md",series_position:null,title:"URL Shortener API with Kotlin (Part 1/2)"},{author_github:"https://github.com/deimosfr",description:null,id:"/tutorial/use-aws-iam-roles-with-qovery",last_modified_on:null,path:"website/guides/tutorial/use-aws-iam-roles-with-qovery.md",series_position:null,title:"Use AWS IAM roles with Qovery"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/use-an-api-gateway-in-front-of-multiple-services",last_modified_on:null,path:"website/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services.md",series_position:null,title:"Use an API gateway in front of multiple services"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/aws-sqs-lambda-with-qovery",last_modified_on:null,path:"website/guides/tutorial/aws-sqs-lambda-with-qovery.md",series_position:null,title:"Using Amazon SQS and Lambda on Qovery"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/working-with-git-submodules",last_modified_on:null,path:"website/guides/tutorial/working-with-git-submodules.md",series_position:null,title:"Working with Git Submodules"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes",last_modified_on:null,path:"website/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes.md",series_position:null,title:"Zero to Hero - How to deploy your apps on AWS in 30 minutes"}],name:"tutorial",series:!1,title:"Tutorial"},engineering:{children:{},description:"We share our engineering learning with all of you. ",guides:[],name:"engineering",series:!1,title:"Engineering"}},highlights:[],installation:{},installation_guides:[{dark_logo_path:"/img/logos/aws_white.svg",logo_path:"/img/logos/aws.svg",name:"aws"},{dark_logo_path:"/img/logos/digitalocean_white.svg",logo_path:"/img/logos/digitalocean.svg",name:"digital_ocean"},{dark_logo_path:"/img/logos/scaleway_white.svg",logo_path:"/img/logos/scaleway.svg",name:"scaleway"},{dark_logo_path:"/img/logos/gcp_white.svg",logo_path:"/img/logos/gcp.svg",name:"gcp"},{dark_logo_path:"/img/logos/azure_white.svg",logo_path:"/img/logos/azure.svg",name:"azure"},{dark_logo_path:"/img/logos/kubernetes_white.svg",logo_path:"/img/logos/kubernetes.svg",name:"kubernetes"}],languages:[{dark_logo_path:"/img/logos/php.svg",logo_path:"/img/logos/php.svg",name:"php"},{dark_logo_path:"/img/logos/kotlin.svg",logo_path:"/img/logos/kotlin.svg",name:"kotlin"},{dark_logo_path:"/img/logos/java.svg",logo_path:"/img/logos/java.svg",name:"java"},{dark_logo_path:"/img/logos/javascript.svg",logo_path:"/img/logos/javascript.svg",name:"javascript"},{dark_logo_path:"/img/logos/python.svg",logo_path:"/img/logos/python.svg",name:"python"},{dark_logo_path:"/img/logos/rust_white.svg",logo_path:"/img/logos/rust.svg",name:"rust"},{dark_logo_path:"/img/logos/go.svg",logo_path:"/img/logos/go.svg",name:"go"},{dark_logo_path:"/img/logos/ruby.svg",logo_path:"/img/logos/ruby.svg",name:"ruby"},{dark_logo_path:"/img/logos/scala.svg",logo_path:"/img/logos/scala.svg",name:"scala"}],latest_highlight:{},latest_post:{},latest_release:{},post_tags:[],posts:[],releases:{},sinks:{},sources:{},team:[{avatar:"https://github.com/evoxmusic.png",bio:'Romaric is a Software Engineer, and CEO at Qovery. He has 10+ years of experience in R&D. From the Ad-Tech to the financial industry, he has deep expertise in highly-reliable and performant systems.\n',github:"https://github.com/evoxmusic",id:"romaric",keybase:"https://keybase.io/evoxmusic",name:"Romaric P."},{avatar:"https://github.com/deimosfr.png",bio:'Pierre is an SRE, and CTO of Qovery. He has 15+ years of experience in R&D. From the financial to the Ad-Tech industry, he has a strong knowledge in distributed and highly-reliable systems. He\'s also the MariaDB High Performance book author.\n',github:"https://github.com/deimosfr",id:"pierre",keybase:"https://keybase.io/pierre",name:"Pierre M."},{avatar:"https://github.com/pjeziorowski.png",bio:'Patryk is an experienced Software Engineer, and a Backend Developer at Qovery. ',github:"https://github.com/pjeziorowski",id:"patryk",keybase:"https://keybase.io/patryk",name:"Patryk J."},{avatar:"https://github.com/maclikorne.png",bio:'Enzo is a Backend Developer at Qovery. ',github:"https://github.com/MacLikorne",id:"enzo",keybase:"https://keybase.io/enzo",name:"Enzo R."},{avatar:"https://github.com/l0ck3.png",bio:'Yann is a Developer Experience Engineer at Qovery. He has 15+ years of experience in development and SRE.\n',github:"https://github.com/l0ck3",id:"yann",keybase:"https://keybase.io/l0ck3",name:"Yann I."},{avatar:"https://github.com/sileht.png",bio:'Mehdi is Senior DevOps Engineer at Qovery, with 15+ years of software development and managing infrastructures, Co-founder of Mergify, active member of non-profit Tetaneutral.net ISP and Hosting provider, and he also likes to dance on crazy swing rhythm.\n',github:"https://github.com/sileht",id:"mehdi",keybase:"https://keybase.io/mehdi",name:"Mehdi A."},{avatar:"https://github.com/Stun3R.png",bio:'Thibaut is an experienced developer, CTO of Shelt.in and active Qovery contributor. ',github:"https://github.com/Stun3R",id:"thibaut_david",keybase:"https://keybase.io/Stun3R",name:"Thibaut David"},{avatar:"https://github.com/Aggis15.png",bio:"Angelos is a self-taught programmer using Python, Qovery ambassador and contributor. ",github:"https://github.com/Aggis15",id:"Aggis15",keybase:"https://keybase.io/Aggis15",name:"Angelos Rinas"},{avatar:"https://github.com/ilmiont.png",bio:"James Walker is the founder of Heron Web, a UK-based digital agency providing bespoke software development services to SMEs. He has experience managing complete end-to-end web development workflows with DevOps, CI/CD, Docker, and Kubernetes.\n",github:"https://github.com/ilmiont",id:"james_walker",keybase:"https://keybase.io/ilmiont",name:"James Walker"},{avatar:"https://github.com/Qovery.png",bio:"Dhiraj Kumar has 10+ years of experience in Python and Machine learning. I specialize in Data analytics and Machine learning using python. My Primary Expertise includes Python, Flask, Django, Pandas, NumPy, SciKit-Learn, NLP, Docker, Machine Learning, Deep Learning, Chatbot, NLP, Spark, AWS, C#, and Azure\n",github:"https://github.com/dhiraj_kumar",id:"dhiraj_kumar",keybase:"https://keybase.io/dhiraj_kumar",name:"Dhiraj Kumar"},{avatar:"https://github.com/Qovery.png",bio:"Shingai Zivuku is a softwage engineer passionated by the cloud.\n",github:"https://github.com/shingai_zivuku",id:"shingai_zivuku",keybase:"https://keybase.io/shingai_zivuku",name:"Shingai Zivuku"},{avatar:"https://github.com/benjaminch.png",bio:'Benjamin is a senior Backend Developer at Qovery.',github:"https://github.com/benjaminch",id:"benjaminch",keybase:"https://keybase.io/benjaminch",name:"Benjamin Chastanier"},{avatar:"https://github.com/jul-dan.png",bio:'Julien is a Technical Product Manager at Qovery.',github:"https://github.com/jul-dan",id:"jul-dan",keybase:"https://keybase.io/jul-dan",name:"Julien Dan"},{avatar:"https://github.com/acarranoqovery.png",bio:'Alessandro is a Lead Product Manager at Qovery.',github:"https://github.com/acarranoqovery",id:"acarranoqovery",keybase:"https://keybase.io/acarranoqovery",name:"Alessandro Carrano"},{avatar:"https://github.com/baalooos.png",bio:'Charles-Edouard is Technical Account Manager at Qovery.',github:"https://github.com/baalooos",id:"cegagnaire",keybase:"https://keybase.io/baalooos",name:"Charles-Edouard Gagnaire"}],technologies:[{dark_logo_path:"/img/logos/kubernetes_white.svg",logo_path:"/img/logos/kubernetes.svg",name:"kubernetes"},{dark_logo_path:"/img/logos/helm_white.svg",logo_path:"/img/logos/helm.svg",name:"helm"},{dark_logo_path:"/img/logos/docker.svg",logo_path:"/img/logos/docker.svg",name:"docker"},{dark_logo_path:"/img/logos/kotlin.svg",logo_path:"/img/logos/kotlin.svg",name:"kotlin"},{dark_logo_path:"/img/logos/qovery.svg",logo_path:"/img/logos/qovery.svg",name:"qovery"},{dark_logo_path:"/img/logos/posthog.svg",logo_path:"/img/logos/posthog.svg",name:"posthog"},{dark_logo_path:"/img/logos/terraform.svg",logo_path:"/img/logos/terraform.svg",name:"terraform"},{dark_logo_path:"/img/logos/github.svg",logo_path:"/img/logos/github.png",name:"github"}],transforms:{}}},themeConfig:{disableDarkMode:!1,navbar:{hideOnScroll:!0,logo:{alt:"Qovery",src:"img/logo-light.svg",srcDark:"img/logo-dark.svg",url:"https://www.qovery.com"},links:[{to:"guides/",label:"Guides",position:"left"},{to:"docs/",label:"Docs",position:"left"},{to:"guides/tutorial",label:"Tutorials",position:"left"},{href:"https://discuss.qovery.com",label:"Forum",position:"left"},{href:"https://start.qovery.com",label:"Web Console",position:"right"},{href:"https://www.qovery.com",label:"Home",position:"right"},{href:"https://github.com/Qovery",label:"GitHub",position:"right"}]},image:"img/open-graph.png",prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:["hcl","rust"]},footer:{links:[{title:"Resources",items:[{label:"Documentation",to:"docs"},{label:"Guides",to:"guides"},{label:"Tutorials",to:"guides/tutorial"},{label:"Engineering",to:"guides/engineering"},{label:"Pricing",to:"https://www.qovery.com/pricing"},{label:"Enterprise",to:"https://www.qovery.com/enterprise"},{label:"API",to:"https://api-doc.qovery.com"},{label:"Github",to:"https://github.com/Qovery"}]},{title:"Community",items:[{label:"Forum",to:"https://community.qovery.com"},{label:"Community call",to:"https://www.qovery.com/community-call"},{label:"Goodies",to:"https://shop.qovery.com"},{label:"Roadmap",to:"https://roadmap.qovery.com"},{label:"Replibyte",to:"https://github.com/Qovery/replibyte"}]},{title:"Company",items:[{label:"Blog",to:"https://www.qovery.com/blog"},{label:"Jobs",to:"https://jobs.qovery.com"},{label:"Team",to:"https://www.qovery.com/team"},{label:"Investors",to:"https://www.qovery.com/investors"},{label:"Contact",to:"https://www.qovery.com/contact"}]}],copyright:"\xa9 2024 DESIGNED BY QOVERY | PROUD SILVER MEMBER OF CNCF AND LINUX FOUNDATION | QOVERY BY BIRDSIGHT - ALL RIGHTS RESERVED"},algolia:{appId:"FT65SBJ2DA",apiKey:"02604e8b2e0918e90edd1d9eb8e30f5e",indexName:"qovery",algoliaOptions:{}},googleAnalytics:{trackingId:"UA-129773960-5"},posthog:{apiKey:"phc_IgdG1K2GveDUte1gJ6hlwNbFHCv9nViWETUyLMU7ciq",appUrl:"https://phprox.qovery.com",enableInDevelopment:!0},imageZoom:{selector:"img"}},title:"Qovery",tagline:"Deploy On-demand Environments on AWS, Remarkably Fast",url:"https://hub.qovery.com",baseUrl:"/",favicon:"img/logo-square.svg",organizationName:"Qovery",projectName:"documentation",presets:[],scripts:["/js/intercom.js",{src:"https://www.googletagmanager.com/gtag/js?id=UA-129773960-5",async:!0},"/js/ga.js"],stylesheets:["https://fonts.googleapis.com/css?family=Ubuntu|Roboto|Source+Code+Pro","https://at-ui.github.io/feather-font/css/iconfont.css"]}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return l}));var o=n(3),r=n(1),i=n(0),a=n.n(i);function s(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var r=e.path?Object(o.f)(t,e):n.length?n[n.length-1].match:o.c.computeRootMatch(t);return r&&(n.push({route:e,match:r}),e.routes&&s(e.routes,t,n)),r})),n}function l(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?a.a.createElement(o.d,n,e.map((function(e,n){return a.a.createElement(o.b,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render(Object(r.a)({},n,{},t,{route:e})):a.a.createElement(e.component,Object(r.a)({},n,t,{route:e}))}})}))):null}},function(e,t){var n=!("undefined"==typeof window||!window.document||!window.document.createElement),o={canUseDOM:n,canUseEventListeners:n&&!(!window.addEventListener&&!window.attachEvent),canUseIntersectionObserver:n&&"IntersectionObserver"in window,canUseViewport:n&&!!window.screen};e.exports=o},function(e,t,n){"use strict";var o=n(36),r={};r[n(2)("toStringTag")]="z",r+""!="[object z]"&&n(16)(Object.prototype,"toString",(function(){return"[object "+o(this)+"]"}),!0)},function(e,t,n){"use strict";var o=n(74),r=n(88),i=n(24),a=n(33);e.exports=n(61)(Array,"Array",(function(e,t){this._t=a(e),this._i=0,this._k=t}),(function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,r(1)):r(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])}),"values"),i.Arguments=i.Array,o("keys"),o("values"),o("entries")},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t){e.exports={}},function(e,t,n){var o=n(107),r=n(65);e.exports=Object.keys||function(e){return o(e,r)}},function(e,t,n){var o=n(35),r=Math.min;e.exports=function(e){return e>0?r(o(e),9007199254740991):0}},function(e,t,n){var o=n(34);e.exports=function(e){return Object(o(e))}},function(e,t,n){var o=n(8),r=n(86),i=n(87),a=Object.defineProperty;t.f=n(10)?Object.defineProperty:function(e,t,n){if(o(e),t=i(t,!0),o(n),r)try{return a(e,t,n)}catch(s){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){for(var o=n(22),r=n(25),i=n(16),a=n(5),s=n(11),l=n(24),u=n(2),c=u("iterator"),d=u("toStringTag"),p=l.Array,f={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},g=r(f),m=0;m0?o:n)(e)}},function(e,t,n){var o=n(23),r=n(2)("toStringTag"),i="Arguments"==o(function(){return arguments}());e.exports=function(e){var t,n,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(n){}}(t=Object(e),r))?n:i?o(t):"Object"==(a=o(t))&&"function"==typeof t.callee?"Arguments":a}},function(e){e.exports=JSON.parse('{"/":{"component":"c4f5d8e4"},"/community":{"component":"672ba3d6"},"/components":{"component":"54e7632e"},"/contact":{"component":"83e9e333"},"/docs":{"component":"25b7c3f2"},"/guides":{"component":"c6d06197","items":[{"content":"d2397242"},{"content":"44b423be"},{"content":"e4310ee0"},{"content":"0578cd49"},{"content":"48764d63"},{"content":"9fe26b56"},{"content":"946bf02d"},{"content":"73d96058"},{"content":"ff2506fd"},{"content":"86a0e6ef"},{"content":"a156f6a6"},{"content":"56c0a343"},{"content":"1a39f24c"},{"content":"da253275"},{"content":"89caf623"},{"content":"967beaa8"},{"content":"1a6d3985"},{"content":"ff0cde69"},{"content":"cbcbf0e3"},{"content":"3248e450"},{"content":"5e5fefd2"},{"content":"3e6b1f84"},{"content":"36676680"},{"content":"498daee8"},{"content":"3ecdd190"},{"content":"50bab564"},{"content":"2cb76395"},{"content":"ab2f7458"},{"content":"3088ad98"},{"content":"dfcfd2f3"},{"content":"df1c18d8"},{"content":"8f02216a"},{"content":"1b633bfd"},{"content":"bc592dc7"},{"content":"acaf40e9"},{"content":"5b95bed2"},{"content":"3986a7a9"},{"content":"de0a75d9"},{"content":"bdd6d8c6"},{"content":"b565c464"},{"content":"40ec3bc1"},{"content":"fb1d0a83"},{"content":"9107e302"},{"content":"a1fea8fb"},{"content":"e06f2af5"},{"content":"8d146bfd"},{"content":"bbfbe73c"},{"content":"60296d59"},{"content":"e1becc8e"},{"content":"b5eab6bb"},{"content":"072d4c63"},{"content":"dea3d534"},{"content":"6ce627d6"},{"content":"e5b9b0aa"},{"content":"522ef453"},{"content":"e1e1580b"},{"content":"9ecfa6fe"},{"content":"16c36934"},{"content":"16976906"},{"content":"68c0e7f9"},{"content":"e8b0321f"},{"content":"ba43933d"},{"content":"c8223350"},{"content":"05049f86"},{"content":"f7098925"},{"content":"7952d159"},{"content":"c0ab55e0"},{"content":"cbb976f4"},{"content":"f3d8c143"},{"content":"0c18cf89"}],"metadata":"49d2885e"},"/guides/advanced":{"component":"d9deea5f","items":[{"content":"1a39f24c"},{"content":"da253275"},{"content":"3248e450"},{"content":"5e5fefd2"},{"content":"3e6b1f84"},{"content":"36676680"},{"content":"498daee8"},{"content":"ab2f7458"},{"content":"8f02216a"},{"content":"dea3d534"},{"content":"e5b9b0aa"},{"content":"522ef453"},{"content":"9ecfa6fe"},{"content":"16c36934"},{"content":"16976906"},{"content":"68c0e7f9"},{"content":"e8b0321f"},{"content":"05049f86"}],"metadata":"3e1d77c1"},"/guides/advanced/adding-multi-region-backup-rds":{"component":"1c13b173","content":"77a87849"},"/guides/advanced/continuous-integration":{"component":"1c13b173","content":"03d003d1"},"/guides/advanced/costs-control":{"component":"1c13b173","content":"a8a9c166"},"/guides/advanced/deploy-api-gateway":{"component":"1c13b173","content":"b7d53051"},"/guides/advanced/deploy-aws-services":{"component":"1c13b173","content":"5385e737"},"/guides/advanced/deploy-daemonset-with-karpenter":{"component":"1c13b173","content":"766a314f"},"/guides/advanced/deploy-external-services":{"component":"1c13b173","content":"e7d0ec68"},"/guides/advanced/deploy-frontend":{"component":"1c13b173","content":"1dd2c233"},"/guides/advanced/helm-chart":{"component":"1c13b173","content":"c24a85bb"},"/guides/advanced/microservices":{"component":"1c13b173","content":"66bbed7b"},"/guides/advanced/migration":{"component":"1c13b173","content":"10c2e3e6"},"/guides/advanced/monitoring":{"component":"1c13b173","content":"18415bef"},"/guides/advanced/monorepository":{"component":"1c13b173","content":"f756422c"},"/guides/advanced/production":{"component":"1c13b173","content":"93701b40"},"/guides/advanced/seed-database":{"component":"1c13b173","content":"2309a9c8"},"/guides/advanced/terraform":{"component":"1c13b173","content":"9c8ed74f"},"/guides/advanced/upgrading-rds-instance":{"component":"1c13b173","content":"1f631fe9"},"/guides/advanced/use-preview-environments":{"component":"1c13b173","content":"8bfd1931"},"/guides/getting-started":{"component":"d9deea5f","items":[{"content":"d2397242"},{"content":"44b423be"},{"content":"e4310ee0"},{"content":"0578cd49"},{"content":"48764d63"}],"metadata":"0e2fb061"},"/guides/getting-started/create-a-database":{"component":"1c13b173","content":"24e60f8a"},"/guides/getting-started/debugging":{"component":"1c13b173","content":"6504a542"},"/guides/getting-started/deploy-your-first-application":{"component":"1c13b173","content":"cc9be38a"},"/guides/getting-started/managing-environment-variables":{"component":"1c13b173","content":"b7280cb5"},"/guides/getting-started/setting-custom-domain":{"component":"1c13b173","content":"c0594016"},"/guides/installation-guide":{"component":"d9deea5f","items":[{"content":"9fe26b56"},{"content":"946bf02d"},{"content":"73d96058"},{"content":"ff2506fd"},{"content":"86a0e6ef"}],"metadata":"6852f5b3"},"/guides/installation-guide/guide-amazon-web-services":{"component":"1c13b173","content":"225ad2ad"},"/guides/installation-guide/guide-google-cloud-platform":{"component":"1c13b173","content":"9b266254"},"/guides/installation-guide/guide-kubernetes":{"component":"1c13b173","content":"dffbf523"},"/guides/installation-guide/guide-microsoft-azure":{"component":"1c13b173","content":"f6a16982"},"/guides/installation-guide/guide-scaleway":{"component":"1c13b173","content":"7cc8f9b8"},"/guides/tags":{"component":"3116c1fa","tags":"a81fb19d"},"/guides/tags/database-postgresql":{"component":"004ec9e5","items":[{"content":"50bab564"},{"content":"2cb76395"},{"content":"f7098925"}],"metadata":"4a111132"},"/guides/tags/database-rds":{"component":"004ec9e5","items":[{"content":"ab2f7458"},{"content":"522ef453"}],"metadata":"42a63c79"},"/guides/tags/domain-operations":{"component":"004ec9e5","items":[{"content":"522ef453"}],"metadata":"68da1f92"},"/guides/tags/framework-rails":{"component":"004ec9e5","items":[{"content":"50bab564"}],"metadata":"a264e41a"},"/guides/tags/installation-guide-aws":{"component":"004ec9e5","items":[{"content":"9fe26b56"},{"content":"a156f6a6"},{"content":"3248e450"},{"content":"3e6b1f84"},{"content":"1b633bfd"},{"content":"3986a7a9"},{"content":"de0a75d9"},{"content":"bdd6d8c6"},{"content":"a1fea8fb"},{"content":"6ce627d6"},{"content":"c8223350"},{"content":"cbb976f4"},{"content":"0c18cf89"}],"metadata":"c539337b"},"/guides/tags/installation-guide-azure":{"component":"004ec9e5","items":[{"content":"86a0e6ef"}],"metadata":"73709b64"},"/guides/tags/installation-guide-gcp":{"component":"004ec9e5","items":[{"content":"946bf02d"}],"metadata":"1e2e1850"},"/guides/tags/installation-guide-kubernetes":{"component":"004ec9e5","items":[{"content":"ff2506fd"}],"metadata":"7e863710"},"/guides/tags/installation-guide-scaleway":{"component":"004ec9e5","items":[{"content":"73d96058"}],"metadata":"a601bb0b"},"/guides/tags/language-javascript":{"component":"004ec9e5","items":[{"content":"498daee8"},{"content":"072d4c63"}],"metadata":"cb05c8fa"},"/guides/tags/language-kotlin":{"component":"004ec9e5","items":[{"content":"f7098925"}],"metadata":"dbe0f891"},"/guides/tags/language-ruby":{"component":"004ec9e5","items":[{"content":"50bab564"}],"metadata":"f7aa8e39"},"/guides/tags/language-rust":{"component":"004ec9e5","items":[{"content":"89caf623"},{"content":"b565c464"}],"metadata":"2e212509"},"/guides/tags/technology-docker":{"component":"004ec9e5","items":[{"content":"bbfbe73c"}],"metadata":"d4b6ce89"},"/guides/tags/technology-github":{"component":"004ec9e5","items":[{"content":"40ec3bc1"}],"metadata":"60ad046d"},"/guides/tags/technology-helm":{"component":"004ec9e5","items":[{"content":"8f02216a"}],"metadata":"49dea187"},"/guides/tags/technology-qovery":{"component":"004ec9e5","items":[{"content":"d2397242"},{"content":"44b423be"},{"content":"e4310ee0"},{"content":"0578cd49"},{"content":"48764d63"},{"content":"56c0a343"},{"content":"1a39f24c"},{"content":"da253275"},{"content":"967beaa8"},{"content":"1a6d3985"},{"content":"ff0cde69"},{"content":"cbcbf0e3"},{"content":"3248e450"},{"content":"5e5fefd2"},{"content":"36676680"},{"content":"3ecdd190"},{"content":"2cb76395"},{"content":"3088ad98"},{"content":"dfcfd2f3"},{"content":"df1c18d8"},{"content":"bc592dc7"},{"content":"acaf40e9"},{"content":"5b95bed2"},{"content":"fb1d0a83"},{"content":"9107e302"},{"content":"e06f2af5"},{"content":"8d146bfd"},{"content":"60296d59"},{"content":"e1becc8e"},{"content":"b5eab6bb"},{"content":"dea3d534"},{"content":"e5b9b0aa"},{"content":"e1e1580b"},{"content":"9ecfa6fe"},{"content":"16c36934"},{"content":"16976906"},{"content":"68c0e7f9"},{"content":"e8b0321f"},{"content":"ba43933d"},{"content":"7952d159"},{"content":"c0ab55e0"},{"content":"f3d8c143"}],"metadata":"4c0b3d74"},"/guides/tags/technology-terraform":{"component":"004ec9e5","items":[{"content":"05049f86"}],"metadata":"63ea0c72"},"/guides/tags/type-guide":{"component":"004ec9e5","items":[{"content":"d2397242"},{"content":"44b423be"},{"content":"e4310ee0"},{"content":"0578cd49"},{"content":"48764d63"},{"content":"9fe26b56"},{"content":"946bf02d"},{"content":"73d96058"},{"content":"ff2506fd"},{"content":"86a0e6ef"},{"content":"1a39f24c"},{"content":"da253275"},{"content":"5e5fefd2"},{"content":"3e6b1f84"},{"content":"36676680"},{"content":"498daee8"},{"content":"ab2f7458"},{"content":"8f02216a"},{"content":"dea3d534"},{"content":"e5b9b0aa"},{"content":"522ef453"},{"content":"9ecfa6fe"},{"content":"16c36934"},{"content":"16976906"},{"content":"68c0e7f9"},{"content":"e8b0321f"},{"content":"05049f86"}],"metadata":"f11e9a8e"},"/guides/tags/type-tutorial":{"component":"004ec9e5","items":[{"content":"a156f6a6"},{"content":"56c0a343"},{"content":"89caf623"},{"content":"967beaa8"},{"content":"1a6d3985"},{"content":"ff0cde69"},{"content":"cbcbf0e3"},{"content":"3248e450"},{"content":"3ecdd190"},{"content":"50bab564"},{"content":"2cb76395"},{"content":"3088ad98"},{"content":"dfcfd2f3"},{"content":"df1c18d8"},{"content":"1b633bfd"},{"content":"bc592dc7"},{"content":"acaf40e9"},{"content":"5b95bed2"},{"content":"3986a7a9"},{"content":"de0a75d9"},{"content":"bdd6d8c6"},{"content":"b565c464"},{"content":"40ec3bc1"},{"content":"fb1d0a83"},{"content":"9107e302"},{"content":"a1fea8fb"},{"content":"e06f2af5"},{"content":"8d146bfd"},{"content":"bbfbe73c"},{"content":"60296d59"},{"content":"e1becc8e"},{"content":"b5eab6bb"},{"content":"072d4c63"},{"content":"6ce627d6"},{"content":"e1e1580b"},{"content":"ba43933d"},{"content":"c8223350"},{"content":"f7098925"},{"content":"7952d159"},{"content":"c0ab55e0"},{"content":"cbb976f4"},{"content":"f3d8c143"},{"content":"0c18cf89"}],"metadata":"bf22200e"},"/guides/tutorial":{"component":"d9deea5f","items":[{"content":"a156f6a6"},{"content":"56c0a343"},{"content":"89caf623"},{"content":"967beaa8"},{"content":"1a6d3985"},{"content":"ff0cde69"},{"content":"cbcbf0e3"},{"content":"3ecdd190"},{"content":"50bab564"},{"content":"2cb76395"},{"content":"3088ad98"},{"content":"dfcfd2f3"},{"content":"df1c18d8"},{"content":"1b633bfd"},{"content":"bc592dc7"},{"content":"acaf40e9"},{"content":"5b95bed2"},{"content":"3986a7a9"},{"content":"de0a75d9"},{"content":"bdd6d8c6"},{"content":"b565c464"},{"content":"40ec3bc1"},{"content":"fb1d0a83"},{"content":"9107e302"},{"content":"a1fea8fb"},{"content":"e06f2af5"},{"content":"8d146bfd"},{"content":"bbfbe73c"},{"content":"60296d59"},{"content":"e1becc8e"},{"content":"b5eab6bb"},{"content":"072d4c63"},{"content":"6ce627d6"},{"content":"e1e1580b"},{"content":"ba43933d"},{"content":"c8223350"},{"content":"f7098925"},{"content":"7952d159"},{"content":"c0ab55e0"},{"content":"cbb976f4"},{"content":"f3d8c143"},{"content":"0c18cf89"}],"metadata":"af9ec14b"},"/guides/tutorial/aws-sqs-lambda-with-qovery":{"component":"1c13b173","content":"bbedfc29"},"/guides/tutorial/aws-vpc-peering-with-qovery":{"component":"1c13b173","content":"e9c994cf"},"/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws":{"component":"1c13b173","content":"94a00d4e"},"/guides/tutorial/build-e2e-testing-ephemeral-environments":{"component":"1c13b173","content":"2121549d"},"/guides/tutorial/cloudwatch-integration":{"component":"1c13b173","content":"83a41d86"},"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1":{"component":"1c13b173","content":"db372ba8"},"/guides/tutorial/create-a-playground-environment-on-aws":{"component":"1c13b173","content":"2ea1d02e"},"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws":{"component":"1c13b173","content":"410a9ba0"},"/guides/tutorial/customizing-preview-url-with-qovery-cli":{"component":"1c13b173","content":"b76eb9a9"},"/guides/tutorial/data-seeding-in-postgres":{"component":"1c13b173","content":"4592dbe6"},"/guides/tutorial/deploy-jupyterhub-qovery":{"component":"1c13b173","content":"abbfd6bd"},"/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq":{"component":"1c13b173","content":"a3cf753a"},"/guides/tutorial/deploy-temporal-on-kubernetes":{"component":"1c13b173","content":"49a59b02"},"/guides/tutorial/generate-qovery-api-client":{"component":"1c13b173","content":"a4401f0f"},"/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners":{"component":"1c13b173","content":"1a3e0044"},"/guides/tutorial/github-organization-repository-access":{"component":"1c13b173","content":"55af4c9e"},"/guides/tutorial/gitops-with-qovery":{"component":"1c13b173","content":"dfb1c803"},"/guides/tutorial/grafana-install":{"component":"1c13b173","content":"5b8d4026"},"/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster":{"component":"1c13b173","content":"06e8d299"},"/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1":{"component":"1c13b173","content":"10dee872"},"/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2":{"component":"1c13b173","content":"a4c8ecc0"},"/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3":{"component":"1c13b173","content":"b74d0aaa"},"/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws":{"component":"1c13b173","content":"eb0c7ce5"},"/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl":{"component":"1c13b173","content":"7aa59ca3"},"/guides/tutorial/how-to-create-an-rds-instance-through-aws-console":{"component":"1c13b173","content":"e4768112"},"/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease":{"component":"1c13b173","content":"3da71a70"},"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes":{"component":"1c13b173","content":"97f5d064"},"/guides/tutorial/how-to-integrate-qovery-with-github-actions":{"component":"1c13b173","content":"c7bfb1d3"},"/guides/tutorial/how-to-run-commands-at-application-startup":{"component":"1c13b173","content":"1d3be599"},"/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery":{"component":"1c13b173","content":"311fe203"},"/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources":{"component":"1c13b173","content":"6b7a52aa"},"/guides/tutorial/how-to-write-a-dockerfile":{"component":"1c13b173","content":"a9994e72"},"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli":{"component":"1c13b173","content":"bb89e1a0"},"/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog":{"component":"1c13b173","content":"b479fc9a"},"/guides/tutorial/managing-env-variables-in-create-react-app":{"component":"1c13b173","content":"a4459aa8"},"/guides/tutorial/migrate-your-application-from-heroku-to-aws":{"component":"1c13b173","content":"03dbc155"},"/guides/tutorial/monitor-and-reduce-kubernetes-spend-with-kubecost":{"component":"1c13b173","content":"4b542f80"},"/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery":{"component":"1c13b173","content":"e5653b8d"},"/guides/tutorial/url-shortener-api-with-kotlin":{"component":"1c13b173","content":"ab8f5b83"},"/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services":{"component":"1c13b173","content":"35d9179e"},"/guides/tutorial/use-aws-iam-roles-with-qovery":{"component":"1c13b173","content":"5b5f8b70"},"/guides/tutorial/working-with-git-submodules":{"component":"1c13b173","content":"f26e55ec"},"/mailing_list":{"component":"48912b2c"},"/docs/:route":{"component":"1be78505","docsMetadata":"20ac7829"},"/docs/getting-started":{"component":"17896441","content":"d589d3a7"},"/docs/getting-started/basic-concepts":{"component":"17896441","content":"d85dc1ef"},"/docs/getting-started/deploy-my-app":{"component":"17896441","content":"4354960d"},"/docs/getting-started/how-qovery-works":{"component":"17896441","content":"cb2208c1"},"/docs/getting-started/install-qovery":{"component":"17896441","content":"1a1dfe25"},"/docs/getting-started/install-qovery/aws":{"component":"17896441","content":"4132998e"},"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery":{"component":"17896441","content":"e862b20f"},"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/create-credentials":{"component":"17896441","content":"04b748dc"},"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/faq":{"component":"17896441","content":"48dbd876"},"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/infrastructure":{"component":"17896441","content":"c8dfbbe7"},"/docs/getting-started/install-qovery/aws/cluster-managed-by-qovery/quickstart":{"component":"17896441","content":"099598c5"},"/docs/getting-started/install-qovery/aws/self-managed-cluster":{"component":"17896441","content":"ab1ec509"},"/docs/getting-started/install-qovery/azure":{"component":"17896441","content":"115eba8e"},"/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery":{"component":"17896441","content":"0f632e24"},"/docs/getting-started/install-qovery/azure/cluster-managed-by-qovery/quickstart":{"component":"17896441","content":"256f5506"},"/docs/getting-started/install-qovery/azure/self-managed-cluster":{"component":"17896441","content":"ac0a13b6"},"/docs/getting-started/install-qovery/gcp":{"component":"17896441","content":"d99b987c"},"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery":{"component":"17896441","content":"cc3d7007"},"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/create-credentials":{"component":"17896441","content":"be464708"},"/docs/getting-started/install-qovery/gcp/cluster-managed-by-qovery/quickstart":{"component":"17896441","content":"150479d1"},"/docs/getting-started/install-qovery/gcp/self-managed-cluster":{"component":"17896441","content":"b49a87dd"},"/docs/getting-started/install-qovery/kubernetes":{"component":"17896441","content":"87080b01"},"/docs/getting-started/install-qovery/kubernetes/byok-config":{"component":"17896441","content":"3ccabad0"},"/docs/getting-started/install-qovery/kubernetes/faq":{"component":"17896441","content":"6f4ba85a"},"/docs/getting-started/install-qovery/kubernetes/quickstart":{"component":"17896441","content":"9d099993"},"/docs/getting-started/install-qovery/kubernetes/validate-installation":{"component":"17896441","content":"b91b4421"},"/docs/getting-started/install-qovery/local":{"component":"17896441","content":"60154927"},"/docs/getting-started/install-qovery/scaleway":{"component":"17896441","content":"9c253a96"},"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery":{"component":"17896441","content":"b0059451"},"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/create-credentials":{"component":"17896441","content":"40c64f54"},"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/faq":{"component":"17896441","content":"b557ef1e"},"/docs/getting-started/install-qovery/scaleway/cluster-managed-by-qovery/quickstart":{"component":"17896441","content":"27d7a36c"},"/docs/getting-started/install-qovery/scaleway/self-managed-cluster":{"component":"17896441","content":"952063ba"},"/docs/getting-started/what-is-qovery":{"component":"17896441","content":"68b95634"},"/docs/getting-started/whats-next":{"component":"17896441","content":"543e268a"},"/docs/security-and-compliance":{"component":"17896441","content":"fcb698a1"},"/docs/security-and-compliance/backup-and-restore":{"component":"17896441","content":"b98931a2"},"/docs/security-and-compliance/encryption":{"component":"17896441","content":"2486bcfc"},"/docs/security-and-compliance/gdpr":{"component":"17896441","content":"7278678a"},"/docs/security-and-compliance/soc2":{"component":"17896441","content":"cf490432"},"/docs/useful-resources/faq":{"component":"17896441","content":"59157ba2"},"/docs/useful-resources/help-and-support":{"component":"17896441","content":"d2075f7f"},"/docs/using-qovery":{"component":"17896441","content":"56cfbe62"},"/docs/using-qovery/audit-logs":{"component":"17896441","content":"b8490823"},"/docs/using-qovery/configuration":{"component":"17896441","content":"fc376fea"},"/docs/using-qovery/configuration/advanced-settings":{"component":"17896441","content":"4f6caeac"},"/docs/using-qovery/configuration/application":{"component":"17896441","content":"8d5726d6"},"/docs/using-qovery/configuration/application-health-checks":{"component":"17896441","content":"91473650"},"/docs/using-qovery/configuration/cloud-service-provider":{"component":"17896441","content":"33b1fe0f"},"/docs/using-qovery/configuration/cluster-advanced-settings":{"component":"17896441","content":"2f1afd92"},"/docs/using-qovery/configuration/clusters":{"component":"17896441","content":"dc00a797"},"/docs/using-qovery/configuration/clusters/aws":{"component":"17896441","content":"5adf400e"},"/docs/using-qovery/configuration/clusters/aws-with-karpenter":{"component":"17896441","content":"acbf1af7"},"/docs/using-qovery/configuration/clusters/gcp":{"component":"17896441","content":"54ca7d36"},"/docs/using-qovery/configuration/clusters/scaleway":{"component":"17896441","content":"4e05c534"},"/docs/using-qovery/configuration/cronjob":{"component":"17896441","content":"54ad54c7"},"/docs/using-qovery/configuration/database":{"component":"17896441","content":"9feef5a0"},"/docs/using-qovery/configuration/database/mongodb":{"component":"17896441","content":"9ddfc3dc"},"/docs/using-qovery/configuration/database/mysql":{"component":"17896441","content":"accdb2b4"},"/docs/using-qovery/configuration/database/postgresql":{"component":"17896441","content":"baf9cc25"},"/docs/using-qovery/configuration/database/redis":{"component":"17896441","content":"c536ba8c"},"/docs/using-qovery/configuration/deployment-rule":{"component":"17896441","content":"db96bb7d"},"/docs/using-qovery/configuration/environment":{"component":"17896441","content":"a4a09dfe"},"/docs/using-qovery/configuration/environment-variable":{"component":"17896441","content":"07c2f310"},"/docs/using-qovery/configuration/helm":{"component":"17896441","content":"02ec211a"},"/docs/using-qovery/configuration/lifecycle-job":{"component":"17896441","content":"16557ade"},"/docs/using-qovery/configuration/object-storage":{"component":"17896441","content":"9d3c5a68"},"/docs/using-qovery/configuration/organization":{"component":"17896441","content":"ff91a867"},"/docs/using-qovery/configuration/organization/api-token":{"component":"17896441","content":"1d187ae3"},"/docs/using-qovery/configuration/organization/container-registry":{"component":"17896441","content":"6b0e113a"},"/docs/using-qovery/configuration/organization/git-repository-access":{"component":"17896441","content":"9406f053"},"/docs/using-qovery/configuration/organization/helm-repository":{"component":"17896441","content":"2737c3be"},"/docs/using-qovery/configuration/organization/labels-annotations":{"component":"17896441","content":"91bdc394"},"/docs/using-qovery/configuration/organization/members-rbac":{"component":"17896441","content":"b2880863"},"/docs/using-qovery/configuration/project":{"component":"17896441","content":"bd10520b"},"/docs/using-qovery/configuration/provider":{"component":"17896441","content":"89de14d0"},"/docs/using-qovery/configuration/service-health-checks":{"component":"17896441","content":"073aa0b0"},"/docs/using-qovery/configuration/user-account":{"component":"17896441","content":"376f4c3b"},"/docs/using-qovery/deployment":{"component":"17896441","content":"8ca6d3cf"},"/docs/using-qovery/deployment/deploying-with-auto-deploy":{"component":"17896441","content":"39686ad9"},"/docs/using-qovery/deployment/deploying-with-ci-cd":{"component":"17896441","content":"36b4c04d"},"/docs/using-qovery/deployment/deployment-actions":{"component":"17896441","content":"8ae34d0a"},"/docs/using-qovery/deployment/deployment-history":{"component":"17896441","content":"47a329cb"},"/docs/using-qovery/deployment/deployment-pipeline":{"component":"17896441","content":"55ef6d6a"},"/docs/using-qovery/deployment/deployment-strategies":{"component":"17896441","content":"b79e7411"},"/docs/using-qovery/deployment/image-mirroring":{"component":"17896441","content":"6308ca27"},"/docs/using-qovery/deployment/logs":{"component":"17896441","content":"6ebd4d49"},"/docs/using-qovery/deployment/running-and-deployment-statuses":{"component":"17896441","content":"e3c664e0"},"/docs/using-qovery/integration":{"component":"17896441","content":"8d1c77c1"},"/docs/using-qovery/integration/api-integration":{"component":"17896441","content":"d28d5470"},"/docs/using-qovery/integration/container-registry":{"component":"17896441","content":"7f79072b"},"/docs/using-qovery/integration/continuous-integration":{"component":"17896441","content":"1772e35f"},"/docs/using-qovery/integration/continuous-integration/circle-ci":{"component":"17896441","content":"1aa86e56"},"/docs/using-qovery/integration/continuous-integration/github-actions":{"component":"17896441","content":"3a11bd48"},"/docs/using-qovery/integration/continuous-integration/gitlab-ci":{"component":"17896441","content":"120e882c"},"/docs/using-qovery/integration/continuous-integration/jenkins":{"component":"17896441","content":"4dcdbf34"},"/docs/using-qovery/integration/git-repository":{"component":"17896441","content":"2a88660b"},"/docs/using-qovery/integration/helm-repository":{"component":"17896441","content":"8bd1b610"},"/docs/using-qovery/integration/iac":{"component":"17896441","content":"bfcdd23f"},"/docs/using-qovery/integration/iac/cloudformation":{"component":"17896441","content":"29def772"},"/docs/using-qovery/integration/iac/other":{"component":"17896441","content":"95683447"},"/docs/using-qovery/integration/iac/terraform":{"component":"17896441","content":"8e32e4fc"},"/docs/using-qovery/integration/monitoring":{"component":"17896441","content":"592d28ca"},"/docs/using-qovery/integration/monitoring/datadog":{"component":"17896441","content":"d471c358"},"/docs/using-qovery/integration/monitoring/new-relic":{"component":"17896441","content":"e1e0a511"},"/docs/using-qovery/integration/secret-manager":{"component":"17896441","content":"888595cd"},"/docs/using-qovery/integration/secret-manager/aws-secrets-manager":{"component":"17896441","content":"dab3a2be"},"/docs/using-qovery/integration/secret-manager/doppler":{"component":"17896441","content":"5e60e078"},"/docs/using-qovery/integration/slack":{"component":"17896441","content":"40a919e7"},"/docs/using-qovery/integration/terraform-provider":{"component":"17896441","content":"f9df4186"},"/docs/using-qovery/integration/webhook":{"component":"17896441","content":"7df50433"},"/docs/using-qovery/interface":{"component":"17896441","content":"3a03b8f9"},"/docs/using-qovery/interface/cli":{"component":"17896441","content":"d9a4c8ef"},"/docs/using-qovery/interface/rest-api":{"component":"17896441","content":"c3f02c14"},"/docs/using-qovery/interface/terraform-interface":{"component":"17896441","content":"f0f90e68"},"/docs/using-qovery/interface/web-interface":{"component":"17896441","content":"58379094"},"/docs/using-qovery/maintenance":{"component":"17896441","content":"ac2c90fd"},"/docs/using-qovery/troubleshoot":{"component":"17896441","content":"b4dda200"},"/docs/using-qovery/troubleshoot/cluster-troubleshoot":{"component":"17896441","content":"3cfde410"},"/docs/using-qovery/troubleshoot/service-deployment-troubleshoot":{"component":"17896441","content":"1350cb71"},"/docs/using-qovery/troubleshoot/service-run-troubleshoot":{"component":"17896441","content":"b538f6fb"}}')},function(e,t,n){var o,r;void 0===(r="function"==typeof(o=function(){var e,t,n={version:"0.2.0"},o=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function r(e,t,n){return en?n:e}function i(e){return 100*(-1+e)}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(o[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=r(e,o.minimum,1),n.status=1===e?null:e;var l=n.render(!t),u=l.querySelector(o.barSelector),c=o.speed,d=o.easing;return l.offsetWidth,a((function(t){""===o.positionUsing&&(o.positionUsing=n.getPositioningCSS()),s(u,function(e,t,n){var r;return(r="translate3d"===o.positionUsing?{transform:"translate3d("+i(e)+"%,0,0)"}:"translate"===o.positionUsing?{transform:"translate("+i(e)+"%,0)"}:{"margin-left":i(e)+"%"}).transition="all "+t+"ms "+n,r}(e,c,d)),1===e?(s(l,{transition:"none",opacity:1}),l.offsetWidth,setTimeout((function(){s(l,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),o.trickleSpeed)};return o.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*r(Math.random()*t,.1,.95)),t=r(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*o.trickleRate)},e=0,t=0,n.promise=function(o){return o&&"resolved"!==o.state()?(0===t&&n.start(),e++,t++,o.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=o.template;var r,a=t.querySelector(o.barSelector),l=e?"-100":i(n.status||0),c=document.querySelector(o.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),o.showSpinner||(r=t.querySelector(o.spinnerSelector))&&p(r),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){c(document.documentElement,"nprogress-busy"),c(document.querySelector(o.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var a=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()})),t[n]||(t[n]=function(t){var n=document.body.style;if(t in n)return t;for(var o,r=e.length,i=t.charAt(0).toUpperCase()+t.slice(1);r--;)if((o=e[r]+i)in n)return o;return t}(n))}function o(e,t,o){t=n(t),e.style[t]=o}return function(e,t){var n,r,i=arguments;if(2==i.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,i[1],i[2])}}();function l(e,t){return("string"==typeof e?e:d(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=d(e),o=n+t;l(n,t)||(e.className=o.substring(1))}function c(e,t){var n,o=d(e);l(e,t)&&(n=o.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function d(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n})?o.call(t,n,t,e):o)||(e.exports=r)},function(e,t,n){"use strict";n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return w}));var o=n(3);n.d(t,"c",(function(){return o.a})),n.d(t,"d",(function(){return o.f})),n.d(t,"e",(function(){return o.g})),n.d(t,"f",(function(){return o.h}));var r=n(6),i=n(0),a=n.n(i),s=n(7),l=(n(15),n(1)),u=n(9),c=n(4),d=function(e){function t(){for(var t,n=arguments.length,o=new Array(n),r=0;r1&&s.call(o[0],n,(function(){for(r=1;re.length)return;if(!(k instanceof l)){if(m&&y!=t.length-1){if(p.lastIndex=w,!(P=p.exec(e)))break;for(var x=P.index+(g?P[1].length:0),_=P.index+P[0].length,E=y,S=w,T=t.length;E=(S+=t[E].length)&&(++y,w=S);if(t[y]instanceof l)continue;q=E-y,k=e.slice(w,S),P.index-=w}else{p.lastIndex=0;var P=p.exec(k),q=1}if(P){g&&(h=P[1]?P[1].length:0),_=(x=P.index+h)+(P=P[0].slice(h)).length;var C=k.slice(0,x),O=k.slice(_),A=[y,q];C&&(++y,w+=C.length,A.push(C));var R=new l(u,f?r.tokenize(P,f):P,b,P,m);if(A.push(R),O&&A.push(O),Array.prototype.splice.apply(t,A),1!=q&&r.matchGrammar(e,t,n,y,w,!0,u),a)break}else if(a)break}}}}},hooks:{add:function(){}},tokenize:function(e,t,n){var o=[e],i=t.rest;if(i){for(var a in i)t[a]=i[a];delete t.rest}return r.matchGrammar(e,o,t,0,0,!1),o}},(i=r.Token=function(e,t,n,o,r){this.type=e,this.content=t,this.alias=n,this.length=0|(o||"").length,this.greedy=!!r}).stringify=function(e,t,n){if("string"==typeof e)return e;if("Array"===r.util.type(e))return e.map((function(n){return i.stringify(n,t,e)})).join("");var o={type:e.type,content:i.stringify(e.content,t,n),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:n};if(e.alias){var a="Array"===r.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(o.classes,a)}var s=Object.keys(o.attributes).map((function(e){return e+'="'+(o.attributes[e]||"").replace(/"/g,""")+'"'})).join(" ");return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+(s?" "+s:"")+">"+o.content+""},r);a.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var o={"included-cdata":{pattern://i,inside:n}};o["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var r={};r[e]={pattern:RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g,e),"i"),lookbehind:!0,greedy:!0,inside:o},a.languages.insertBefore("markup","cdata",r)}}),a.languages.xml=a.languages.extend("markup",{}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)\w+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b\w+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+?)\s*(?:\r?\n|\r)(?:[\s\S])*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s*(?:\r?\n|\r)(?:[\s\S])*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0},{pattern:/(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\1)[^\\])*\1/,greedy:!0,inside:n}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|==?|!=?|=~|<<[<-]?|[&\d]?>>|\d?[<>]&?|&[>&]?|\|[&|]?|<=?|>=?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}};for(var o=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],r=n.variable[1].inside,i=0;i=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{"class-name":{pattern:/(\b(?:enum|struct)\s+)\w+/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),a.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/,lookbehind:!0},directive:{pattern:/(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,lookbehind:!0,alias:"keyword"}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete a.languages.c.boolean,a.languages.cpp=a.languages.extend("c",{"class-name":{pattern:/(\b(?:class|enum|struct)\s+)\w+/,lookbehind:!0},keyword:/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),a.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/@[\w-]+/}},url:{pattern:RegExp("url\\((?:"+t.source+"|[^\n\r()]*)\\)","i"),inside:{function:/^url/i,punctuation:/^\(|\)$/}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+t.source+")*?(?=\\s*\\{)"),string:{pattern:t,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:n.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},n.tag))}(a),a.languages.css.selector={pattern:a.languages.css.selector,inside:{"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-:.\w]+/,id:/#[-:.\w]+/,attribute:{pattern:/\[(?:[^[\]"']|("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1)*\]/,greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)[-*\w\xA0-\uFFFF]*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},attribute:{pattern:/^(\s*)[-\w\xA0-\uFFFF]+/,lookbehind:!0},value:[/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,{pattern:/(=\s*)[-\w\xA0-\uFFFF]+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],punctuation:/[()]/}},a.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*/i,lookbehind:!0}}),a.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:/#[\da-f]{3,8}/i,entity:/\\[\da-f]{1,8}/i,unit:{pattern:/(\d)(?:%|[a-z]+)/,lookbehind:!0},number:/-?[\d.]+/}),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.])\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,function:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}}}),a.languages.markup&&a.languages.markup.tag.addInlined("script","javascript"),a.languages.js=a.languages.javascript,function(e){var t=e.util.clone(e.languages.javascript);e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=/<\/?(?:[\w.:-]+\s*(?:\s+(?:[\w.:-]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s{'">=]+|\{(?:\{(?:\{[^}]*\}|[^{}])*\}|[^{}])+\}))?|\{\.{3}[a-z_$][\w$]*(?:\.[a-z_$][\w$]*)*\}))*\s*\/?)?>/i,e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/i,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">]+)/i,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.insertBefore("inside","attr-name",{spread:{pattern:/\{\.{3}[a-z_$][\w$]*(?:\.[a-z_$][\w$]*)*\}/,inside:{punctuation:/\.{3}|[{}.]/,"attr-value":/\w+/}}},e.languages.jsx.tag),e.languages.insertBefore("inside","attr-value",{script:{pattern:/=(\{(?:\{(?:\{[^}]*\}|[^}])*\}|[^}])+\})/i,inside:{"script-punctuation":{pattern:/^=(?={)/,alias:"punctuation"},rest:e.languages.jsx},alias:"language-javascript"}},e.languages.jsx.tag);var n=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(n).join(""):""},o=function(t){for(var r=[],i=0;i0&&r[r.length-1].tagName===n(a.content[0].content[1])&&r.pop():"/>"===a.content[a.content.length-1].content||r.push({tagName:n(a.content[0].content[1]),openedBraces:0}):r.length>0&&"punctuation"===a.type&&"{"===a.content?r[r.length-1].openedBraces++:r.length>0&&r[r.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?r[r.length-1].openedBraces--:s=!0),(s||"string"==typeof a)&&r.length>0&&0===r[r.length-1].openedBraces){var l=n(a);i0&&("string"==typeof t[i-1]||"plain-text"===t[i-1].type)&&(l=n(t[i-1])+l,t.splice(i-1,1),i--),t[i]=new e.Token("plain-text",l,null,l)}a.content&&"string"!=typeof a.content&&o(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||o(e.tokens)}))}(a),function(e){var t=e.languages.javadoclike={parameter:{pattern:/(^\s*(?:\/{3}|\*|\/\*\*)\s*@(?:param|arg|arguments)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^\s*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(t,"addSupport",{value:function(t,n){"string"==typeof t&&(t=[t]),t.forEach((function(t){!function(t,n){var o=e.languages[t];if(o){var r=o["doc-comment"];if(!r){var i={"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,alias:"comment"}};r=(o=e.languages.insertBefore(t,"comment",i))["doc-comment"]}if(r instanceof RegExp&&(r=o["doc-comment"]={pattern:r}),Array.isArray(r))for(var a=0,s=r.length;a>>?=?|->|([-+&|])\2|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(\.[a-z]\w*)+/,lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":n,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(a),function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,o,r,i){if(n.language===o){var a=n.tokenStack=[];n.code=n.code.replace(r,(function(e){if("function"==typeof i&&!i(e))return e;for(var r,s=a.length;-1!==n.code.indexOf(r=t(o,s));)++s;return a[s]=e,r})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,o){if(n.language===o&&n.tokenStack){n.grammar=e.languages[o];var r=0,i=Object.keys(n.tokenStack);!function a(s){for(var l=0;l=i.length);l++){var u=s[l];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=i[r],d=n.tokenStack[c],p="string"==typeof u?u:u.content,f=t(o,c),g=p.indexOf(f);if(g>-1){++r;var m=p.substring(0,g),h=new e.Token(o,e.tokenize(d,n.grammar),"language-"+o,d),b=p.substring(g+f.length),v=[];m&&v.push.apply(v,a([m])),v.push(h),b&&v.push.apply(v,a([b])),"string"==typeof u?s.splice.apply(s,[l,1].concat(v)):u.content=v}}else u.content&&a(u.content)}return s}(n.tokens)}}}})}(a),function(e){e.languages.php=e.languages.extend("clike",{keyword:/\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,boolean:{pattern:/\b(?:false|true)\b/i,alias:"constant"},constant:[/\b[A-Z_][A-Z0-9_]*\b/,/\b(?:null)\b/i],comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0}}),e.languages.insertBefore("php","string",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),e.languages.insertBefore("php","comment",{delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"}}),e.languages.insertBefore("php","keyword",{variable:/\$+(?:\w+\b|(?={))/i,package:{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),e.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}});var t={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/,lookbehind:!0,inside:{rest:e.languages.php}};e.languages.insertBefore("php","string",{"nowdoc-string":{pattern:/<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},"heredoc-string":{pattern:/<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:t}},"single-quoted-string":{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,alias:"string",inside:{interpolation:t}}}),delete e.languages.php.string,e.hooks.add("before-tokenize",(function(t){if(/<\?/.test(t.code)){e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/gi)}})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(a),function(e){var t=e.languages.javascript,n=/{(?:[^{}]|{(?:[^{}]|{[^{}]*})*})+}/.source,o="(@(?:param|arg|argument|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(o+/[$\w\xA0-\uFFFF.]+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(o+/\[[$\w\xA0-\uFFFF.]+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:t,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{punctuation:/[.,:?=<>|{}()[\]]/}},{pattern:/(@(?:augments|extends|class|interface|memberof!?|this)\s+)[A-Z]\w*(?:\.[A-Z]\w*)*/,lookbehind:!0,inside:{punctuation:/\./}}],example:{pattern:/(@example\s+)[^@]+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^(\s*(?:\*\s*)?).+$/m,lookbehind:!0,inside:t,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(a),a.languages.actionscript=a.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|else|extends|finally|for|function|if|implements|import|in|instanceof|interface|internal|is|native|new|null|package|private|protected|public|return|super|switch|this|throw|try|typeof|use|var|void|while|with|dynamic|each|final|get|include|namespace|native|override|set|static)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<>?>?|[!=]=?)=?|[~?@]/}),a.languages.actionscript["class-name"].alias="function",a.languages.markup&&a.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:{rest:a.languages.markup}}}),function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},rest:e.languages.javascript}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:(?:Uint|Int)(?:8|16|32)|Uint8Clamped|Float(?:32|64))?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|(?:Weak)?(?:Set|Map)|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:/(\.\s*)#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*/,lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|location|navigator|performance|(?:local|session)Storage|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],n=0;n))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:type|opaque|declare|Class)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:await|Diff|Exact|Keys|ObjMap|PropertyType|Shape|Record|Supertype|Subtype|Enum)\b(?!\$)/,lookbehind:!0})}(a),a.languages.n4js=a.languages.extend("javascript",{keyword:/\b(?:any|Array|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),a.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),a.languages.n4jsd=a.languages.n4js,a.languages.typescript=a.languages.extend("javascript",{keyword:/\b(?:abstract|as|async|await|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|is|keyof|let|module|namespace|new|null|of|package|private|protected|public|readonly|return|require|set|static|super|switch|this|throw|try|type|typeof|var|void|while|with|yield)\b/,builtin:/\b(?:string|Function|any|number|boolean|Array|symbol|console|Promise|unknown|never)\b/}),a.languages.ts=a.languages.typescript,function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,o=t.inside.interpolation,r=o.inside["interpolation-punctuation"],i=o.pattern.source;function a(t,o){if(e.languages[t])return{pattern:RegExp("((?:"+o+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function l(t,n,o){var r={code:t,grammar:n,language:o};return e.hooks.run("before-tokenize",r),r.tokens=e.tokenize(r.code,r.grammar),e.hooks.run("after-tokenize",r),r.tokens}function u(t){var n={};n["interpolation-punctuation"]=r;var i=e.tokenize(t,n);if(3===i.length){var a=[1,1];a.push.apply(a,l(i[1],e.languages.javascript,"javascript")),i.splice.apply(i,a)}return new e.Token("interpolation",i,o.alias,t)}function c(t,n,o){var r=e.tokenize(t,{interpolation:{pattern:RegExp(i),lookbehind:!0}}),a=0,c={},d=l(r.map((function(e){if("string"==typeof e)return e;for(var n,r=e.content;-1!==t.indexOf(n=s(a++,o)););return c[n]=r,n})).join(""),n,o),p=Object.keys(c);return a=0,function e(t){for(var n=0;n=p.length)return;var o=t[n];if("string"==typeof o||"string"==typeof o.content){var r=p[a],i="string"==typeof o?o:o.content,s=i.indexOf(r);if(-1!==s){++a;var l=i.substring(0,s),d=u(c[r]),f=i.substring(s+r.length),g=[];if(l&&g.push(l),g.push(d),f){var m=[f];e(m),g.push.apply(g,m)}"string"==typeof o?(t.splice.apply(t,[n,1].concat(g)),n+=g.length-1):o.content=g}}else{var h=o.content;Array.isArray(h)?e(h):e([h])}}}(d),new e.Token(o,d,"language-"+o,t)}e.languages.javascript["template-string"]=[a("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),a("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),a("svg",/\bsvg/.source),a("markdown",/\b(?:md|markdown)/.source),a("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function p(e){return"string"==typeof e?e:Array.isArray(e)?e.map(p).join(""):p(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var o=0,r=n.length;o/g,t),n&&(e=e+"|"+e.replace(/_/g,"\\*")),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var o=/(?:\\.|``.+?``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,r=/\|?__(?:\|__)+\|?(?:(?:\r?\n|\r)|$)/.source.replace(/__/g,o),i=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\r?\n|\r)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+r+i+"(?:"+r+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+r+i+")(?:"+r+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(o),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+r+")"+i+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+r+"$"),inside:{"table-header":{pattern:RegExp(o),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/(^[ \t]*(?:\r?\n|\r))(?: {4}|\t).+(?:(?:\r?\n|\r)(?: {4}|\t).+)*/m,lookbehind:!0,alias:"keyword"},{pattern:/``.+?``|`[^`\r\n]+`/,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\r?\n|\r))[\s\S]+?(?=(?:\r?\n|\r)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\r?\n|\r)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#+.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/__(?:(?!_)|_(?:(?!_))+_)+__/.source,!0),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/_(?:(?!_)|__(?:(?!_))+__)+_/.source,!0),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+?\2/.source,!1),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)| ?\[(?:(?!\]))+\])/.source,!1),lookbehind:!0,greedy:!0,inside:{variable:{pattern:/(\[)[^\]]+(?=\]$)/,lookbehind:!0},content:{pattern:/(^!?\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},string:{pattern:/"(?:\\.|[^"\\])*"(?=\)$)/}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,o=t.length;n",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var o=t[n],r=[];/^\w+$/.test(n)||r.push(/\w+/.exec(n)[0]),"diff"===n&&r.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+o+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:r}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/m,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/m}},coord:/^@@.*@@$/m,commit_sha1:/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,builtin:/\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/,boolean:/\b(?:_|iota|nil|true|false)\b/,operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,number:/(?:\b0x[a-f\d]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e[-+]?\d+)?)i?/i,string:{pattern:/(["'`])(\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0}}),delete a.languages.go["class-name"],function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/i,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:true|false)\b/,block:{pattern:/^(\s*~?\s*)[#\/]\S+?(?=\s*~?\s*$|\s)/i,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")}))}(a),a.languages.json={property:{pattern:/"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,greedy:!0},string:{pattern:/"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,greedy:!0},comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,number:/-?\d+\.?\d*(e[+-]?\d+)?/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-]+?(?:\([^{}]+\)|[^(){};])*?(?=\s*\{)/i,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\([^{}]*\)|[^{};@])*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/i,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-]+.*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},builtin:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,symbol:{pattern:/^[^:=\r\n]+(?=\s*:(?!=))/m,inside:{variable:/\$+(?:[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:[/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,{pattern:/(\()(?:addsuffix|abspath|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:s|list)?)(?=[ \t])/,lookbehind:!0}],operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{keyword:/\b(?:asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while|in|self|super)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,string:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|@"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.ocaml={comment:/\(\*[\s\S]*?\*\)/,string:[{pattern:/"(?:\\.|[^\\\r\n"])*"/,greedy:!0},{pattern:/(['`])(?:\\(?:\d+|x[\da-f]+|.)|(?!\1)[^\\\r\n])\1/i,greedy:!0}],number:/\b(?:0x[\da-f][\da-f_]+|(?:0[bo])?\d[\d_]*\.?[\d_]*(?:e[+-]?[\d_]+)?)/i,type:{pattern:/\B['`]\w*/,alias:"variable"},directive:{pattern:/\B#\w+/,alias:"function"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|object|of|open|prefix|private|rec|then|sig|struct|to|try|type|val|value|virtual|where|while|with)\b/,boolean:/\b(?:false|true)\b/,operator:/:=|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lxor|lsl|lsr|mod|nor|or)\b/,punctuation:/[(){}\[\]|_.,:;]/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^\s*)@\w+(?:\.\w+)*/i,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{comment:{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:mod|land|lor|lxor|lsl|lsr|asr)\b/}),a.languages.insertBefore("reason","class-name",{character:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,alias:"string"},constructor:{pattern:/\b[A-Z]\w*\b(?!\s*\.)/,alias:"variable"},label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t]+.+)*/m,lookbehind:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,inside:{atrule:/(?:@[\w-]+|[+=])/m}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|or|not)\b/,{pattern:/(\s+)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s]+.*)/m,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/([ \t]*)\S(?:,?[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,?[^,\r\n]+)*)*/,lookbehind:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-]+(?:\([^()]+\)|[^(])*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()]|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}]+[:{][^}]+))/m,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[\w-]|\$[-\w]+|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:if|else(?: if)?|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)/i,{pattern:/( +)(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|or|not)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,a.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:_INSERT|COL)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURNS?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:TRUE|FALSE|NULL)\b/i,number:/\b0x[\da-f]+\b|\b\d+\.?\d*|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|IN|LIKE|NOT|OR|IS|DIV|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t={url:/url\((["']?).*?\1\)/i,string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:if|else|for|return|unless)(?=\s+|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,number:/\b\d+(?:\.\d+)?%?/,boolean:/\b(?:true|false)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.+|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],punctuation:/[{}()\[\];:,]/};t.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^{|}$/,alias:"punctuation"},rest:t}},t.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:t}},e.languages.stylus={comment:{pattern:/(^|[^\\])(\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},"atrule-declaration":{pattern:/(^\s*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:t}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:(?:\{[^}]*\}|.+)|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:t}},statement:{pattern:/(^[ \t]*)(?:if|else|for|return|unless)[ \t]+.+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:t}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)[^{\r\n]*(?:;|[^{\r\n,](?=$)(?!(\r?\n|\r)(?:\{|\2[ \t]+)))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:t.interpolation}},rest:t}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\))?|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\))?|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t]+)))/m,lookbehind:!0,inside:{interpolation:t.interpolation,punctuation:/[{},]/}},func:t.func,string:t.string,interpolation:t.interpolation,punctuation:/[{}()\[\];:.]/}}(a);var s=a.util.clone(a.languages.typescript);a.languages.tsx=a.languages.extend("jsx",s),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^_`|~]+/i,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/},a.languages.yaml={scalar:{pattern:/([\-:]\s*(?:![^\s]+)?[ \t]*[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)[^\r\n]+(?:\2[^\r\n]+)*)/,lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:/(\s*(?:^|[:\-,[{\r\n?])[ \t]*(?:![^\s]+)?[ \t]*)[^\r\n{[\]},#\s]+?(?=\s*:\s)/,lookbehind:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?)?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?)(?=[ \t]*(?:$|,|]|}))/m,lookbehind:!0,alias:"number"},boolean:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:true|false)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},null:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:null|~)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},string:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)("|')(?:(?!\2)[^\\\r\n]|\\.)*\2(?=[ \t]*(?:$|,|]|}|\s*#))/m,lookbehind:!0,greedy:!0},number:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+\.?\d*|\.?\d+)(?:e[+-]?\d+)?|\.inf|\.nan)[ \t]*(?=$|,|]|})/im,lookbehind:!0},tag:/![^\s]+/,important:/[&*][\w]+/,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},a.languages.yml=a.languages.yaml,t.a=a},function(e,t,n){var o=n(23);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==o(e)?e.split(""):Object(e)}},function(e,t,n){"use strict";var o=n(36),r=RegExp.prototype.exec;e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var i=n.call(e,t);if("object"!=typeof i)throw new TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==o(e))throw new TypeError("RegExp#exec called on incompatible receiver");return r.call(e,t)}},function(e,t,n){"use strict";n(103);var o=n(16),r=n(11),i=n(14),a=n(34),s=n(2),l=n(45),u=s("species"),c=!i((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")})),d=function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();e.exports=function(e,t,n){var p=s(e),f=!i((function(){var t={};return t[p]=function(){return 7},7!=""[e](t)})),g=f?!i((function(){var t=!1,n=/a/;return n.exec=function(){return t=!0,null},"split"===e&&(n.constructor={},n.constructor[u]=function(){return n}),n[p](""),!t})):void 0;if(!f||!g||"replace"===e&&!c||"split"===e&&!d){var m=/./[p],h=n(a,p,""[e],(function(e,t,n,o,r){return t.exec===l?f&&!r?{done:!0,value:m.call(t,n,o)}:{done:!0,value:e.call(n,t,o)}:{done:!1}})),b=h[0],v=h[1];o(String.prototype,e,b),r(RegExp.prototype,p,2==t?function(e,t){return v.call(e,this,t)}:function(e){return v.call(e,this)})}}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){"use strict";var o,r,i,a,s=n(44),l=n(5),u=n(30),c=n(36),d=n(12),p=n(13),f=n(32),g=n(80),m=n(81),h=n(63),b=n(70).set,v=n(122)(),y=n(71),w=n(123),k=n(124),x=n(125),_=l.TypeError,E=l.process,S=E&&E.versions,T=S&&S.v8||"",P=l.Promise,q="process"==c(E),C=function(){},O=r=y.f,A=!!function(){try{var e=P.resolve(1),t=(e.constructor={})[n(2)("species")]=function(e){e(C,C)};return(q||"function"==typeof PromiseRejectionEvent)&&e.then(C)instanceof t&&0!==T.indexOf("6.6")&&-1===k.indexOf("Chrome/66")}catch(o){}}(),R=function(e){var t;return!(!p(e)||"function"!=typeof(t=e.then))&&t},N=function(e,t){if(!e._n){e._n=!0;var n=e._c;v((function(){for(var o=e._v,r=1==e._s,i=0,a=function(t){var n,i,a,s=r?t.ok:t.fail,l=t.resolve,u=t.reject,c=t.domain;try{s?(r||(2==e._h&&j(e),e._h=1),!0===s?n=o:(c&&c.enter(),n=s(o),c&&(c.exit(),a=!0)),n===t.promise?u(_("Promise-chain cycle")):(i=R(n))?i.call(n,l,u):l(n)):u(o)}catch(d){c&&!a&&c.exit(),u(d)}};n.length>i;)a(n[i++]);e._c=[],e._n=!1,t&&!e._h&&z(e)}))}},z=function(e){b.call(l,(function(){var t,n,o,r=e._v,i=I(e);if(i&&(t=w((function(){q?E.emit("unhandledRejection",r,e):(n=l.onunhandledrejection)?n({promise:e,reason:r}):(o=l.console)&&o.error&&o.error("Unhandled promise rejection",r)})),e._h=q||I(e)?2:1),e._a=void 0,i&&t.e)throw t.v}))},I=function(e){return 1!==e._h&&0===(e._a||e._c).length},j=function(e){b.call(l,(function(){var t;q?E.emit("rejectionHandled",e):(t=l.onrejectionhandled)&&t({promise:e,reason:e._v})}))},L=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),N(t,!0))},F=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw _("Promise can't be resolved itself");(t=R(e))?v((function(){var o={_w:n,_d:!1};try{t.call(e,u(F,o,1),u(L,o,1))}catch(r){L.call(o,r)}})):(n._v=e,n._s=1,N(n,!1))}catch(o){L.call({_w:n,_d:!1},o)}}};A||(P=function(e){g(this,P,"Promise","_h"),f(e),o.call(this);try{e(u(F,this,1),u(L,this,1))}catch(t){L.call(this,t)}},(o=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=n(82)(P.prototype,{then:function(e,t){var n=O(h(this,P));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=q?E.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&N(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),i=function(){var e=new o;this.promise=e,this.resolve=u(F,e,1),this.reject=u(L,e,1)},y.f=O=function(e){return e===P||e===a?new i(e):r(e)}),d(d.G+d.W+d.F*!A,{Promise:P}),n(41)(P,"Promise"),n(94)("Promise"),a=n(17).Promise,d(d.S+d.F*!A,"Promise",{reject:function(e){var t=O(this);return(0,t.reject)(e),t.promise}}),d(d.S+d.F*(s||!A),"Promise",{resolve:function(e){return x(s&&this===a?P:this,e)}}),d(d.S+d.F*!(A&&n(83)((function(e){P.all(e).catch(C)}))),"Promise",{all:function(e){var t=this,n=O(t),o=n.resolve,r=n.reject,i=w((function(){var n=[],i=0,a=1;m(e,!1,(function(e){var s=i++,l=!1;n.push(void 0),a++,t.resolve(e).then((function(e){l||(l=!0,n[s]=e,--a||o(n))}),r)})),--a||o(n)}));return i.e&&r(i.v),n.promise},race:function(e){var t=this,n=O(t),o=n.reject,r=w((function(){m(e,!1,(function(e){t.resolve(e).then(n.resolve,o)}))}));return r.e&&o(r.v),n.promise}})},function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}}(),e.exports=n(99)},function(e,t,n){"use strict";var o=n(64)(!0);e.exports=function(e,t,n){return t+(n?o(e,t).length:1)}},function(e,t,n){"use strict";var o=n(44),r=n(12),i=n(16),a=n(11),s=n(24),l=n(105),u=n(41),c=n(108),d=n(2)("iterator"),p=!([].keys&&"next"in[].keys()),f=function(){return this};e.exports=function(e,t,n,g,m,h,b){l(n,t,g);var v,y,w,k=function(e){if(!p&&e in S)return S[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},x=t+" Iterator",_="values"==m,E=!1,S=e.prototype,T=S[d]||S["@@iterator"]||m&&S[m],P=T||k(m),q=m?_?k("entries"):P:void 0,C="Array"==t&&S.entries||T;if(C&&(w=c(C.call(new e)))!==Object.prototype&&w.next&&(u(w,x,!0),o||"function"==typeof w[d]||a(w,d,f)),_&&T&&"values"!==T.name&&(E=!0,P=function(){return T.call(this)}),o&&!b||!p&&!E&&S[d]||a(S,d,P),s[t]=P,s[x]=f,m)if(v={values:_?P:k("values"),keys:h?P:k("keys"),entries:q},b)for(y in v)y in S||i(S,y,v[y]);else r(r.P+r.F*(p||E),t,v);return v}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){var o=n(8),r=n(32),i=n(2)("species");e.exports=function(e,t){var n,a=o(e).constructor;return void 0===a||null==(n=o(a)[i])?t:r(n)}},function(e,t,n){var o=n(35),r=n(34);e.exports=function(e){return function(t,n){var i,a,s=String(r(t)),l=o(n),u=s.length;return l<0||l>=u?e?"":void 0:(i=s.charCodeAt(l))<55296||i>56319||l+1===u||(a=s.charCodeAt(l+1))<56320||a>57343?e?s.charAt(l):i:e?s.slice(l,l+2):a-56320+(i-55296<<10)+65536}}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){var o=n(5).document;e.exports=o&&o.documentElement},function(e,t,n){"use strict";var o=n(19);t.a=o.b},function(e,t,n){"use strict";e.exports=n(113)},function(e,t,n){"use strict";var o=n(0),r=n.n(o);t.a=r.a.createContext({})},function(e,t,n){var o,r,i,a=n(30),s=n(121),l=n(66),u=n(46),c=n(5),d=c.process,p=c.setImmediate,f=c.clearImmediate,g=c.MessageChannel,m=c.Dispatch,h=0,b={},v=function(){var e=+this;if(b.hasOwnProperty(e)){var t=b[e];delete b[e],t()}},y=function(e){v.call(e.data)};p&&f||(p=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return b[++h]=function(){s("function"==typeof e?e:Function(e),t)},o(h),h},f=function(e){delete b[e]},"process"==n(23)(d)?o=function(e){d.nextTick(a(v,e,1))}:m&&m.now?o=function(e){m.now(a(v,e,1))}:g?(i=(r=new g).port2,r.port1.onmessage=y,o=a(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(o=function(e){c.postMessage(e+"","*")},c.addEventListener("message",y,!1)):o="onreadystatechange"in u("script")?function(e){l.appendChild(u("script")).onreadystatechange=function(){l.removeChild(this),v.call(e)}}:function(e){setTimeout(a(v,e,1),0)}),e.exports={set:p,clear:f}},function(e,t,n){"use strict";var o=n(32);function r(e){var t,n;this.promise=new e((function(e,o){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=o})),this.resolve=o(t),this.reject=o(n)}e.exports.f=function(e){return new r(e)}},function(e,t,n){"use strict";(function(t){var n="__global_unique_id__";e.exports=function(){return t[n]=(t[n]||0)+1}}).call(this,n(76))},function(e,t,n){"use strict";var o=n(68),r={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},i={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},a={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return o.isMemo(e)?a:s[e.$$typeof]||r}s[o.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[o.Memo]=a;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,o){if("string"!=typeof n){if(g){var r=f(n);r&&r!==g&&e(t,r,o)}var a=c(n);d&&(a=a.concat(d(n)));for(var s=l(t),m=l(n),h=0;h]*>)/g,f=/\$([$&`']|\d\d?)/g;n(56)("replace",2,(function(e,t,n,g){return[function(o,r){var i=e(this),a=null==o?void 0:o[t];return void 0!==a?a.call(o,i,r):n.call(String(i),o,r)},function(e,t){var r=g(n,e,this,t);if(r.done)return r.value;var d=o(e),p=String(this),f="function"==typeof t;f||(t=String(t));var h=d.global;if(h){var b=d.unicode;d.lastIndex=0}for(var v=[];;){var y=l(d,p);if(null===y)break;if(v.push(y),!h)break;""===String(y[0])&&(d.lastIndex=s(p,i(d.lastIndex),b))}for(var w,k="",x=0,_=0;_=x&&(k+=p.slice(x,S)+O,x=S+E.length)}return k+p.slice(x)}];function m(e,t,o,i,a,s){var l=o+e.length,u=i.length,c=f;return void 0!==a&&(a=r(a),c=p),n.call(s,c,(function(n,r){var s;switch(r.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,o);case"'":return t.slice(l);case"<":s=a[r.slice(1,-1)];break;default:var c=+r;if(0===c)return n;if(c>u){var p=d(c/10);return 0===p?n:p<=u?void 0===i[p-1]?r.charAt(1):i[p-1]+r.charAt(1):n}s=i[c-1]}return void 0===s?"":s}))}}))},function(e,t,n){"use strict";var o=n(95),r=n(8),i=n(63),a=n(60),s=n(26),l=n(55),u=n(45),c=n(14),d=Math.min,p=[].push,f="length",g=!c((function(){RegExp(4294967295,"y")}));n(56)("split",2,(function(e,t,n,c){var m;return m="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1)[f]||2!="ab".split(/(?:ab)*/)[f]||4!=".".split(/(.?)(.?)/)[f]||".".split(/()()/)[f]>1||"".split(/.?/)[f]?function(e,t){var r=String(this);if(void 0===e&&0===t)return[];if(!o(e))return n.call(r,e,t);for(var i,a,s,l=[],c=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),d=0,g=void 0===t?4294967295:t>>>0,m=new RegExp(e.source,c+"g");(i=u.call(m,r))&&!((a=m.lastIndex)>d&&(l.push(r.slice(d,i.index)),i[f]>1&&i.index=g));)m.lastIndex===i.index&&m.lastIndex++;return d===r[f]?!s&&m.test("")||l.push(""):l.push(r.slice(d)),l[f]>g?l.slice(0,g):l}:"0".split(void 0,0)[f]?function(e,t){return void 0===e&&0===t?[]:n.call(this,e,t)}:n,[function(n,o){var r=e(this),i=null==n?void 0:n[t];return void 0!==i?i.call(n,r,o):m.call(String(r),n,o)},function(e,t){var o=c(m,e,this,t,m!==n);if(o.done)return o.value;var u=r(e),p=String(this),f=i(u,RegExp),h=u.unicode,b=(u.ignoreCase?"i":"")+(u.multiline?"m":"")+(u.unicode?"u":"")+(g?"y":"g"),v=new f(g?u:"^(?:"+u.source+")",b),y=void 0===t?4294967295:t>>>0;if(0===y)return[];if(0===p.length)return null===l(v,p)?[p]:[];for(var w=0,k=0,x=[];k=t.length?{value:void 0,done:!0}:(e=o(t,n),this._i+=e.length,{value:e,done:!1})}))},function(e,t){e.exports=function(e,t,n,o){if(!(e instanceof t)||void 0!==o&&o in e)throw TypeError(n+": incorrect invocation!");return e}},function(e,t,n){var o=n(30),r=n(91),i=n(92),a=n(8),s=n(26),l=n(93),u={},c={};(t=e.exports=function(e,t,n,d,p){var f,g,m,h,b=p?function(){return e}:l(e),v=o(n,d,t?2:1),y=0;if("function"!=typeof b)throw TypeError(e+" is not iterable!");if(i(b)){for(f=s(e.length);f>y;y++)if((h=t?v(a(g=e[y])[0],g[1]):v(e[y]))===u||h===c)return h}else for(m=b.call(e);!(g=m.next()).done;)if((h=r(m,v,g.value,t))===u||h===c)return h}).BREAK=u,t.RETURN=c},function(e,t,n){var o=n(16);e.exports=function(e,t,n){for(var r in t)o(e,r,t[r],n);return e}},function(e,t,n){var o=n(2)("iterator"),r=!1;try{var i=[7][o]();i.return=function(){r=!0},Array.from(i,(function(){throw 2}))}catch(a){}e.exports=function(e,t){if(!t&&!r)return!1;var n=!1;try{var i=[7],s=i[o]();s.next=function(){return{done:n=!0}},i[o]=function(){return s},e(i)}catch(a){}return n}},function(e,t,n){var o=n(12);o(o.S+o.F,"Object",{assign:n(126)})},function(e,t,n){var o=n(12),r=n(129)(!1);o(o.S,"Object",{values:function(e){return r(e)}})},function(e,t,n){e.exports=!n(10)&&!n(14)((function(){return 7!=Object.defineProperty(n(46)("div"),"a",{get:function(){return 7}}).a}))},function(e,t,n){var o=n(13);e.exports=function(e,t){if(!o(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!o(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){var o=n(8),r=n(106),i=n(65),a=n(47)("IE_PROTO"),s=function(){},l=function(){var e,t=n(46)("iframe"),o=i.length;for(t.style.display="none",n(66).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("