diff --git a/404.html b/404.html index 3ed3522..c67eda9 100644 --- a/404.html +++ b/404.html @@ -10,13 +10,13 @@ - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

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/archive/index.html b/archive/index.html index dc68248..caa839b 100644 --- a/archive/index.html +++ b/archive/index.html @@ -10,13 +10,13 @@ - - + +
-
Skip to main content

Archive

Archive

- - +
Skip to main content

Archive

Archive

+ + \ No newline at end of file diff --git a/assets/images/image1-eef70ed3dc514b4595fa7b2e942c0c84.png b/assets/images/image1-eef70ed3dc514b4595fa7b2e942c0c84.png new file mode 100644 index 0000000..cd96b38 Binary files /dev/null and b/assets/images/image1-eef70ed3dc514b4595fa7b2e942c0c84.png differ diff --git a/assets/images/image10-f54066357e1ac6f07d1328778aadfa56.png b/assets/images/image10-f54066357e1ac6f07d1328778aadfa56.png new file mode 100644 index 0000000..cdeadba Binary files /dev/null and b/assets/images/image10-f54066357e1ac6f07d1328778aadfa56.png differ diff --git a/assets/images/image11-9523915eb890fc2140e2ef4d82d7d321.png b/assets/images/image11-9523915eb890fc2140e2ef4d82d7d321.png new file mode 100644 index 0000000..abff5e4 Binary files /dev/null and b/assets/images/image11-9523915eb890fc2140e2ef4d82d7d321.png differ diff --git a/assets/images/image12-95d009e76a3028c10e85a48869b30024.png b/assets/images/image12-95d009e76a3028c10e85a48869b30024.png new file mode 100644 index 0000000..549e5c6 Binary files /dev/null and b/assets/images/image12-95d009e76a3028c10e85a48869b30024.png differ diff --git a/assets/images/image13-07e1cced7e57e854d6d9292d27e41e5f.png b/assets/images/image13-07e1cced7e57e854d6d9292d27e41e5f.png new file mode 100644 index 0000000..462e9ec Binary files /dev/null and b/assets/images/image13-07e1cced7e57e854d6d9292d27e41e5f.png differ diff --git a/assets/images/image14-3496c59c4d5e62a633d262973de5be15.png b/assets/images/image14-3496c59c4d5e62a633d262973de5be15.png new file mode 100644 index 0000000..59f9160 Binary files /dev/null and b/assets/images/image14-3496c59c4d5e62a633d262973de5be15.png differ diff --git a/assets/images/image15-378409677ac487bddd0762e59a2779e9.png b/assets/images/image15-378409677ac487bddd0762e59a2779e9.png new file mode 100644 index 0000000..a42929a Binary files /dev/null and b/assets/images/image15-378409677ac487bddd0762e59a2779e9.png differ diff --git a/assets/images/image2-061a50a23be703545afb75ebb7eb49ff.png b/assets/images/image2-061a50a23be703545afb75ebb7eb49ff.png new file mode 100644 index 0000000..ae1d5bc Binary files /dev/null and b/assets/images/image2-061a50a23be703545afb75ebb7eb49ff.png differ diff --git a/assets/images/image3-6b0ee09b75fce89e5d91a094f378a479.png b/assets/images/image3-6b0ee09b75fce89e5d91a094f378a479.png new file mode 100644 index 0000000..5b576e8 Binary files /dev/null and b/assets/images/image3-6b0ee09b75fce89e5d91a094f378a479.png differ diff --git a/assets/images/image4-3dad32f7579e7ecb54bb3100fbf1de70.png b/assets/images/image4-3dad32f7579e7ecb54bb3100fbf1de70.png new file mode 100644 index 0000000..f4de85f Binary files /dev/null and b/assets/images/image4-3dad32f7579e7ecb54bb3100fbf1de70.png differ diff --git a/assets/images/image5-e1c9a511f6888bb95b570f5f5e5b608c.png b/assets/images/image5-e1c9a511f6888bb95b570f5f5e5b608c.png new file mode 100644 index 0000000..579af15 Binary files /dev/null and b/assets/images/image5-e1c9a511f6888bb95b570f5f5e5b608c.png differ diff --git a/assets/images/image6-3bc8f84802773f720c49a6bf35ff7560.png b/assets/images/image6-3bc8f84802773f720c49a6bf35ff7560.png new file mode 100644 index 0000000..1afb9a2 Binary files /dev/null and b/assets/images/image6-3bc8f84802773f720c49a6bf35ff7560.png differ diff --git a/assets/images/image7-cc351d483108fa63750ff4ff5ff611b0.png b/assets/images/image7-cc351d483108fa63750ff4ff5ff611b0.png new file mode 100644 index 0000000..7c709c7 Binary files /dev/null and b/assets/images/image7-cc351d483108fa63750ff4ff5ff611b0.png differ diff --git a/assets/images/image8-b2eebd424c4f5f9e5836e0a2f603e9ad.png b/assets/images/image8-b2eebd424c4f5f9e5836e0a2f603e9ad.png new file mode 100644 index 0000000..dd43582 Binary files /dev/null and b/assets/images/image8-b2eebd424c4f5f9e5836e0a2f603e9ad.png differ diff --git a/assets/images/image9-d85e2e17b9b3643b7624dd24995c98ff.png b/assets/images/image9-d85e2e17b9b3643b7624dd24995c98ff.png new file mode 100644 index 0000000..8e850d9 Binary files /dev/null and b/assets/images/image9-d85e2e17b9b3643b7624dd24995c98ff.png differ diff --git a/assets/js/322446a6.c9d57f1d.js b/assets/js/322446a6.c9d57f1d.js new file mode 100644 index 0000000..0e8d759 --- /dev/null +++ b/assets/js/322446a6.c9d57f1d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkastria_docs_2=self.webpackChunkastria_docs_2||[]).push([[56],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),g=i,m=p["".concat(l,".").concat(g)]||p[g]||h[g]||o;return n?a.createElement(m,r(r({ref:t},u),{},{components:n})):a.createElement(m,r({ref:t},u))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,r=new Array(o);r[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:i,r[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=n(7462),i=(n(7294),n(3905));const o={},r="Exploring Virtual Fashion: Garment Try-On with Astria",s={permalink:"/articles/virtual-tryon",source:"@site/blog/virtual-tryon.md",title:"Exploring Virtual Fashion: Garment Try-On with Astria",description:"Virtual try-on is a technology that lets you see how clothes, makeup, or accessories would look on a model or on a customer before purchase. Essentially, it allows you to simulate how garments look on people without the need for a traditional photoshoot. This helps in eliminating the complexities and expenses associated with physical photoshoots. It can also replicate the experience of trying things on in a store, but a customer can do it from the comfort of their own home using their phone or computer.",date:"2024-06-04T07:35:25.000Z",formattedDate:"June 4, 2024",tags:[],readingTime:5.09,hasTruncateMarker:!1,authors:[],frontMatter:{},nextItem:{title:"Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion",permalink:"/articles/real-estate"}},l={authorsImageUrls:[]},c=[{value:"Who Can Benefit from This Feature?",id:"who-can-benefit-from-this-feature",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...o}=e;return(0,i.kt)(p,(0,a.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"what-is-a-virtual-try-on"},"What Is a Virtual Try-On?"),(0,i.kt)("p",null,"Virtual try-on is a technology that lets you see how clothes, makeup, or accessories would look on a model or on a customer before purchase. Essentially, it allows you to simulate how garments look on people without the need for a traditional photoshoot. This helps in eliminating the complexities and expenses associated with physical photoshoots. It can also replicate the experience of trying things on in a store, but a customer can do it from the comfort of their own home using their phone or computer."),(0,i.kt)("p",null,"Virtual try-on is increasingly being used for a variety of products, including:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Clothing"),(0,i.kt)("li",{parentName:"ul"},"Makeup"),(0,i.kt)("li",{parentName:"ul"},"Glasses"),(0,i.kt)("li",{parentName:"ul"},"Jewelry"),(0,i.kt)("li",{parentName:"ul"},"Hats")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(4543).Z,title:"image_tooltip",width:"1052",height:"477"})),(0,i.kt)("h2",{id:"who-can-benefit-from-this-feature"},"Who Can Benefit from This Feature?"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"E-commerce companies")," can superimpose clothing on models or mannequins to create advertisements. This capability allows them to efficiently scale their operations by handling a large volume of images without the logistical challenges of traditional photoshoots."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Shoppers "),"can quickly see how clothes would look on them by simulating the garments on their own images. This enhances the shopping experience, increases customer satisfaction, and can lead to higher sales.")),(0,i.kt)("h1",{id:"steps-to-virtual-garment-try-on-with-astria"},"Steps to Virtual Garment Try-On with Astria"),(0,i.kt)("p",null,"Developers interested in integrating Virtual Try-On capabilities into their applications can seamlessly utilize the APIs provided by ",(0,i.kt)("a",{parentName:"p",href:"https://www.astria.ai"},"Astria"),"."),(0,i.kt)("p",null,"Here\u2019s what you need to do step-by-step."),(0,i.kt)("p",null,"First, create the fine-tune of a model."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(3365).Z,title:"image_tooltip",width:"885",height:"652"})),(0,i.kt)("p",null,"We\u2019ve used around 16 publicly available images of supermodel Gisele Bundchen, and created a fine-tune out of it."),(0,i.kt)("p",null,"Go to Tunes \u2192 New Fine Tune, and create a Checkpoint tune from the above images."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(4319).Z,title:"image_tooltip",width:"893",height:"828"})),(0,i.kt)("p",null,"You can also do it via the API as follows:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},'curl -X POST -H "Authorization: Bearer $API_KEY" https://api.astria.ai/tunes \\\n -F tune[title]="Gisele-Bundchen" \\\n -F tune[name]=man \\\n -F tune[branch]="fast" \\\n -F tune[callback]="https://optional-callback-url.com/webhooks/astria?user_id=1&tune_id=1" \\\n -F tune[base_tune_id]=690204 \\\n -F tune[token]=ohwx \\\n -F tune[prompts_attributes][0][callback]="https://optional-callback-url.com/webhooks/astria?user_id=1&prompt_id=1&tune_id=1" \\\n -F tune[images][0]="@1.jpg" \\\n -F tune[images][1]="@2.jpg" \\\n -F tune[images][2]="@3.jpg" \\\n')),(0,i.kt)("p",null,"Next, create a FaceID fine-tune of the garment image. The image could be of a model wearing a garment, or it could be displayed on a mannequin, or it could simply be the garment laid out flatly. Let\u2019s try the last approach."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(4614).Z,title:"image_tooltip",width:"543",height:"662"})),(0,i.kt)("p",null,"While generating the FaceID for the sweater, it\u2019s important to mention the class name as either \u2018Garment\u2019 or \u2018Clothing\u2019, in case you have full body clothing like a dress or a swimsuit. If you want to just mask the upper body, for e.g. with shirts, t-shorts, tops, then use the class name \u2018Shirt\u2019. Similarly to mask the lower body use the class name \u2018Pant. This ensures that the tune preserves the appropriate part of the garment while generating the images."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(3061).Z,title:"image_tooltip",width:"893",height:"841"})),(0,i.kt)("p",null,"Let\u2019s try a basic prompt. Get the tune id of your FaceID tune: ",(0,i.kt)("inlineCode",{parentName:"p"},"<faceid:1328287:1.0>, "),"in our case."),(0,i.kt)("p",null,"Now let\u2019s go back to the finetune of our model (Gisele Bundchen) in the Tunes section."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(8132).Z,title:"image_tooltip",width:"1807",height:"584"})),(0,i.kt)("p",null,"We\u2019ll use the following prompt:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"}," Mid-shot of ohwx woman wearing a sweater\nnum_images=4\nnegative_prompt=\nseed=\nsteps=\ncfg_scale=\ncontrolnet=\ninput_image_url=\nmask_image_url=\ndenoising_strength=\ncontrolnet_conditioning_scale=\ncontrolnet_txt2img=false\nsuper_resolution=true\ninpaint_faces=true\nface_correct=false\nfilm_grain=false\nface_swap=true\nhires_fix=true\nbackend_version=1\nar=1:1\nscheduler=euler_a\ncolor_grading=\nuse_lpw=false\nw=512\nh=640\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(5955).Z,title:"image_tooltip",width:"394",height:"497"})),(0,i.kt)("p",null,"If we want more elements in the background, we can juice up the prompt in the following manner:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"}," A serene portrait of ohwx woman wearing a cozy sweater, standing amidst the lush green hills. The scene captures a tranquil afternoon with soft sunlight filtering through the clouds, highlighting her gentle smile and the vibrant colors of the landscape around her. The sweater is detailed, with visible textures of the knit fabric. The background features rolling hills and a clear blue sky, enhancing the peaceful ambiance.\nnum_images=4\nnegative_prompt=\nseed=\nsteps=\ncfg_scale=\ncontrolnet=\ninput_image_url=\nmask_image_url=\ndenoising_strength=\ncontrolnet_conditioning_scale=\ncontrolnet_txt2img=false\nsuper_resolution=true\ninpaint_faces=true\nface_correct=false\nfilm_grain=false\nface_swap=true\nhires_fix=true\nbackend_version=1\nar=1:1\nscheduler=euler_a\ncolor_grading=\nuse_lpw=false\nw=512\nh=640\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(6178).Z,title:"image_tooltip",width:"398",height:"495"})),(0,i.kt)("p",null,"Next, let\u2019s create a garment FaceID from the image of a person wearing it. Let\u2019s take this as our input image:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(1685).Z,title:"image_tooltip",width:"511",height:"753"})),(0,i.kt)("p",null,"Prompt:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"}," A professional studio portrait of a ohwx woman wearing a vibrant yellow top. The studio lighting is expertly arranged to cast dramatic yet flattering shadows and highlights, emphasizing the unique texture and style of the top. The model poses confidently, with a neutral background that enhances the striking color of her outfit. The image captures a high-fashion aesthetic, focusing on the elegant details of the clothing and the model's composed expression.\nnum_images=4\nnegative_prompt=\nseed=\nsteps=\ncfg_scale=\ncontrolnet=\ninput_image_url=\nmask_image_url=\ndenoising_strength=\ncontrolnet_conditioning_scale=\ncontrolnet_txt2img=false\nsuper_resolution=true\ninpaint_faces=true\nface_correct=false\nfilm_grain=false\nface_swap=true\nhires_fix=true\nbackend_version=1\nar=1:1\nscheduler=euler_a\ncolor_grading=\nuse_lpw=false\nw=512\nh=640\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(8981).Z,title:"image_tooltip",width:"797",height:"502"})),(0,i.kt)("p",null,"After this we\u2019ll try out Virtual Try-On on with swimwear. Input image:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(9525).Z,title:"image_tooltip",width:"483",height:"726"})),(0,i.kt)("p",null,"But this time, we also want to preserve the pose of the model in the input image. We can do so by enabling Img2Img while keeping the ControlNet Hint as \u2018Pose\u2019 for preserving the pose of our original model."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(1222).Z,title:"image_tooltip",width:"1148",height:"530"})),(0,i.kt)("p",null,"Prompt:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"}," ohwx woman wearing a swimsuit on a beach\nnum_images=4\nnegative_prompt=\nseed=\nsteps=\ncfg_scale=\ncontrolnet=pose\ninput_image_url=https://sdbooth2-production.s3.amazonaws.com/60vrd6qqb5jjcx6aj62cgw9jo8v8\nmask_image_url=\ndenoising_strength=\ncontrolnet_conditioning_scale=\ncontrolnet_txt2img=false\nsuper_resolution=true\ninpaint_faces=true\nface_correct=false\nfilm_grain=false\nface_swap=true\nhires_fix=true\nbackend_version=1\nar=1:1\nscheduler=euler_a\ncolor_grading=\nuse_lpw=false\nw=\nh=\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(5385).Z,title:"image_tooltip",width:"394",height:"590"})),(0,i.kt)("p",null,"Last, but not the least, is our favorite - replicating Virtual Try-On on from a mannequin!"),(0,i.kt)("p",null,"Here\u2019s the input image:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(6449).Z,title:"image_tooltip",width:"571",height:"822"})),(0,i.kt)("p",null,"Prompt:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"}," An elegant ohwx woman model walking down the runway in a stunning designer gown. The ramp is lit by sophisticated overhead lighting that casts a dramatic glow, highlighting the silhouette and textures of the gown. The audience is blurred in the background, focusing all attention on the model's dynamic pose and the breathtaking attire. The atmosphere is vibrant and glamorous, capturing the essence of high fashion.\nnum_images=4\nnegative_prompt=\nseed=\nsteps=\ncfg_scale=\ncontrolnet=\ninput_image_url=\nmask_image_url=\ndenoising_strength=\ncontrolnet_conditioning_scale=\ncontrolnet_txt2img=false\nsuper_resolution=true\ninpaint_faces=true\nface_correct=false\nfilm_grain=false\nface_swap=true\nhires_fix=true\nbackend_version=1\nar=1:1\nscheduler=euler_a\ncolor_grading=\nuse_lpw=false\nw=512\nh=640\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(2414).Z,title:"image_tooltip",width:"394",height:"491"})),(0,i.kt)("h1",{id:"final-words"},"Final Words"),(0,i.kt)("p",null,"Using Virtual Try-On with Astria is seamless and the results are nearly perfect. With minimal effort, any business can visualize different outfits on models or on their customers. The clothes fit perfectly and blend in accurately with the model they are simulated on."))}h.isMDXComponent=!0},4319:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image1-eef70ed3dc514b4595fa7b2e942c0c84.png"},6178:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image10-f54066357e1ac6f07d1328778aadfa56.png"},3365:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image11-9523915eb890fc2140e2ef4d82d7d321.png"},9525:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image12-95d009e76a3028c10e85a48869b30024.png"},1222:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image13-07e1cced7e57e854d6d9292d27e41e5f.png"},4543:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image14-3496c59c4d5e62a633d262973de5be15.png"},5955:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image15-378409677ac487bddd0762e59a2779e9.png"},1685:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image2-061a50a23be703545afb75ebb7eb49ff.png"},5385:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image3-6b0ee09b75fce89e5d91a094f378a479.png"},8132:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image4-3dad32f7579e7ecb54bb3100fbf1de70.png"},8981:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image5-e1c9a511f6888bb95b570f5f5e5b608c.png"},6449:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image6-3bc8f84802773f720c49a6bf35ff7560.png"},3061:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image7-cc351d483108fa63750ff4ff5ff611b0.png"},4614:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image8-b2eebd424c4f5f9e5836e0a2f603e9ad.png"},2414:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image9-d85e2e17b9b3643b7624dd24995c98ff.png"}}]); \ No newline at end of file diff --git a/assets/js/6f65f4bf.27b35a8f.js b/assets/js/6f65f4bf.27b35a8f.js new file mode 100644 index 0000000..28a2cd5 --- /dev/null +++ b/assets/js/6f65f4bf.27b35a8f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkastria_docs_2=self.webpackChunkastria_docs_2||[]).push([[195],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),g=i,m=p["".concat(l,".").concat(g)]||p[g]||h[g]||o;return n?a.createElement(m,r(r({ref:t},u),{},{components:n})):a.createElement(m,r({ref:t},u))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,r=new Array(o);r[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:i,r[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=n(7462),i=(n(7294),n(3905));const o={},r="Exploring Virtual Fashion: Garment Try-On with Astria",s={permalink:"/articles/virtual-tryon",source:"@site/blog/virtual-tryon.md",title:"Exploring Virtual Fashion: Garment Try-On with Astria",description:"Virtual try-on is a technology that lets you see how clothes, makeup, or accessories would look on a model or on a customer before purchase. Essentially, it allows you to simulate how garments look on people without the need for a traditional photoshoot. This helps in eliminating the complexities and expenses associated with physical photoshoots. It can also replicate the experience of trying things on in a store, but a customer can do it from the comfort of their own home using their phone or computer.",date:"2024-06-04T07:35:25.000Z",formattedDate:"June 4, 2024",tags:[],readingTime:5.09,hasTruncateMarker:!1,authors:[],frontMatter:{},nextItem:{title:"Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion",permalink:"/articles/real-estate"}},l={authorsImageUrls:[]},c=[{value:"Who Can Benefit from This Feature?",id:"who-can-benefit-from-this-feature",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...o}=e;return(0,i.kt)(p,(0,a.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"what-is-a-virtual-try-on"},"What Is a Virtual Try-On?"),(0,i.kt)("p",null,"Virtual try-on is a technology that lets you see how clothes, makeup, or accessories would look on a model or on a customer before purchase. Essentially, it allows you to simulate how garments look on people without the need for a traditional photoshoot. This helps in eliminating the complexities and expenses associated with physical photoshoots. It can also replicate the experience of trying things on in a store, but a customer can do it from the comfort of their own home using their phone or computer."),(0,i.kt)("p",null,"Virtual try-on is increasingly being used for a variety of products, including:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Clothing"),(0,i.kt)("li",{parentName:"ul"},"Makeup"),(0,i.kt)("li",{parentName:"ul"},"Glasses"),(0,i.kt)("li",{parentName:"ul"},"Jewelry"),(0,i.kt)("li",{parentName:"ul"},"Hats")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(4543).Z,title:"image_tooltip",width:"1052",height:"477"})),(0,i.kt)("h2",{id:"who-can-benefit-from-this-feature"},"Who Can Benefit from This Feature?"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"E-commerce companies")," can superimpose clothing on models or mannequins to create advertisements. This capability allows them to efficiently scale their operations by handling a large volume of images without the logistical challenges of traditional photoshoots."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Shoppers "),"can quickly see how clothes would look on them by simulating the garments on their own images. This enhances the shopping experience, increases customer satisfaction, and can lead to higher sales.")),(0,i.kt)("h1",{id:"steps-to-virtual-garment-try-on-with-astria"},"Steps to Virtual Garment Try-On with Astria"),(0,i.kt)("p",null,"Developers interested in integrating Virtual Try-On capabilities into their applications can seamlessly utilize the APIs provided by ",(0,i.kt)("a",{parentName:"p",href:"https://www.astria.ai"},"Astria"),"."),(0,i.kt)("p",null,"Here\u2019s what you need to do step-by-step."),(0,i.kt)("p",null,"First, create the fine-tune of a model."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(3365).Z,title:"image_tooltip",width:"885",height:"652"})),(0,i.kt)("p",null,"We\u2019ve used around 16 publicly available images of supermodel Gisele Bundchen, and created a fine-tune out of it."),(0,i.kt)("p",null,"Go to Tunes \u2192 New Fine Tune, and create a Checkpoint tune from the above images."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(4319).Z,title:"image_tooltip",width:"893",height:"828"})),(0,i.kt)("p",null,"You can also do it via the API as follows:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},'curl -X POST -H "Authorization: Bearer $API_KEY" https://api.astria.ai/tunes \\\n -F tune[title]="Gisele-Bundchen" \\\n -F tune[name]=man \\\n -F tune[branch]="fast" \\\n -F tune[callback]="https://optional-callback-url.com/webhooks/astria?user_id=1&tune_id=1" \\\n -F tune[base_tune_id]=690204 \\\n -F tune[token]=ohwx \\\n -F tune[prompts_attributes][0][callback]="https://optional-callback-url.com/webhooks/astria?user_id=1&prompt_id=1&tune_id=1" \\\n -F tune[images][0]="@1.jpg" \\\n -F tune[images][1]="@2.jpg" \\\n -F tune[images][2]="@3.jpg" \\\n')),(0,i.kt)("p",null,"Next, create a FaceID fine-tune of the garment image. The image could be of a model wearing a garment, or it could be displayed on a mannequin, or it could simply be the garment laid out flatly. Let\u2019s try the last approach."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(4614).Z,title:"image_tooltip",width:"543",height:"662"})),(0,i.kt)("p",null,"While generating the FaceID for the sweater, it\u2019s important to mention the class name as either \u2018Garment\u2019 or \u2018Clothing\u2019, in case you have full body clothing like a dress or a swimsuit. If you want to just mask the upper body, for e.g. with shirts, t-shorts, tops, then use the class name \u2018Shirt\u2019. Similarly to mask the lower body use the class name \u2018Pant. This ensures that the tune preserves the appropriate part of the garment while generating the images."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(3061).Z,title:"image_tooltip",width:"893",height:"841"})),(0,i.kt)("p",null,"Let\u2019s try a basic prompt. Get the tune id of your FaceID tune: ",(0,i.kt)("inlineCode",{parentName:"p"},"<faceid:1328287:1.0>, "),"in our case."),(0,i.kt)("p",null,"Now let\u2019s go back to the finetune of our model (Gisele Bundchen) in the Tunes section."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(8132).Z,title:"image_tooltip",width:"1807",height:"584"})),(0,i.kt)("p",null,"We\u2019ll use the following prompt:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"}," Mid-shot of ohwx woman wearing a sweater\nnum_images=4\nnegative_prompt=\nseed=\nsteps=\ncfg_scale=\ncontrolnet=\ninput_image_url=\nmask_image_url=\ndenoising_strength=\ncontrolnet_conditioning_scale=\ncontrolnet_txt2img=false\nsuper_resolution=true\ninpaint_faces=true\nface_correct=false\nfilm_grain=false\nface_swap=true\nhires_fix=true\nbackend_version=1\nar=1:1\nscheduler=euler_a\ncolor_grading=\nuse_lpw=false\nw=512\nh=640\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(5955).Z,title:"image_tooltip",width:"394",height:"497"})),(0,i.kt)("p",null,"If we want more elements in the background, we can juice up the prompt in the following manner:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"}," A serene portrait of ohwx woman wearing a cozy sweater, standing amidst the lush green hills. The scene captures a tranquil afternoon with soft sunlight filtering through the clouds, highlighting her gentle smile and the vibrant colors of the landscape around her. The sweater is detailed, with visible textures of the knit fabric. The background features rolling hills and a clear blue sky, enhancing the peaceful ambiance.\nnum_images=4\nnegative_prompt=\nseed=\nsteps=\ncfg_scale=\ncontrolnet=\ninput_image_url=\nmask_image_url=\ndenoising_strength=\ncontrolnet_conditioning_scale=\ncontrolnet_txt2img=false\nsuper_resolution=true\ninpaint_faces=true\nface_correct=false\nfilm_grain=false\nface_swap=true\nhires_fix=true\nbackend_version=1\nar=1:1\nscheduler=euler_a\ncolor_grading=\nuse_lpw=false\nw=512\nh=640\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(6178).Z,title:"image_tooltip",width:"398",height:"495"})),(0,i.kt)("p",null,"Next, let\u2019s create a garment FaceID from the image of a person wearing it. Let\u2019s take this as our input image:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(1685).Z,title:"image_tooltip",width:"511",height:"753"})),(0,i.kt)("p",null,"Prompt:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"}," A professional studio portrait of a ohwx woman wearing a vibrant yellow top. The studio lighting is expertly arranged to cast dramatic yet flattering shadows and highlights, emphasizing the unique texture and style of the top. The model poses confidently, with a neutral background that enhances the striking color of her outfit. The image captures a high-fashion aesthetic, focusing on the elegant details of the clothing and the model's composed expression.\nnum_images=4\nnegative_prompt=\nseed=\nsteps=\ncfg_scale=\ncontrolnet=\ninput_image_url=\nmask_image_url=\ndenoising_strength=\ncontrolnet_conditioning_scale=\ncontrolnet_txt2img=false\nsuper_resolution=true\ninpaint_faces=true\nface_correct=false\nfilm_grain=false\nface_swap=true\nhires_fix=true\nbackend_version=1\nar=1:1\nscheduler=euler_a\ncolor_grading=\nuse_lpw=false\nw=512\nh=640\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(8981).Z,title:"image_tooltip",width:"797",height:"502"})),(0,i.kt)("p",null,"After this we\u2019ll try out Virtual Try-On on with swimwear. Input image:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(9525).Z,title:"image_tooltip",width:"483",height:"726"})),(0,i.kt)("p",null,"But this time, we also want to preserve the pose of the model in the input image. We can do so by enabling Img2Img while keeping the ControlNet Hint as \u2018Pose\u2019 for preserving the pose of our original model."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(1222).Z,title:"image_tooltip",width:"1148",height:"530"})),(0,i.kt)("p",null,"Prompt:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"}," ohwx woman wearing a swimsuit on a beach\nnum_images=4\nnegative_prompt=\nseed=\nsteps=\ncfg_scale=\ncontrolnet=pose\ninput_image_url=https://sdbooth2-production.s3.amazonaws.com/60vrd6qqb5jjcx6aj62cgw9jo8v8\nmask_image_url=\ndenoising_strength=\ncontrolnet_conditioning_scale=\ncontrolnet_txt2img=false\nsuper_resolution=true\ninpaint_faces=true\nface_correct=false\nfilm_grain=false\nface_swap=true\nhires_fix=true\nbackend_version=1\nar=1:1\nscheduler=euler_a\ncolor_grading=\nuse_lpw=false\nw=\nh=\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(5385).Z,title:"image_tooltip",width:"394",height:"590"})),(0,i.kt)("p",null,"Last, but not the least, is our favorite - replicating Virtual Try-On on from a mannequin!"),(0,i.kt)("p",null,"Here\u2019s the input image:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(6449).Z,title:"image_tooltip",width:"571",height:"822"})),(0,i.kt)("p",null,"Prompt:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"}," An elegant ohwx woman model walking down the runway in a stunning designer gown. The ramp is lit by sophisticated overhead lighting that casts a dramatic glow, highlighting the silhouette and textures of the gown. The audience is blurred in the background, focusing all attention on the model's dynamic pose and the breathtaking attire. The atmosphere is vibrant and glamorous, capturing the essence of high fashion.\nnum_images=4\nnegative_prompt=\nseed=\nsteps=\ncfg_scale=\ncontrolnet=\ninput_image_url=\nmask_image_url=\ndenoising_strength=\ncontrolnet_conditioning_scale=\ncontrolnet_txt2img=false\nsuper_resolution=true\ninpaint_faces=true\nface_correct=false\nfilm_grain=false\nface_swap=true\nhires_fix=true\nbackend_version=1\nar=1:1\nscheduler=euler_a\ncolor_grading=\nuse_lpw=false\nw=512\nh=640\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"alt_text",src:n(2414).Z,title:"image_tooltip",width:"394",height:"491"})),(0,i.kt)("h1",{id:"final-words"},"Final Words"),(0,i.kt)("p",null,"Using Virtual Try-On with Astria is seamless and the results are nearly perfect. With minimal effort, any business can visualize different outfits on models or on their customers. The clothes fit perfectly and blend in accurately with the model they are simulated on."))}h.isMDXComponent=!0},4319:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image1-eef70ed3dc514b4595fa7b2e942c0c84.png"},6178:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image10-f54066357e1ac6f07d1328778aadfa56.png"},3365:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image11-9523915eb890fc2140e2ef4d82d7d321.png"},9525:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image12-95d009e76a3028c10e85a48869b30024.png"},1222:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image13-07e1cced7e57e854d6d9292d27e41e5f.png"},4543:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image14-3496c59c4d5e62a633d262973de5be15.png"},5955:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image15-378409677ac487bddd0762e59a2779e9.png"},1685:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image2-061a50a23be703545afb75ebb7eb49ff.png"},5385:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image3-6b0ee09b75fce89e5d91a094f378a479.png"},8132:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image4-3dad32f7579e7ecb54bb3100fbf1de70.png"},8981:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image5-e1c9a511f6888bb95b570f5f5e5b608c.png"},6449:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image6-3bc8f84802773f720c49a6bf35ff7560.png"},3061:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image7-cc351d483108fa63750ff4ff5ff611b0.png"},4614:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image8-b2eebd424c4f5f9e5836e0a2f603e9ad.png"},2414:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image9-d85e2e17b9b3643b7624dd24995c98ff.png"}}]); \ No newline at end of file diff --git a/assets/js/814f3328.55cefd46.js b/assets/js/814f3328.55cefd46.js new file mode 100644 index 0000000..515b015 --- /dev/null +++ b/assets/js/814f3328.55cefd46.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkastria_docs_2=self.webpackChunkastria_docs_2||[]).push([[535],{5641:t=>{t.exports=JSON.parse('{"title":"All our posts","items":[{"title":"Exploring Virtual Fashion: Garment Try-On with Astria","permalink":"/articles/virtual-tryon"},{"title":"Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion","permalink":"/articles/real-estate"},{"title":"Create Studio-Quality Custom Portraits Instantly with Astria\'s FaceID Tool","permalink":"/articles/face-id"},{"title":"Generate On-Brand Corporate Headshots in Minutes by Fine-Tuning Stable Diffusion Models on Astria.ai","permalink":"/articles/on-brand"},{"title":"How to Use Astria.ai\'s Multi-Pass Inference for Highly Controlled Stable Diffusion Image Generation","permalink":"/articles/multi-pass-inference"}]}')}}]); \ No newline at end of file diff --git a/assets/js/814f3328.5a99118c.js b/assets/js/814f3328.5a99118c.js deleted file mode 100644 index aa02fb6..0000000 --- a/assets/js/814f3328.5a99118c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkastria_docs_2=self.webpackChunkastria_docs_2||[]).push([[535],{5641:t=>{t.exports=JSON.parse('{"title":"All our posts","items":[{"title":"Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion","permalink":"/articles/real-estate"},{"title":"Create Studio-Quality Custom Portraits Instantly with Astria\'s FaceID Tool","permalink":"/articles/face-id"},{"title":"Generate On-Brand Corporate Headshots in Minutes by Fine-Tuning Stable Diffusion Models on Astria.ai","permalink":"/articles/on-brand"},{"title":"How to Use Astria.ai\'s Multi-Pass Inference for Highly Controlled Stable Diffusion Image Generation","permalink":"/articles/multi-pass-inference"}]}')}}]); \ No newline at end of file diff --git a/assets/js/90e7b1d0.20e358cf.js b/assets/js/90e7b1d0.f9072513.js similarity index 81% rename from assets/js/90e7b1d0.20e358cf.js rename to assets/js/90e7b1d0.f9072513.js index 70f66ba..e3abd51 100644 --- a/assets/js/90e7b1d0.20e358cf.js +++ b/assets/js/90e7b1d0.f9072513.js @@ -1 +1 @@ -"use strict";(self.webpackChunkastria_docs_2=self.webpackChunkastria_docs_2||[]).push([[321],{9264:a=>{a.exports=JSON.parse('{"permalink":"/articles/","page":1,"postsPerPage":10,"totalPages":1,"totalCount":4,"blogDescription":"Learn about fine-tuning and AI photography with consistent characters and high quality images.","blogTitle":"Blog"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkastria_docs_2=self.webpackChunkastria_docs_2||[]).push([[321],{9264:a=>{a.exports=JSON.parse('{"permalink":"/articles/","page":1,"postsPerPage":10,"totalPages":1,"totalCount":5,"blogDescription":"Learn about fine-tuning and AI photography with consistent characters and high quality images.","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/c85f55fc.375cc5b9.js b/assets/js/c85f55fc.375cc5b9.js new file mode 100644 index 0000000..bad8c77 --- /dev/null +++ b/assets/js/c85f55fc.375cc5b9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkastria_docs_2=self.webpackChunkastria_docs_2||[]).push([[339],{9888:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"/virtual-tryon","metadata":{"permalink":"/articles/virtual-tryon","source":"@site/blog/virtual-tryon.md","title":"Exploring Virtual Fashion: Garment Try-On with Astria","description":"Virtual try-on is a technology that lets you see how clothes, makeup, or accessories would look on a model or on a customer before purchase. Essentially, it allows you to simulate how garments look on people without the need for a traditional photoshoot. This helps in eliminating the complexities and expenses associated with physical photoshoots. It can also replicate the experience of trying things on in a store, but a customer can do it from the comfort of their own home using their phone or computer.","date":"2024-06-04T07:35:25.000Z","formattedDate":"June 4, 2024","tags":[],"readingTime":5.09,"hasTruncateMarker":false,"authors":[],"frontMatter":{},"nextItem":{"title":"Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion","permalink":"/articles/real-estate"}},"content":"# What Is a Virtual Try-On?\\n\\nVirtual try-on is a technology that lets you see how clothes, makeup, or accessories would look on a model or on a customer before purchase. Essentially, it allows you to simulate how garments look on people without the need for a traditional photoshoot. This helps in eliminating the complexities and expenses associated with physical photoshoots. It can also replicate the experience of trying things on in a store, but a customer can do it from the comfort of their own home using their phone or computer.\\n\\nVirtual try-on is increasingly being used for a variety of products, including:\\n\\n\\n\\n* Clothing\\n* Makeup\\n* Glasses\\n* Jewelry\\n* Hats\\n\\n\\n\\n\\n\\n![alt_text](virtual-tryon/image14.png \\"image_tooltip\\")\\n\\n\\n\\n## Who Can Benefit from This Feature?\\n\\n\\n\\n* **E-commerce companies** can superimpose clothing on models or mannequins to create advertisements. This capability allows them to efficiently scale their operations by handling a large volume of images without the logistical challenges of traditional photoshoots.\\n* **Shoppers **can quickly see how clothes would look on them by simulating the garments on their own images. This enhances the shopping experience, increases customer satisfaction, and can lead to higher sales.\\n\\n\\n# Steps to Virtual Garment Try-On with Astria\\n\\nDevelopers interested in integrating Virtual Try-On capabilities into their applications can seamlessly utilize the APIs provided by [Astria](https://www.astria.ai).\\n\\nHere\u2019s what you need to do step-by-step.\\n\\nFirst, create the fine-tune of a model.\\n\\n\\n![alt_text](virtual-tryon/image11.png \\"image_tooltip\\")\\n\\n\\nWe\u2019ve used around 16 publicly available images of supermodel Gisele Bundchen, and created a fine-tune out of it.\\n\\nGo to Tunes \u2192 New Fine Tune, and create a Checkpoint tune from the above images.\\n\\n\\n![alt_text](virtual-tryon/image1.png \\"image_tooltip\\")\\n\\n\\nYou can also do it via the API as follows:\\n\\n\\n```\\ncurl -X POST -H \\"Authorization: Bearer $API_KEY\\" https://api.astria.ai/tunes \\\\\\n -F tune[title]=\\"Gisele-Bundchen\\" \\\\\\n -F tune[name]=man \\\\\\n -F tune[branch]=\\"fast\\" \\\\\\n -F tune[callback]=\\"https://optional-callback-url.com/webhooks/astria?user_id=1&tune_id=1\\" \\\\\\n -F tune[base_tune_id]=690204 \\\\\\n -F tune[token]=ohwx \\\\\\n -F tune[prompts_attributes][0][callback]=\\"https://optional-callback-url.com/webhooks/astria?user_id=1&prompt_id=1&tune_id=1\\" \\\\\\n -F tune[images][0]=\\"@1.jpg\\" \\\\\\n -F tune[images][1]=\\"@2.jpg\\" \\\\\\n -F tune[images][2]=\\"@3.jpg\\" \\\\\\n```\\n\\n\\nNext, create a FaceID fine-tune of the garment image. The image could be of a model wearing a garment, or it could be displayed on a mannequin, or it could simply be the garment laid out flatly. Let\u2019s try the last approach.\\n\\n\\n\\n\\n![alt_text](virtual-tryon/image8.png \\"image_tooltip\\")\\n\\n\\nWhile generating the FaceID for the sweater, it\u2019s important to mention the class name as either \u2018Garment\u2019 or \u2018Clothing\u2019, in case you have full body clothing like a dress or a swimsuit. If you want to just mask the upper body, for e.g. with shirts, t-shorts, tops, then use the class name \u2018Shirt\u2019. Similarly to mask the lower body use the class name \u2018Pant. This ensures that the tune preserves the appropriate part of the garment while generating the images.\\n\\n\\n![alt_text](virtual-tryon/image7.png \\"image_tooltip\\")\\n\\n\\nLet\u2019s try a basic prompt. Get the tune id of your FaceID tune: `<faceid:1328287:1.0>, `in our case.\\n\\n\\n\\nNow let\u2019s go back to the finetune of our model (Gisele Bundchen) in the Tunes section.\\n\\n\\n![alt_text](virtual-tryon/image4.png \\"image_tooltip\\")\\n\\n\\nWe\u2019ll use the following prompt:\\n\\n\\n```\\n Mid-shot of ohwx woman wearing a sweater\\nnum_images=4\\nnegative_prompt=\\nseed=\\nsteps=\\ncfg_scale=\\ncontrolnet=\\ninput_image_url=\\nmask_image_url=\\ndenoising_strength=\\ncontrolnet_conditioning_scale=\\ncontrolnet_txt2img=false\\nsuper_resolution=true\\ninpaint_faces=true\\nface_correct=false\\nfilm_grain=false\\nface_swap=true\\nhires_fix=true\\nbackend_version=1\\nar=1:1\\nscheduler=euler_a\\ncolor_grading=\\nuse_lpw=false\\nw=512\\nh=640\\n```\\n\\n\\n![alt_text](virtual-tryon/image15.png \\"image_tooltip\\")\\n\\n\\nIf we want more elements in the background, we can juice up the prompt in the following manner:\\n\\n\\n```\\n A serene portrait of ohwx woman wearing a cozy sweater, standing amidst the lush green hills. The scene captures a tranquil afternoon with soft sunlight filtering through the clouds, highlighting her gentle smile and the vibrant colors of the landscape around her. The sweater is detailed, with visible textures of the knit fabric. The background features rolling hills and a clear blue sky, enhancing the peaceful ambiance.\\nnum_images=4\\nnegative_prompt=\\nseed=\\nsteps=\\ncfg_scale=\\ncontrolnet=\\ninput_image_url=\\nmask_image_url=\\ndenoising_strength=\\ncontrolnet_conditioning_scale=\\ncontrolnet_txt2img=false\\nsuper_resolution=true\\ninpaint_faces=true\\nface_correct=false\\nfilm_grain=false\\nface_swap=true\\nhires_fix=true\\nbackend_version=1\\nar=1:1\\nscheduler=euler_a\\ncolor_grading=\\nuse_lpw=false\\nw=512\\nh=640\\n```\\n\\n\\n\\n\\n![alt_text](virtual-tryon/image10.png \\"image_tooltip\\")\\n\\n\\nNext, let\u2019s create a garment FaceID from the image of a person wearing it. Let\u2019s take this as our input image:\\n\\n![alt_text](virtual-tryon/image2.png \\"image_tooltip\\")\\n\\n\\nPrompt:\\n\\n\\n```\\n A professional studio portrait of a ohwx woman wearing a vibrant yellow top. The studio lighting is expertly arranged to cast dramatic yet flattering shadows and highlights, emphasizing the unique texture and style of the top. The model poses confidently, with a neutral background that enhances the striking color of her outfit. The image captures a high-fashion aesthetic, focusing on the elegant details of the clothing and the model\'s composed expression.\\nnum_images=4\\nnegative_prompt=\\nseed=\\nsteps=\\ncfg_scale=\\ncontrolnet=\\ninput_image_url=\\nmask_image_url=\\ndenoising_strength=\\ncontrolnet_conditioning_scale=\\ncontrolnet_txt2img=false\\nsuper_resolution=true\\ninpaint_faces=true\\nface_correct=false\\nfilm_grain=false\\nface_swap=true\\nhires_fix=true\\nbackend_version=1\\nar=1:1\\nscheduler=euler_a\\ncolor_grading=\\nuse_lpw=false\\nw=512\\nh=640\\n```\\n\\n\\n![alt_text](virtual-tryon/image5.png \\"image_tooltip\\")\\n\\n\\nAfter this we\u2019ll try out Virtual Try-On on with swimwear. Input image:\\n\\n\\n![alt_text](virtual-tryon/image12.png \\"image_tooltip\\")\\n\\n\\nBut this time, we also want to preserve the pose of the model in the input image. We can do so by enabling Img2Img while keeping the ControlNet Hint as \u2018Pose\u2019 for preserving the pose of our original model.\\n\\n![alt_text](virtual-tryon/image13.png \\"image_tooltip\\")\\n\\n\\nPrompt:\\n\\n\\n```\\n ohwx woman wearing a swimsuit on a beach\\nnum_images=4\\nnegative_prompt=\\nseed=\\nsteps=\\ncfg_scale=\\ncontrolnet=pose\\ninput_image_url=https://sdbooth2-production.s3.amazonaws.com/60vrd6qqb5jjcx6aj62cgw9jo8v8\\nmask_image_url=\\ndenoising_strength=\\ncontrolnet_conditioning_scale=\\ncontrolnet_txt2img=false\\nsuper_resolution=true\\ninpaint_faces=true\\nface_correct=false\\nfilm_grain=false\\nface_swap=true\\nhires_fix=true\\nbackend_version=1\\nar=1:1\\nscheduler=euler_a\\ncolor_grading=\\nuse_lpw=false\\nw=\\nh=\\n```\\n\\n\\n![alt_text](virtual-tryon/image3.png \\"image_tooltip\\")\\n\\n\\nLast, but not the least, is our favorite - replicating Virtual Try-On on from a mannequin!\\n\\nHere\u2019s the input image:\\n\\n![alt_text](virtual-tryon/image6.png \\"image_tooltip\\")\\n\\n\\nPrompt:\\n\\n\\n```\\n An elegant ohwx woman model walking down the runway in a stunning designer gown. The ramp is lit by sophisticated overhead lighting that casts a dramatic glow, highlighting the silhouette and textures of the gown. The audience is blurred in the background, focusing all attention on the model\'s dynamic pose and the breathtaking attire. The atmosphere is vibrant and glamorous, capturing the essence of high fashion.\\nnum_images=4\\nnegative_prompt=\\nseed=\\nsteps=\\ncfg_scale=\\ncontrolnet=\\ninput_image_url=\\nmask_image_url=\\ndenoising_strength=\\ncontrolnet_conditioning_scale=\\ncontrolnet_txt2img=false\\nsuper_resolution=true\\ninpaint_faces=true\\nface_correct=false\\nfilm_grain=false\\nface_swap=true\\nhires_fix=true\\nbackend_version=1\\nar=1:1\\nscheduler=euler_a\\ncolor_grading=\\nuse_lpw=false\\nw=512\\nh=640\\n```\\n\\n![alt_text](virtual-tryon/image9.png \\"image_tooltip\\")\\n\\n\\n\\n# Final Words\\n\\nUsing Virtual Try-On with Astria is seamless and the results are nearly perfect. With minimal effort, any business can visualize different outfits on models or on their customers. The clothes fit perfectly and blend in accurately with the model they are simulated on."},{"id":"/real-estate","metadata":{"permalink":"/articles/real-estate","source":"@site/blog/real-estate.md","title":"Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion","description":"Virtual staging is the process of digitally adding furniture, decor, and other elements to photos of empty or sparsely furnished spaces. Along with Stable Diffusion, it can significantly improve real estate listings by creating realistic and attractive virtual staging.","date":"2024-04-24T16:27:48.000Z","formattedDate":"April 24, 2024","tags":[],"readingTime":6.015,"hasTruncateMarker":false,"authors":[],"frontMatter":{},"prevItem":{"title":"Exploring Virtual Fashion: Garment Try-On with Astria","permalink":"/articles/virtual-tryon"},"nextItem":{"title":"Create Studio-Quality Custom Portraits Instantly with Astria\'s FaceID Tool","permalink":"/articles/face-id"}},"content":"Virtual staging is the process of digitally adding furniture, decor, and other elements to photos of empty or sparsely furnished spaces. Along with Stable Diffusion, it can significantly improve real estate listings by creating realistic and attractive virtual staging.\\n\\nDigital staging transforms cold, empty rooms into warm, inviting spaces that help buyers emotionally connect with a property. A 2023 report by Realtor.com found that staged homes sell 88% faster and for an average of 20% more than non-staged homes.\\n\\n\\n# Why Virtual Staging Is Needed\\n\\n\\n\\n* Empty spaces lack appeal: Unfurnished rooms can appear cold and uninviting, making it difficult for potential buyers to visualize themselves living in the space.\\n* Traditional staging is expensive: Physically staging a property requires furniture rentals, which can be costly and time-consuming.\\n* Showcases potential: Virtual staging allows showcasing a space\'s full potential. Buyers can see how furniture can be arranged and how the space can function for their needs.\\n\\n\\n# Advantages of Using Astria.ai for Virtual Staging\\n\\nThe advantages of using Astria.ai for virtual staging are many:\\n\\n\\n\\n* Cost-Effective: Compared to traditional staging, Astria offers a much more affordable way to virtually stage a property.\\n* Speed and Efficiency: Astria can generate virtual staging variations in minutes, allowing realtors to experiment with different styles and layouts.\\n* Customization: With clear prompts and descriptions, it can create virtual staging that reflects the property\'s style, target demographic, and current design trends.\\n\\nAstria.ai simplifies virtual staging by harnessing cutting-edge AI technology, making it effortless to digitally stage listings with realistic results. Here\'s how Astria.ai achieves this:\\n\\n\\n\\n1. Controlnets: Users input text descriptions to control the composition, style, and content of the staged photo.\\n2. MLSD (Multi-Level Scene Description): Breaks down a room into its components, ensuring realistic staging.\\n3. Compositional Understanding: AI arranges furniture and decor based on interior design principles.\\n4. Backend Version-1: Proprietary machine learning infrastructure enables fast, high-quality staging.\\n\\nBackend Version-1 improvements include:\\n\\n\\n\\n* Hi-Res (Super-Resolution Details) for sharper images.\\n* Faster processing times.\\n* Better handling of multiple LoRAs.\\n* Improved results with DPM++/Karras and DPM++SDE/Karras samplers.\\n\\nMulti-Controlnet, available only for Backend Version-1, combines multiple Controlnets for better consistency and precision.\\n\\n\\n# How to Use Astria.ai\\n\\n\\n\\n1. Sign up at Astria.ai.\\n2. Go to [https://www.astria.ai/prompts](https://www.astria.ai/prompts).\\n3. Select Advanced and ControlNet/Img2Img Option.\\n\\n\\n\\n![alt_text](real-estate/image3.png \\"image_tooltip\\")\\n\\n\\n\\n\\n4. Upload your image using Choose File.\\n5. Select 1 - BETA under Backend version.\\n6. Write out a description under Detailed Description and add \u201c-- controlnets MLSD\u201d at the end of it. --controlnet_weights 0.5 gives the best results.\\n7. Also use --mask_prompt windows door --mask_invert, to make sure that the windows and the doors are preserved from the original image.\\n8. Additionally you can add a few Loras as suggested in the docs [here ](https://docs.astria.ai/docs/use-cases/room-redesign)to improve the overall quality of the image.\\n9. Click Create Image.\\n\\n\\n# Easy Hacks to Enhance Your Listings\\n\\n\\n\\n1. Gather High-Quality Photos: The process works best with clear and well-lit photos of the empty rooms.\\n2. Define the Virtual Staging Style: Consider the property\'s target audience and the overall feel you want to create (modern, traditional, family-friendly etc.).\\n3. Craft Text Prompts: Provide detailed descriptions of the desired furniture, decor, and overall ambiance.\\n4. Generate Variations: You can generate multiple virtual staging options to choose from, allowing for A/B testing to see which resonates best with potential buyers.\\n5. Refine and Integrate: Minor adjustments might be needed to ensure a seamless integration of the virtual staging with the original photo.\\n\\n\\n# Virtual Staging Applications on Astria.ai\\n\\nIn this section, let\u2019s look at how you can actually use Astria to transform empty spaces into vibrant, inviting rooms.\\n\\nSee below:\\n\\n**Original Image => AI Generated Image by Astria.ai**\\n\\n```text\\nA serene and opulent private bedroom, featuring a plush king-size bed with a tufted velvet headboard and a delicate crystal chandelier above, surrounded by richly textured walls in a soothing gray tone, and a lavish area rug in a soft, creamy color, with a comfortable reading nook by the window, complete with a oversized armchair and a matching ottoman, and a spacious walk-in closet with custom cabinetry and a marble-topped dresser, all bathed in a warm, golden light, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\\n```\\n\\n\\n\\n \\n \\n \\n \\n
\\n\\n![image](real-estate/image7.png)\\n\\n\\n\\n![image](real-estate/image4.png)\\n\\n
\\n\\n\\n\\n```text\\nA modern office room with a minimalist aesthetic, featuring a sleek wooden desk with a silver laptop and a ergonomic chair, surrounded by floor-to-ceiling windows with a cityscape view, and a few potted plants on a shelf, with walls lined with tall cabinets filled with neatly organized books and files, and a subtle warm lighting and a hint of natural light, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\\n```\\n\\n\\n\\n \\n \\n \\n \\n
\\n\\n![image](real-estate/image13.png)\\n\\n\\n\\n![image](real-estate/image5.png)\\n\\n
\\n\\n\\n\\nA contemporary office space with an industrial chic vibe, featuring a reclaimed wood desk with a vintage-inspired lamp and a worn leather office chair, surrounded by exposed brick walls and polished concrete floors, with a floor-to-ceiling metal shelving unit filled with vintage books and decorative objects, and a large glass door leading to a private outdoor patio with a city view, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\\n\\n\\n\\n \\n \\n \\n \\n
\\n\\n![image](real-estate/image1.png)\\n\\n\\n\\n![image](real-estate/image10.png)\\n\\n
\\n\\n\\n```text\\nA sleek and modern home gym, featuring a spacious open floor plan with high ceilings and large windows allowing for natural light, equipped with a variety of high-end exercise equipment including a treadmill, stationary bike, and free weights, surrounded by mirrored walls and a polished wood floor, with a comfortable seating area for relaxation and a large flat-screen TV for entertainment, and a modern sound system for an immersive workout experience, in a 3D rendering style\\n```\\n\\n\\n\\n\\n \\n \\n \\n \\n
\\n\\n![image](real-estate/image9.png)\\n\\n\\n\\n![image](real-estate/image8.png)\\n\\n
\\n\\n\\n```text\\nCoastal-themed nursery: an empty room staged as a serene coastal-themed nursery with a white crib, soft blue accents, shiplap wall, and nautical decor elements \u2013 controlnets MLSD Composition\\n```\\n\\n\\n\\n\\n \\n \\n \\n \\n
\\n\\n![image](real-estate/image2.png)\\n\\n\\n\\n![image](real-estate/image11.png)\\n\\n
\\n\\n\\n```text\\nA peaceful and calming meditation room, featuring a serene and minimalist space with a focus on natural materials and textures, including a reclaimed wood floor, a stone feature wall, and a live edge wooden meditation bench, surrounded by floor-to-ceiling windows allowing for an abundance of natural light and a connection to nature, with a few carefully placed plants and a subtle water feature creating a sense of tranquility, and a soft, warm glow emanating from candles or string lights, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\\n```\\n\\n\\n\\n \\n \\n \\n \\n
\\n\\n![image](real-estate/image6.png)\\n\\n\\n\\n![image](real-estate/image12.png)\\n\\n
\\n\\n\\n\\nHere are the original images sources:\\n\\n[https://newyork.craigslist.org/brk/apa/d/brooklyn-expansive-loft-in-bushwick/7731612663.html](https://newyork.craigslist.org/brk/apa/d/brooklyn-expansive-loft-in-bushwick/7731612663.html)\\n\\n[https://newyork.craigslist.org/brk/apa/d/brooklyn-below-market-basic-bedroom/7731562165.html](https://newyork.craigslist.org/brk/apa/d/brooklyn-below-market-basic-bedroom/7731562165.html)\\n\\n[https://newyork.craigslist.org/mnh/apa/d/new-york-bright-corner-studio-laundry/7731512365.html](https://newyork.craigslist.org/mnh/apa/d/new-york-bright-corner-studio-laundry/7731512365.html)\\n\\n[https://newyork.craigslist.org/brk/apa/d/brooklyn-bed-in-williamsburg-no-fee/7731545442.html](https://newyork.craigslist.org/brk/apa/d/brooklyn-bed-in-williamsburg-no-fee/7731545442.html)\\n\\n[https://hudsonvalley.craigslist.org/apa/d/pearl-river-pearl-river-jewel-1br/7733791169.html](https://hudsonvalley.craigslist.org/apa/d/pearl-river-pearl-river-jewel-1br/7733791169.html)\\n\\n[https://slowmotionmama.com/7-reasons-to-empty-a-space-before-decluttering/](https://slowmotionmama.com/7-reasons-to-empty-a-space-before-decluttering/)\\n\\n\\n# To Summarize\\n\\nThe benefits of AI virtual staging are many: accelerated sales, increased property values, and a streamlined marketing experience.\\n\\nThings to remember:\\n\\n\\n\\n* Maintain Realism: While this AI tool is powerful, it\'s crucial to ensure the generated virtual staging looks realistic and avoids nonsensical elements.\\n* Transparency: You may choose to disclose that virtual staging is used in the listing description to build trust with potential buyers."},{"id":"/face-id","metadata":{"permalink":"/articles/face-id","source":"@site/blog/face-id.md","title":"Create Studio-Quality Custom Portraits Instantly with Astria\'s FaceID Tool","description":"You can now generate instant custom headshot photos for professional use in just a few clicks.","date":"2024-04-04T08:12:54.000Z","formattedDate":"April 4, 2024","tags":[],"readingTime":6.89,"hasTruncateMarker":false,"authors":[],"frontMatter":{},"prevItem":{"title":"Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion","permalink":"/articles/real-estate"},"nextItem":{"title":"Generate On-Brand Corporate Headshots in Minutes by Fine-Tuning Stable Diffusion Models on Astria.ai","permalink":"/articles/on-brand"}},"content":"You can now generate instant custom headshot photos for professional use in just a few clicks.\\n\\nSeveral industries could benefit from it. Here are some key ones:\\n\\n**1. Online Platforms & Gig Economy:**\\n\\n\\n\\n* Freelancers and independent contractors on platforms like Upwork or Fiverr need professional headshots for their profiles to appear credible and attract clients.\\n* People signing up for ride-sharing services like Uber or Lyft often require profile pictures that meet platform guidelines.\\n\\n**2. Remote Work & Video Conferencing:**\\n\\n\\n\\n* With the rise of remote work, employees need professional headshots for video conferencing platforms like Zoom or Google Meet.\\n* Many companies request profile pictures for internal directories.\\n\\n**3. Events & Conferences:**\\n\\n\\n\\n* Attendees at conferences or trade shows might need quick headshots for badges or presentations.\\n* Event organizers may require speaker headshots for promotional materials.\\n\\n**4. Retail & Hospitality:**\\n\\n\\n\\n* Retailers or restaurants can use headshot generators for employee name tags or online staff directories.\\n\\n**5. Education & Training:**\\n\\n\\n\\n* Online courses or educational platforms can benefit from student profile pictures.\\n* Professional development programs often require headshots for certificates or online profiles.\\n\\n**6. Media & Marketing:**\\n\\n\\n\\n* Content creators or bloggers frequently need quick headshots for social media profiles or website bios.\\n* Marketing agencies can use headshot generators for clients who need profile pictures on short notice.\\n\\nSo how do we at Astria.ai come in?\\n\\n\\n# Astria\u2019s FaceID Feature for Instant Fine-tuning\\n\\nWith our FaceID tool, you can instantly fine-tune your images while preserving identity in a matter of seconds. All you need is just one photograph.\\n\\n\\n\\n![alt_text](face-id/image4.png \\"image_tooltip\\")\\n\\n\\nThis feature comes in very handy if you need to generate images quickly and efficiently \u2013 such as if you\u2019re offering a free-tier service in a user app and need profile images to be generated in a jiffy. It can also be applied in real-time applications like live-streaming or virtual try-ons.\\n\\nIn e-commerce applications, instant fine-tuning can be a game-changer as it allows users to visualize products with their own images seamlessly, enhancing the shopping experience and boosting conversion rates. In the gaming industry, instant fine-tuning can be used to create personalized gaming avatars or characters that resemble the user, thereby increasing immersion and emotional connection with the game. Additionally, social media platforms could use the FaceID feature to offer instant filters and lenses, letting users create and share more personalized content with their friends and followers.\\n\\nJust one point to remember: the adapter was trained on human faces, so best not to try faces of your pets or other subjects at the moment. A few other points to note:\\n\\n\\n\\n* FaceID can work with [Face Swap](https://docs.astria.ai/docs/features/face-swap) to improve similarity. Disable Face Swap in case your prompt is animation style.\\n* For fast generation, use [LCM schedulers](https://docs.astria.ai/docs/features/lcm).\\n* For realistic images, enable Face-Correct to improve the facial features.\\n\\n\\n# FaceID vs Full Fine-Tuning\\n\\nAstria offers full fine-tuning tools using the [Dreambooth](https://huggingface.co/docs/diffusers/en/training/dreambooth) API. This is a technique that updates the entire Stable Diffusion model by training on just a few images of a subject or style. This is a pretty efficient way of fine-tuning as it allows for the generation of realistic and diverse images of the specific subjects or concepts.\\n\\nApart from this, Astria also has the option of LoRA fine-tuning. In this technique, instead of fine-tuning the entire model, a low-rank adapter layer is inserted into the model architecture. This reduces the computational time and storage requirements leading to a lower cost of fine-tuning.\\n\\nBoth the techniques above are well suited for high fidelity on identity preservation of the subject images, but they take around 5-10 minutes for process completion and, therefore, we have FaceID for instant results.\\n\\nFaceID does not involve training of the model at all. Under the hood it only calculates and retains the embeddings of the training images, and then reproduces these embeddings during inference. This way the Stable Diffusion model doesn\u2019t have to go through any changes in its weights, and that\u2019s why the fine-tuning process is so rapid. It takes less than 10 seconds for a FaceID based fine-tune to be created.\\n\\n\\n# Guide to Using FaceID on Astria.ai\\n\\nAs mentioned before, the FaceID fine-tune can be done with just one image. But, for the sake of fidelity, we\u2019ve taken 3 images of a model from [Unsplash](https://unsplash.com). Here are the input images:\\n\\n\\n\\n![alt_text](face-id/image2.png \\"image_tooltip\\")\\n\\n\\nNow head over to the [New Finetune](https://www.astria.ai/tunes/new) section.\\n\\n\\n![alt_text](face-id/image3.png \\"image_tooltip\\")\\n\\n\\nUnder the Advanced features, select the Model type as FaceID. Remember to provide the Class name (woman, in this case).\\n\\nYour tune will be ready in a matter of seconds.\\n\\nHere\u2019s the API to create the tune:\\n\\n\\n```bash\\ncurl -X POST -H \\"Authorization: Bearer $API_KEY\\" https://api.astria.ai/tunes \\\\\\n -F tune[title]=\\"Unsplash Model Female - 1\\" \\\\\\n -F tune[name]=woman \\\\\\n -F tune[base_tune_id]=690204 \\\\\\n -F tune[images][0]=\\"@1.jpg\\" \\\\\\n -F tune[images][1]=\\"@2.jpg\\" \\\\\\n -F tune[images][2]=\\"@3.jpg\\" \\\\\\n```\\n\\n\\nBase_tune_id = 69024 refers to the Realistic Vision V5.1 (VAE) model that we used as the base model. You can check out the list of available models [here](https://www.astria.ai/gallery/tunes).\\n\\n\\n\\n![alt_text](face-id/image7.png \\"image_tooltip\\")\\n\\n\\nLet\u2019s start prompting with some real-life use cases, where instant headshot generation would be useful.\\n\\n\\n## Use-Case 1: Professional Networking\\n\\n```\\nPrompt: A professional headshot of a female software engineer, wearing a blue blazer, with a friendly smile and confident gaze, studio lighting, high-resolution, 8k, sharp focus, Nikon D850, 85mm lens, f/1.8, 1/200s, ISO 100 <faceid:1155049:1.0> **(replace this with the faceid number of your tune**)\\n\\nNegative Prompt: unprofessional, casual, blurry, low-resolution, poor lighting, unflattering angles, awkward pose, unfriendly expression, distracting background, snapshot, amateur, overexposed, underexposed, harsh shadows, uneven skin tone\\n```\\n\\nAPI to create the prompt:\\n\\n\\n```bash\\ncurl -X POST -H \\"Authorization: Bearer $API_KEY\\" https://api.astria.ai/tunes/1155049/prompts \\\\\\n -F prompt[text]=\\"A professional headshot of a female software engineer, wearing a blue blazer, with a friendly smile and confident gaze, studio lighting, high-resolution, 8k, sharp focus, Nikon D850, 85mm lens, f/1.8, 1/200s, ISO 100 \\" \\\\\\n -F prompt[negative_prompt]=\\"unprofessional, casual, blurry, low-resolution, poor lighting, unflattering angles, awkward pose, unfriendly expression, distracting background, snapshot, amateur, overexposed, underexposed, harsh shadows, uneven skin tone\\" \\\\\\n -F prompt[super_resolution]=true \\\\\\n -F prompt[face_correct]=true \\\\\\n```\\n\\n\\nNote the number 1155049 refers to the tune number. Replace it with the tune number of your own fine-tune.\\n\\n\\n![alt_text](face-id/image1.png \\"image_tooltip\\")\\n\\n\\n\\n## Use-Case 2: Fitness & Wellness Coach\\n\\n```\\nPrompt: A vibrant and inspiring headshot of a fitness coach, wearing a bright green athletic top, with an energetic smile and motivated expression, outdoor natural lighting, high-resolution, 8k, sharp focus, Nikon Z7 II, 85mm lens, f/2.8, 1/200s, ISO 200, vivid color palette, blurred park background, sun flare<faceid:1155049:1.0>\\n\\nNegative: unhealthy, unmotivated, low-energy, poorly lit, low-quality, blurry, awkward pose, unflattering angles, harsh shadows, distracting background, snapshot, amateur, overexposed, underexposed, uneven skin tone, no retouching, no visible workout equipment\\n```\\n\\n![alt_text](face-id/image6.png \\"image_tooltip\\")\\n\\n\\n\\n## Use-Case 3: Social Media and Marketing Influencer\\n\\n```\\nPrompt: A vibrant and engaging headshot of a female fashion influencer, wearing a stylish red dress, with a charming smile and confident pose, golden hour lighting, high-resolution, 8k, sharp focus, Canon EOS R5, 50mm lens, f/1.4, 1/160s, ISO 100, cinematic color grading, bokeh background <faceid:1155049:1.0>\\n\\nNegative: unfashionable, poorly lit, low-quality, blurry, awkward pose, unflattering angles, dull colors, flat lighting, distracting background, snapshot, amateur, overexposed, underexposed, harsh shadows, uneven skin tone, no makeup, no retouching\\n```\\n\\n\\n![alt_text](face-id/image5.png \\"image_tooltip\\")\\n\\n\\n\\n## Use-Case 4: Educational Platform & Online Learning\\n\\n```\\nPrompt: A friendly and approachable headshot of a female history professor, wearing a navy blue sweater, with a warm smile and inviting gaze, soft natural lighting, high-resolution, 8k, sharp focus, Sony A7R IV, 85mm lens, f/2.8, 1/125s, ISO 200, neutral color palette, clean background<faceid:1155049:1.0>\\n\\nNegative: intimidating, unapproachable, unprofessional, poorly lit, low-quality, blurry, awkward pose, unflattering angles, harsh shadows, distracting background, snapshot, amateur, overexposed, underexposed, uneven skin tone, no retouching\\n```\\n\\n\\n![alt_text](face-id/image8.png \\"image_tooltip\\")\\n\\n\\n\\n# Why Implement Astria\u2019s FaceID in Your Tech Stack\\n\\nBy implementing FaceID in your tech stack, you unlock the power of real-time, high-quality image generation. Consider the possibilities:\\n\\n\\n\\n1. Professional Networking\\n2. Social Media and Influencer Marketing\\n3. Educational Platforms\\n4. Fitness and Wellness Apps\\n5. Event Apps\\n6. E-commerce Apps\\n7. Free-Tier Services\\n\\nIntegrating FaceID into your application is a straightforward process, thanks to Astria.ai\u2019s developer-friendly [API](https://docs.astria.ai/docs/category/api). With just a few lines of code, you can integrate the feature into your tech stack, letting your users generate portraits with minimal waiting time."},{"id":"/on-brand","metadata":{"permalink":"/articles/on-brand","source":"@site/blog/on-brand.md","title":"Generate On-Brand Corporate Headshots in Minutes by Fine-Tuning Stable Diffusion Models on Astria.ai","description":"Today, we\u2019ll demonstrate how you can generate on-brand corporate headshots of yourself, your colleagues and clients using Astria.ai. You no longer need to dress up and conduct photoshoots; we can help you create professional-looking photos for your website, newsletter, PR, social media, and more simply with the help of a few prompts.","date":"2024-03-26T13:25:58.000Z","formattedDate":"March 26, 2024","tags":[],"readingTime":11.745,"hasTruncateMarker":false,"authors":[],"frontMatter":{},"prevItem":{"title":"Create Studio-Quality Custom Portraits Instantly with Astria\'s FaceID Tool","permalink":"/articles/face-id"},"nextItem":{"title":"How to Use Astria.ai\'s Multi-Pass Inference for Highly Controlled Stable Diffusion Image Generation","permalink":"/articles/multi-pass-inference"}},"content":"Today, we\u2019ll demonstrate how you can generate on-brand corporate headshots of yourself, your colleagues and clients using Astria.ai. You no longer need to dress up and conduct photoshoots; we can help you create professional-looking photos for your website, newsletter, PR, social media, and more simply with the help of a few prompts.\\r\\n\\r\\n\\r\\n# Why Are On-Brand Photographs Necessary?\\r\\n\\r\\nOn-brand photographs are important because they visually communicate a brand\'s identity and values. Companies benefit from professional headshots for several reasons:\\r\\n\\r\\n\\r\\n\\r\\n* **Projecting a Professional Image:** A polished headshot makes a strong first impression. It shows clients and potential customers that the company takes itself seriously and is invested in presenting a professional image.\\r\\n* **Building Trust and Credibility:** Seeing the faces of the people behind the company helps build trust and credibility. Potential clients feel more comfortable doing business with a company that has a human face.\\r\\n* **Enhancing Your Brand:** Headshots can be used on a company website, social media platforms, and marketing materials. Consistent, high-quality headshots contribute to a company\'s overall brand identity.\\r\\n* **Recruiting Talent:** Professional headshots on a careers page can attract qualified candidates. It shows potential employees that the company is professional and cares about its image.\\r\\n* **Boosting Employee Morale:** Investing in professional headshots can boost employee morale. It shows that the company values its employees and wants to present them in the best light.\\r\\n\\r\\n_Off-Brand Photos vs. On-Brand Photos_\\r\\n\\r\\n\\r\\n\\r\\n* **Off-brand:** Poor lighting, unprofessional attire, cluttered backgrounds, or generic stock photos that don\'t reflect the company\'s unique style.\\r\\n* **On-brand:** Photos that use the company\'s color palette, incorporate the logo subtly, and look formal in a setting that reflects the company culture (casual startup vs. traditional office).\\r\\n\\r\\nThink of on-brand photos as the building blocks of your company\'s visual story. They shape how the world perceives you, your work, and your brand\u2019s values.\\r\\n\\r\\nThe following are examples of off-brand images: walking in the park, listening to music, playing ukulele, or reading a book.\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![A woman walking in a park](on-brand/image6.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![A man listening to music in a park](on-brand/image5.jpg)\\r\\n\\r\\n
\\r\\n
\\r\\nA woman walking in a park\\r\\n
\\r\\n
\\r\\nA man listening to music in a park\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n![A woman walking in a park](on-brand/image25.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![A man listening to music in a park](on-brand/image15.png)\\r\\n\\r\\n
\\r\\n
\\r\\nA man playing Ukulele\\r\\n
\\r\\n
\\r\\nA woman reading a book\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n\\r\\n#### On-brand headshots of these same people would look something like this:\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![A woman walking in a park](on-brand/image16.png)\\r\\n
\\r\\n
\\r\\n\\r\\n![A man listening to music in a park](on-brand/image17.png)\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n \\r\\n![A woman walking in a park](on-brand/image22.png)\\r\\n\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n \\r\\n![A man listening to music in a park](on-brand/image24.png)\\r\\n\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n\\r\\nNow, wouldn\u2019t it be awesome if you could generate corporate headshots like these quickly and efficiently?\\r\\n\\r\\nThat\u2019s where we, Astria.ai, come in.\\r\\n\\r\\n\\r\\n# Key Features of Astria.ai\u2019s Platform\\r\\n\\r\\nAstria.ai specializes in generating Stable Diffusion images at breakneck speed. First, you get premium results. Second, you can bring your still photographs to life. Third, our API is quick and simple to use. Our key features are:\\r\\n\\r\\n\\r\\n\\r\\n1. **Backend V1:** Currently in beta, this feature helps you to completely rewrite the original image inference and processing pipeline. See the details [here](https://docs.astria.ai/docs/features/backend-v1).\\r\\n2. **Face Inpainting:** Face inpainting will try to detect a human face in the picture, and then run a second inference on top of the detected face to improve facial features. It requires the super-resolution toggle to be turned on in order to get more pixels to work with.\\r\\n3. **Face Swap**: Face-swap uses training images to enhance resemblance to the subject.\\r\\n4. **Face ID:** This is a model adapter allowing you to generate an image while preserving identity without fine-tuning. It\u2019s been trained on only human faces.\\r\\n5. **Latent Consistency Models:** This is a combination of a scheduler and a LoRA which allows image generation in 5-6 steps, thus reducing processing time.\\r\\n6. **LoRAs:** LoRAs can be used to improve the quality of the image or deepen the desired style. We provide a [LoRA gallery](https://www.astria.ai/gallery/tunes?model_type=lora) and allow importing external LoRAs.\\r\\n7. **Multi-Controlnet:** Use this tool to get better consistency and precision. See the syntax [here](https://docs.astria.ai/docs/features/multi-controlnet).\\r\\n8. **Multi-Pass Inference:** Currently in beta, this is a unique feature that allows you to generate a background image separately from the person in the foreground.\\r\\n9. **Multi-Person Inference:** Also in beta, it is a feature that allows you to generate images with multiple people in them.\\r\\n10. **Prompt Masking:** This uses a short text to create a mask from the input image. The mask can be used to inpaint parts of the image. The most popular use cases are [product shots](https://docs.astria.ai/docs/use-cases/product-shots) and [Masked Portraits](https://docs.astria.ai/docs/use-cases/masked-portraits).\\r\\n11. **Tiled Upscale:** A beta feature to improve image resolution.\\r\\n\\r\\n\\r\\n# Step-by-Step Process to Generate On-Brand Headshots\\r\\n\\r\\n\\r\\n### **Step 1: Collecting Images**\\r\\n\\r\\nTo get started, we collected images of 4 different people from the free image websites Pixabay and Pexels.\\r\\n\\r\\n\\r\\n### **Step 2: Training**\\r\\n\\r\\nNext, we will fine-tune all the 4 subjects.\\r\\n\\r\\n![alt_text](on-brand/image18.png \\"image_tooltip\\")\\r\\n\\r\\n\\r\\n**Title:** Give an appropriate title.\\r\\n\\r\\n**Class Name:** Select the correct class name from the dropdown menu. In our example, we have 2 male models and 2 female models, so we selected accordingly.\\r\\n\\r\\n**Images:** You can upload any number between 4 and 30 images. In this case, we have:\\r\\n\\r\\n*Male Model 1*: 20 images\\r\\n*Male Model 2*: 14 images\\r\\n*Female Model 1*: 7 images\\r\\n*Female Model 2*: 6 images\\r\\n\\r\\n**Advanced Options**\\r\\n\\r\\n\\r\\n![alt_text](on-brand/image3.png \\"image_tooltip\\")\\r\\n\\r\\n\\r\\n**Base Fine-tune:** We shall be using the Realistic Vision V5.1 V5.1 (VAE) model.\\r\\n\\r\\n**Model Type:** Among Checkpoint, LoRA (BETA), LoRA + Embedding - SDXL, and FaceID (free) from the dropdown, we are choosing Checkpoint.\\r\\n\\r\\n**Steps:** We advise going with the default setting here.\\r\\n\\r\\n**Token:** The token used here is \u201cohwx\u201d. Remember to use this for all Stable Diffusion prompts as an instance token for the naming process during training. \u201cohwx\u201d is utilized as a token to associate subjects or concepts with specific identifiers during training.\\r\\n\\r\\n**Face Detection:** This tool enhances face detection for training faces for different classes. Make sure not to crop the images before uploading.\\r\\n\\r\\n**Face Correct:** This tool enhances training images when the input images are low quality or low resolution. But since it can result in over-smoothing, we have not opted for it.\\r\\n\\r\\nTo know more about the dos and don\u2019ts of AI Photoshoots, visit our [documentation](https://docs.astria.ai/docs/use-cases/ai-photoshoot/).\\r\\n\\r\\n\\r\\n### **Step 3: Creating On-Brand Images**\\r\\n\\r\\nNow that the fine-tuned models are ready, we\u2019re all set to generate some awesome headshots.\\r\\n\\r\\n\\r\\n\\r\\n![alt_text](on-brand/image21.png \\"image_tooltip\\")\\r\\n\\r\\n\\r\\n\\r\\nLet\u2019s select the fine-tuned models one-by-one, and create the corresponding on-brand headshots.\\r\\n\\r\\nClick on Fine-tune, then move to: On brand image: Pexel Woman.\\r\\n\\r\\n![alt_text](on-brand/image12.png \\"image_tooltip\\")\\r\\n\\r\\n\\r\\n**Detailed Description:** Every image will require a different prompt. See the prompts we have used below.\\r\\n\\r\\n**Negative Prompts:** This comprises the characteristics that you do _not_ want in your output images. In this case, we entered the following:\\r\\n\\r\\n\\r\\n```\\r\\nold, wrinkles, mole, blemish,(oversmoothed, 3d render) scar, sad, severe, 2d, sketch, painting, digital art, drawing, disfigured, elongated body (deformed iris, deformed pupils, semi-realistic, cgi, sketch, cartoon, drawing, anime), text, cropped, out of frame, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, (extra fingers, mutated hands, poorly drawn hands, poorly drawn face), mutation, deformed, (blurry), dehydrated, bad anatomy, bad proportions, (extra limbs), cloned face, disfigured, gross proportions, (malformed limbs, missing arms, missing legs, extra arms, extra legs, fused fingers, too many fingers, NSFW), nude, underwear, muscular, elongated body, high contrast, airbrushed, blurry, disfigured, cartoon, blurry, dark lighting, low quality, low resolution, cropped, text, caption, signature, clay, kitsch, oversaturated\\r\\n```\\r\\n\\r\\n\\r\\n**Model:** There are different Stable Diffusion models you can choose from. We used Realistic Vision V5.1 V5.1 (VAE).\\r\\n\\r\\n\\r\\n#### **ControlNet/Img2Img**\\r\\n\\r\\n![alt_text](on-brand/image30.png \\"image_tooltip\\")\\r\\n\\r\\n**Image URL:** This is the place to upload a reference image, or the image you would like the final output to be based on. You could also use a URL instead. In addition to the detailed description and negative prompts, the model will refer to this image while generating the new images.\\r\\n\\r\\n**Mask URL:** Image masking is used to isolate specific areas of an image from the rest, allowing for more precise editing. It\u2019s like placing a \u201cmask\u201d over the parts of a picture you want to protect or hide while exposing the other areas for editing. In this case, we have left it blank.\\r\\n\\r\\n**Prompt Strength:** This is denoising strength. If you input 1 here, it will take the prompt and ignore the reference image. We are using the default: 0.8.\\r\\n\\r\\n**ControlNet Hint:** In the dropdown you will note the following options: Pose, Depth, Tile, Line art - Edge, Canny - Edge detection, MLSD - for architecture, HED boundaries, and QR Code. We used \u2018Pose\u2019 because we are creating professional headshots.\\r\\n\\r\\n**ControlNet Conditioning Scale:** We have used the default: 0.8.\\r\\n\\r\\n**TXT2IMG:** If you want to use this instead of Img2Img, then toggle on. In our case, we have used a reference image, so it is toggled off.\\r\\n\\r\\n\\r\\n#### **Advanced**\\r\\n\\r\\n![alt_text](on-brand/image20.png \\"image_tooltip\\")\\r\\n\\r\\n\\r\\n**Color Grading:** We have 3 color grading options - Film Velvia, Film Portra, and Ektar. In this case, we\u2019ve left it blank so that the model can take the inference from the reference image.\\r\\n\\r\\n**Width:** This will set the width of the image. We have left it blank.\\r\\n\\r\\n**Height:** This will set the height of the image. We have left it blank.\\r\\n\\r\\n**Number of Images:** The number of images can be selected from among the options - 1,2,3,4, and 8. We selected 2.\\r\\n\\r\\n**Steps:** This ranges from 10 - 50. We have kept the default: 50.\\r\\n\\r\\n**Seed:** The default is 42.\\r\\n\\r\\n**Cfg Scale:** This ranges from 0-20; the default is 7.5.\\r\\n\\r\\n**Scheduler:** Among euler, euler_a, dpm++2m_karras, dpm++sde_karras, dpm__2m, dpm++sde, and lcm, the default is euler_a. We\u2019ve kept the default.\\r\\n\\r\\n**Weighted Prompts**: You can enable the weighted prompts, but in our case, it is disabled.\\r\\n\\r\\n**Film Grain:** This adds noise to the image. We toggled on.\\r\\n\\r\\n**Super Resolution (X4):** This increases the resolution. We toggled on.\\r\\n\\r\\n**Super Resolution Details:** This is used along with Super Resolution (X4). This is toggled on.\\r\\n\\r\\n**Inpaint Faces:** This improves details on faces. It is toggled on.\\r\\n\\r\\n**Face Correct:** This does face restoration. It is toggled on.\\r\\n\\r\\n**Face Swap:** This uses training images to further enhance resemblance to the subject. This is toggled off.\\r\\n\\r\\nNow let\u2019s get to the detailed descriptions. Let\u2019s see what prompts work and what headshots they generate - all of them on-brand in our case.\\r\\n\\r\\n\\r\\n#### **On-Brand Image: Legal Profession**\\r\\n\\r\\nDetailed Description for Man:\\r\\n\\r\\n\\r\\n```\\r\\nportrait of (ohwx man) wearing a lawyer suit, bookshelf background, professional photo, white background, Amazing Details, Best Quality, 80mm Sigma f/1.4 or any ZEISS lens --tiled upscale\\r\\n```\\r\\n\\r\\n\\r\\nDetailed Description for Woman:\\r\\n\\r\\n\\r\\n```\\r\\nportrait of (ohwx woman) wearing a lawyer suit, bookshelf background, professional photo, white background, Amazing Details, Best Quality, 80mm Sigma f/1.4 or any ZEISS lens --tiled upscale\\r\\n```\\r\\n\\r\\n\\r\\nImages:\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 1](on-brand/image9.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 2](on-brand/image11.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 3](on-brand/image10.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 4](on-brand/image14.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n#### **On-Brand Image: Corporate Headshots**\\r\\n\\r\\nDetailed Description for Man:\\r\\n\\r\\n\\r\\n```\\r\\nportrait of (ohwx man) wearing a business suit, professional photo, white background, Amazing Details, Best Quality, Masterpiece, dramatic lighting highly detailed, analog photo, overglaze, 80mm Sigma f/1.4 or any ZEISS lens\\r\\n```\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nDetailed Description for Woman:\\r\\n\\r\\n\\r\\n```\\r\\nportrait of (ohwx woman) wearing a business suit, businesswoman, professional photo, white background, Amazing Details, Best Quality, 80mm Sigma f/1.4 or any ZEISS lens --tiled upscale\\r\\n```\\r\\n\\r\\n\\r\\nImages:\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 1](on-brand/image27.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 2](on-brand/image13.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 3](on-brand/image7.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 4](on-brand/image2.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n#### **On-Brand Image: Healthcare**\\r\\n\\r\\nDetailed Description for Man:\\r\\n\\r\\n\\r\\n```\\r\\nportrait of (ohwx man) wearing a labcoat,smiling, hospital, intricate details, symmetrical eyes, professional photo, detailed background, detailed fingers, detailed face, Amazing Details, Best Quality, ZEISS lens,8k high definition --tiled upscale\\r\\n```\\r\\n\\r\\n\\r\\nDetailed Description for Woman:\\r\\n\\r\\n\\r\\n```\\r\\nportrait of (ohwx woman) wearing a labcoat,smiling, hospital, intricate details, symmetrical eyes, professional photo, detailed background, detailed fingers, detailed face, Amazing Details, Best Quality, ZEISS lens, 8k high definition --tiled upscale\\r\\n```\\r\\n\\r\\n\\r\\nImages:\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 1](on-brand/image26.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 2](on-brand/image28.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 3](on-brand/image31.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 4](on-brand/image4.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n#### On-Brand Image: Manufacturing\\r\\n\\r\\nDetailed Description for Man:\\r\\n\\r\\n\\r\\n```text\\r\\nportrait of (ohwx man) wearing shirt and trousers,factory background, manufacturing professional,smiling, symmetrical eyes,detailed fingers, detailed hands, professional photo, Amazing Details, Best Quality, 80mm Sigma f/1.4 or any ZEISS lens --tiled upscale\\r\\n```\\r\\n\\r\\n\\r\\nDetailed Description for Woman:\\r\\n\\r\\n\\r\\n```text\\r\\nportrait of (ohwx woman) wearing shirt and trousers,manufacturing professional,smiling, symmetrical eyes,detailed fingers, detailed hands, professional photo, Amazing Details, Best Quality, 80mm Sigma f/1.4 or any ZEISS lens --tiled upscale\\r\\n```\\r\\n\\r\\n\\r\\nImages:\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 1](on-brand/image29.png)\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n![Image 2](on-brand/image1.png)\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n![Image 3](on-brand/image8.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 4](on-brand/image23.png)\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n\\r\\n# To Summarize\\r\\n\\r\\nThere are several potential benefits to using Astria for corporate headshots over traditional photography shoots:\\r\\n\\r\\n\\r\\n\\r\\n* **Cost-Effectiveness:** AI-generated headshots can be significantly cheaper than hiring a professional photographer, renting a studio, and so on\\r\\n* **Scalability:** AI can generate a large number of headshots quickly and easily. This is especially beneficial for companies with a large number of employees.\\r\\n* **Customization:** With AI, you can fine-tune the generation process to create headshots that meet your specific needs. For example, you can specify the desired clothing, background, and lighting.\\r\\n* **Control over Revisions:** If you don\'t like an AI-generated headshot, you can simply generate another one. This can save time and money compared to reshooting a traditional headshot.\\r\\n* **Accessibility:** AI-generated headshots can be created from anywhere in the world, without the need to travel to a photography studio.\\r\\n\\r\\nGenerating corporate headshots is one of the many cool things you can do on our platform. Keep reading our other blogs to find out about our exciting new features."},{"id":"/multi-pass-inference","metadata":{"permalink":"/articles/multi-pass-inference","source":"@site/blog/multi-pass-inference.md","title":"How to Use Astria.ai\'s Multi-Pass Inference for Highly Controlled Stable Diffusion Image Generation","description":"How to Generate Striking Images with Astria.ai\'s Multi-Pass Inference","date":"2024-02-04T13:12:25.000Z","formattedDate":"February 4, 2024","tags":[],"readingTime":8.665,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"How to Use Astria.ai\'s Multi-Pass Inference for Highly Controlled Stable Diffusion Image Generation","description":"How to Generate Striking Images with Astria.ai\'s Multi-Pass Inference"},"prevItem":{"title":"Generate On-Brand Corporate Headshots in Minutes by Fine-Tuning Stable Diffusion Models on Astria.ai","permalink":"/articles/on-brand"}},"content":"Welcome to Astria.ai.\\n\\nIn our first blog post, we\u2019ll take a deep dive into how you can generate very detailed images using a multi-pass inference method. We\u2019ll show you how to structure high-quality prompts to generate visuals of professional quality.\\n\\n\\n## What Is Multi-Pass Inference?\\n\\nFirst, let\u2019s discuss what multi-pass inference is. Multi-pass inference is essentially a technique where you can generate the background of the composition independently from the foreground. On Astria.ai this control is achieved through multiple breaks in the prompting technique. The base image (i.e. the background elements) is generated separately via the first part of the prompt. Then using the next breaks in the prompt the subject is in-painted onto the base image.\\n\\nHere\'s how multi-pass inference enhances control over the background of an image:\\n\\n\\n### 1. Iterative Refinement\\n\\nIn a multi-pass inference, you have the opportunity to adjust and refine the background in a separate pass. This iterative process allows you to steer the image generation towards your desired outcome.\\n\\n\\n### 2. Choice over base model\\n\\nMulti-pass inference allows for choice over the base model thereby giving the users the option to use a variety of pre-trained models like Realistic Vision, Absolute Reality, and other Stable Diffusion models.\\n\\n\\n### 3. Increased Precision and Detailing\\n\\nWith multiple inference steps, you have more chances to introduce specific details or adjustments to the background. This can include changing its color scheme, adding or removing elements, or altering its overall style. Such precision is often not achievable in a single pass, where the model\'s output is more dependent on the initial prompt and less on a multi-step method.\\n\\n\\n### 4. Balancing Foreground and Background\\n\\nMulti-pass inference allows for a more balanced composition between the foreground and the background so that you can modify the background in a way that it complements the foreground elements more effectively.\\n\\nAs an example take a look at these two images of a man wearing sportswear and posing inside a gym. The first one was generated in a single prompt, while for the second one we used a multi-pass approach.\\n\\n
\\n\\n
\\n
Without multi-pass
\\n\\n![alt_text](multi-pass-inference/image7.png)\\n
\\n\\n
\\n
With multi-pass
\\n\\n![alt_text](multi-pass-inference/image6.png)\\n
\\n\\n
\\n\\n\\n\\nAs you can see in the second image the background has more character to it. The elements of the gym are more prominent as compared to the former.\\n\\n\\n## How Multi-Pass Inference Can Benefit Your Business\\n\\nThe enhanced control over image backgrounds provided by multi-pass inference offers significant benefits for businesses in various domains. By precisely tailoring image backgrounds, companies can maintain a consistent visual brand identity, crucial for marketing, advertising, and establishing a strong social media presence.\\n\\nFor e-commerce and retail sectors, the background of product images plays a critical role in shaping customer perception. Tailoring these backgrounds to complement the products not only enhances their appeal but also provides clearer context, which can lead to increased sales.\\n\\nMoreover, multi-pass inference enables rapid and cost-effective creation of high-quality, bespoke images. This reduces the reliance on expensive photoshoots and graphic design work, presenting a more economical approach to content creation. Businesses can easily modify image backgrounds to suit various platforms and formats, such as social media, websites, and print media, ensuring optimal visual presentation across all channels.\\n\\nLastly, in a digital landscape overflowing with visual content, unique and tailored images with custom backgrounds provide businesses with a competitive edge. Such visuals are more likely to capture audience interest in a crowded market, standing out from standard, generic content. Therefore, the ability to control image backgrounds through multi-pass inference is not just a technical advantage but a strategic tool for branding, marketing, product presentation, and creating visually compelling content that differentiates a business in the market.\\n\\n\\n## How Astria.ai makes Multi-pass inferencing easy\\n\\nMulti-pass inferencing, particularly in the context of advanced generative models like Stable Diffusion, often requires a developer\'s expertise due to several technical complexities. At Astria.ai, we provide a user-friendly apis that can significantly simplify this process for users who do not possess extensive technical know-how.\\n\\nLet\u2019s first understand how a developer\u2019s expertise is needed and then we\u2019ll show how Astria.ai makes this process easier.\\n\\nIf one were to fine-tune and implement Stable Diffusion for multi-pass inferencing one would need a fair understanding of how these machine learning models work so that they can adjust parameters for different passes. This would require a fair amount of coding skills especially for customizing the inference process, integrating different components (like schedulers, encoders, decoders), and handling data preprocessing and postprocessing. Developers must be proficient in relevant programming languages and frameworks.\\n\\nMoreover each pass in multi-pass inferencing may require adjustments to optimize the output. Developers need to troubleshoot issues, fine-tune parameters, and experiment with different configurations to achieve the desired results, which demands both technical skills and problem-solving abilities. Lastly, generative models can be resource-intensive. Developers need to manage and optimize the use of computational resources like GPUs, especially when working with large models or high-resolution images.\\n\\nAstria.ai simplifies the above procedures by providing simple APIs that abstract the complexities of the underlying model. The platform also comes with pre-configured settings and templates showcased in the gallery that users can select from, reducing the time to do prompt engineering, and helping understand the breadth of options available. This includes predefined prompts, styles, and optimization settings. Apart from this Astria also handles the computational resource management in the background, allowing users to focus on the creative aspects of image generation without worrying about technical constraints.\\n\\nOverall, while multi-pass inferencing with AI models requires considerable technical expertise due to its complexity, a platform like Astria.ai democratizes this capability by providing easy-to-use api and automated workflows, making advanced image generation accessible to developers.\\n\\n\\n## Step-by-Step Guide to Creating Images for a Sportswear Brand Using Multi-Pass Inferencing\\n\\n### Step 1: Training\\n\\nFirst, create a fine-tune of your subject.\\n\\n![alt_text](multi-pass-inference/image10.png)\\n\\n\\nSelect the model type as LORA. This is a fast and efficient way to train the model, as it only trains an adapter layer on top of the base model, instead of training all the weights which is typically the case if we select the Checkpoint Model type.\\n\\nWe used the following images of a male model obtained from a royalty free collection (Pixabay):\\n\\n\\n![alt_text](multi-pass-inference/image4.jpg)\\n\\n\\nOnce the tune is ready, we can begin to prompt. Click on your tune.\\n\\n![alt_text](multi-pass-inference/image3.png)\\n\\n\\n### Step 2 Inference\\n\\nLet\u2019s first look at the structure of our prompt. Suppose you have to create images to market a sportswear brand.\\n\\n\\n```\\n(medium shot) of a male model wearing hiking clothes and shoes, standing in a dense forest, behind him is a small waterfall.\\nBREAK photorealistic and highly detailed\\nBREAK ohwx man wearing hiking clothes and shoes \\n```\\n\\n* The first line contains the base prompt to generate the background and the overall composition.\\n* The second line is a common prompt that is added both to the base prompt and the person prompt, in order to avoid repetition.\\n* The third line is the person prompt, to detail how our subject is composed in the foreground. The statement - <lora:960310:1.0> - is added to load the fine-tuned model of our subject.\\n\\n```\\nNegative Prompt: (brand logos on t-shirt), (worst quality, greyscale), watermark, username, signature, text, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, jpeg artifacts, bad feet, extra fingers, mutated hands, poorly drawn hands, bad proportions, extra limbs, disfigured, bad anatomy, gross proportions, malformed limbs, missing arms, missing legs, extra arms, extra legs, mutated hands, fused fingers, too many fingers, long neck\\n```\\n\\n\\n\\nThe negative prompt is a list of prompts we want to avoid in our generated image. Anything placed in parentheses applies extra weights to that prompt.\\n\\nWe can add an input image if we want our generated image to follow an input template. On the ControlNet Hint dropdown menu, we can select pose, if we want to copy the pose of the subject from the input image. Select the Text2img toggle to be true, that\u2019ll preserve the pose of the image. (recommended). If you want the semantics i.e. the looks and feels of the original image as well, then go for Img2img.\\n\\nFor example, let\u2019s take this pose as our input image:\\n\\n\\n![alt_text](multi-pass-inference/image5.jpg)\\n\\n\\nAlso, keep the Inpaint Faces and Face Swap toggle on. Inpaint Faces iterates one more time over the faces of the subject to ensure that there is no distortion in the outcome, while the Face Swap option ensures that the face of our model is taken from the training images and swapped in the generated image to enhance resemblance in the final output.\\n\\nLet\u2019s look at the result of our first prompt:\\n\\n\\n![alt_text](multi-pass-inference/image8.png)\\n\\n\\nAs you can see, the ControlNet has ensured that the output pose is similar to the pose of the input image.\\n\\n### Step 3: Examples\\n\\nPrompt 2:\\n```\\na man at the finish line of a race on an olympic track\\nBREAK sharp details\\nBREAK ohwx man wearing running clothes and shoes, jubilant expression on his face<lora:960310:1.0>\\n\\nNegative: anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, long neck, disfigured, fused lips,\\n```\\n\\n![alt_text](multi-pass-inference/image9.png)\\n\\n\\nPrompt 3:\\n\\n```\\nfull body workout in a vibrant gym, action, perspective, speed, movement, ripped, push ups fit\\nBREAK sharp details, realistic image, Porta 160 color, ARRI ALEXA 65\\nBREAK ohwx man doing push-ups, intense look on his face \\n\\nNegative: anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, long neck, disfigured, fused lips,\\n```\\n\\n![alt_text](multi-pass-inference/image1.png)\\n\\n\\nPrompt 4:\\n(wide shot) of a man walking at night on the streets of New York, warm lighting, photorealistic\\n\\n```\\nBREAK\\nBREAK ohwx man wearing casual sports wear<lora:960310:1.0>\\nNegative: hat, cartoon, ugly\\n```\\n\\n\\n\\n![alt_text](multi-pass-inference/image2.png)\\n\\n\\n\\n## Final Note\\n\\nThe above steps can be used to generate product photography or e-commerce images. With multi-pass inference, you can gain a huge amount of control over your image backgrounds vis a vis the foreground. This technique allows you to iteratively refine and tailor the background details, ensuring that they align with your vision and objectives.\\n\\nWhether you\'re looking to create images for branding, marketing, storytelling, or artistic expression, multi-pass inference by Astria.ai provides the flexibility and precision to shape the background just as you need it. You can now harness this tool to bring depth, context, and nuance to your visual content, making your image speak in harmony with your creative goals."}]}')}}]); \ No newline at end of file diff --git a/assets/js/c85f55fc.e5cc2c3d.js b/assets/js/c85f55fc.e5cc2c3d.js deleted file mode 100644 index 8b0f26e..0000000 --- a/assets/js/c85f55fc.e5cc2c3d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkastria_docs_2=self.webpackChunkastria_docs_2||[]).push([[339],{9888:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"/real-estate","metadata":{"permalink":"/articles/real-estate","source":"@site/blog/real-estate.md","title":"Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion","description":"Virtual staging is the process of digitally adding furniture, decor, and other elements to photos of empty or sparsely furnished spaces. Along with Stable Diffusion, it can significantly improve real estate listings by creating realistic and attractive virtual staging.","date":"2024-04-24T16:27:48.000Z","formattedDate":"April 24, 2024","tags":[],"readingTime":6.015,"hasTruncateMarker":false,"authors":[],"frontMatter":{},"nextItem":{"title":"Create Studio-Quality Custom Portraits Instantly with Astria\'s FaceID Tool","permalink":"/articles/face-id"}},"content":"Virtual staging is the process of digitally adding furniture, decor, and other elements to photos of empty or sparsely furnished spaces. Along with Stable Diffusion, it can significantly improve real estate listings by creating realistic and attractive virtual staging.\\n\\nDigital staging transforms cold, empty rooms into warm, inviting spaces that help buyers emotionally connect with a property. A 2023 report by Realtor.com found that staged homes sell 88% faster and for an average of 20% more than non-staged homes.\\n\\n\\n# Why Virtual Staging Is Needed\\n\\n\\n\\n* Empty spaces lack appeal: Unfurnished rooms can appear cold and uninviting, making it difficult for potential buyers to visualize themselves living in the space.\\n* Traditional staging is expensive: Physically staging a property requires furniture rentals, which can be costly and time-consuming.\\n* Showcases potential: Virtual staging allows showcasing a space\'s full potential. Buyers can see how furniture can be arranged and how the space can function for their needs.\\n\\n\\n# Advantages of Using Astria.ai for Virtual Staging\\n\\nThe advantages of using Astria.ai for virtual staging are many:\\n\\n\\n\\n* Cost-Effective: Compared to traditional staging, Astria offers a much more affordable way to virtually stage a property.\\n* Speed and Efficiency: Astria can generate virtual staging variations in minutes, allowing realtors to experiment with different styles and layouts.\\n* Customization: With clear prompts and descriptions, it can create virtual staging that reflects the property\'s style, target demographic, and current design trends.\\n\\nAstria.ai simplifies virtual staging by harnessing cutting-edge AI technology, making it effortless to digitally stage listings with realistic results. Here\'s how Astria.ai achieves this:\\n\\n\\n\\n1. Controlnets: Users input text descriptions to control the composition, style, and content of the staged photo.\\n2. MLSD (Multi-Level Scene Description): Breaks down a room into its components, ensuring realistic staging.\\n3. Compositional Understanding: AI arranges furniture and decor based on interior design principles.\\n4. Backend Version-1: Proprietary machine learning infrastructure enables fast, high-quality staging.\\n\\nBackend Version-1 improvements include:\\n\\n\\n\\n* Hi-Res (Super-Resolution Details) for sharper images.\\n* Faster processing times.\\n* Better handling of multiple LoRAs.\\n* Improved results with DPM++/Karras and DPM++SDE/Karras samplers.\\n\\nMulti-Controlnet, available only for Backend Version-1, combines multiple Controlnets for better consistency and precision.\\n\\n\\n# How to Use Astria.ai\\n\\n\\n\\n1. Sign up at Astria.ai.\\n2. Go to [https://www.astria.ai/prompts](https://www.astria.ai/prompts).\\n3. Select Advanced and ControlNet/Img2Img Option.\\n\\n\\n\\n![alt_text](real-estate/image3.png \\"image_tooltip\\")\\n\\n\\n\\n\\n4. Upload your image using Choose File.\\n5. Select 1 - BETA under Backend version.\\n6. Write out a description under Detailed Description and add \u201c-- controlnets MLSD\u201d at the end of it. --controlnet_weights 0.5 gives the best results.\\n7. Also use --mask_prompt windows door --mask_invert, to make sure that the windows and the doors are preserved from the original image.\\n8. Additionally you can add a few Loras as suggested in the docs [here ](https://docs.astria.ai/docs/use-cases/room-redesign)to improve the overall quality of the image.\\n9. Click Create Image.\\n\\n\\n# Easy Hacks to Enhance Your Listings\\n\\n\\n\\n1. Gather High-Quality Photos: The process works best with clear and well-lit photos of the empty rooms.\\n2. Define the Virtual Staging Style: Consider the property\'s target audience and the overall feel you want to create (modern, traditional, family-friendly etc.).\\n3. Craft Text Prompts: Provide detailed descriptions of the desired furniture, decor, and overall ambiance.\\n4. Generate Variations: You can generate multiple virtual staging options to choose from, allowing for A/B testing to see which resonates best with potential buyers.\\n5. Refine and Integrate: Minor adjustments might be needed to ensure a seamless integration of the virtual staging with the original photo.\\n\\n\\n# Virtual Staging Applications on Astria.ai\\n\\nIn this section, let\u2019s look at how you can actually use Astria to transform empty spaces into vibrant, inviting rooms.\\n\\nSee below:\\n\\n**Original Image => AI Generated Image by Astria.ai**\\n\\n```text\\nA serene and opulent private bedroom, featuring a plush king-size bed with a tufted velvet headboard and a delicate crystal chandelier above, surrounded by richly textured walls in a soothing gray tone, and a lavish area rug in a soft, creamy color, with a comfortable reading nook by the window, complete with a oversized armchair and a matching ottoman, and a spacious walk-in closet with custom cabinetry and a marble-topped dresser, all bathed in a warm, golden light, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\\n```\\n\\n\\n\\n \\n \\n \\n \\n
\\n\\n![image](real-estate/image7.png)\\n\\n\\n\\n![image](real-estate/image4.png)\\n\\n
\\n\\n\\n\\n```text\\nA modern office room with a minimalist aesthetic, featuring a sleek wooden desk with a silver laptop and a ergonomic chair, surrounded by floor-to-ceiling windows with a cityscape view, and a few potted plants on a shelf, with walls lined with tall cabinets filled with neatly organized books and files, and a subtle warm lighting and a hint of natural light, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\\n```\\n\\n\\n\\n \\n \\n \\n \\n
\\n\\n![image](real-estate/image13.png)\\n\\n\\n\\n![image](real-estate/image5.png)\\n\\n
\\n\\n\\n\\nA contemporary office space with an industrial chic vibe, featuring a reclaimed wood desk with a vintage-inspired lamp and a worn leather office chair, surrounded by exposed brick walls and polished concrete floors, with a floor-to-ceiling metal shelving unit filled with vintage books and decorative objects, and a large glass door leading to a private outdoor patio with a city view, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\\n\\n\\n\\n \\n \\n \\n \\n
\\n\\n![image](real-estate/image1.png)\\n\\n\\n\\n![image](real-estate/image10.png)\\n\\n
\\n\\n\\n```text\\nA sleek and modern home gym, featuring a spacious open floor plan with high ceilings and large windows allowing for natural light, equipped with a variety of high-end exercise equipment including a treadmill, stationary bike, and free weights, surrounded by mirrored walls and a polished wood floor, with a comfortable seating area for relaxation and a large flat-screen TV for entertainment, and a modern sound system for an immersive workout experience, in a 3D rendering style\\n```\\n\\n\\n\\n\\n \\n \\n \\n \\n
\\n\\n![image](real-estate/image9.png)\\n\\n\\n\\n![image](real-estate/image8.png)\\n\\n
\\n\\n\\n```text\\nCoastal-themed nursery: an empty room staged as a serene coastal-themed nursery with a white crib, soft blue accents, shiplap wall, and nautical decor elements \u2013 controlnets MLSD Composition\\n```\\n\\n\\n\\n\\n \\n \\n \\n \\n
\\n\\n![image](real-estate/image2.png)\\n\\n\\n\\n![image](real-estate/image11.png)\\n\\n
\\n\\n\\n```text\\nA peaceful and calming meditation room, featuring a serene and minimalist space with a focus on natural materials and textures, including a reclaimed wood floor, a stone feature wall, and a live edge wooden meditation bench, surrounded by floor-to-ceiling windows allowing for an abundance of natural light and a connection to nature, with a few carefully placed plants and a subtle water feature creating a sense of tranquility, and a soft, warm glow emanating from candles or string lights, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\\n```\\n\\n\\n\\n \\n \\n \\n \\n
\\n\\n![image](real-estate/image6.png)\\n\\n\\n\\n![image](real-estate/image12.png)\\n\\n
\\n\\n\\n\\nHere are the original images sources:\\n\\n[https://newyork.craigslist.org/brk/apa/d/brooklyn-expansive-loft-in-bushwick/7731612663.html](https://newyork.craigslist.org/brk/apa/d/brooklyn-expansive-loft-in-bushwick/7731612663.html)\\n\\n[https://newyork.craigslist.org/brk/apa/d/brooklyn-below-market-basic-bedroom/7731562165.html](https://newyork.craigslist.org/brk/apa/d/brooklyn-below-market-basic-bedroom/7731562165.html)\\n\\n[https://newyork.craigslist.org/mnh/apa/d/new-york-bright-corner-studio-laundry/7731512365.html](https://newyork.craigslist.org/mnh/apa/d/new-york-bright-corner-studio-laundry/7731512365.html)\\n\\n[https://newyork.craigslist.org/brk/apa/d/brooklyn-bed-in-williamsburg-no-fee/7731545442.html](https://newyork.craigslist.org/brk/apa/d/brooklyn-bed-in-williamsburg-no-fee/7731545442.html)\\n\\n[https://hudsonvalley.craigslist.org/apa/d/pearl-river-pearl-river-jewel-1br/7733791169.html](https://hudsonvalley.craigslist.org/apa/d/pearl-river-pearl-river-jewel-1br/7733791169.html)\\n\\n[https://slowmotionmama.com/7-reasons-to-empty-a-space-before-decluttering/](https://slowmotionmama.com/7-reasons-to-empty-a-space-before-decluttering/)\\n\\n\\n# To Summarize\\n\\nThe benefits of AI virtual staging are many: accelerated sales, increased property values, and a streamlined marketing experience.\\n\\nThings to remember:\\n\\n\\n\\n* Maintain Realism: While this AI tool is powerful, it\'s crucial to ensure the generated virtual staging looks realistic and avoids nonsensical elements.\\n* Transparency: You may choose to disclose that virtual staging is used in the listing description to build trust with potential buyers."},{"id":"/face-id","metadata":{"permalink":"/articles/face-id","source":"@site/blog/face-id.md","title":"Create Studio-Quality Custom Portraits Instantly with Astria\'s FaceID Tool","description":"You can now generate instant custom headshot photos for professional use in just a few clicks.","date":"2024-04-04T08:12:54.000Z","formattedDate":"April 4, 2024","tags":[],"readingTime":6.89,"hasTruncateMarker":false,"authors":[],"frontMatter":{},"prevItem":{"title":"Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion","permalink":"/articles/real-estate"},"nextItem":{"title":"Generate On-Brand Corporate Headshots in Minutes by Fine-Tuning Stable Diffusion Models on Astria.ai","permalink":"/articles/on-brand"}},"content":"You can now generate instant custom headshot photos for professional use in just a few clicks.\\n\\nSeveral industries could benefit from it. Here are some key ones:\\n\\n**1. Online Platforms & Gig Economy:**\\n\\n\\n\\n* Freelancers and independent contractors on platforms like Upwork or Fiverr need professional headshots for their profiles to appear credible and attract clients.\\n* People signing up for ride-sharing services like Uber or Lyft often require profile pictures that meet platform guidelines.\\n\\n**2. Remote Work & Video Conferencing:**\\n\\n\\n\\n* With the rise of remote work, employees need professional headshots for video conferencing platforms like Zoom or Google Meet.\\n* Many companies request profile pictures for internal directories.\\n\\n**3. Events & Conferences:**\\n\\n\\n\\n* Attendees at conferences or trade shows might need quick headshots for badges or presentations.\\n* Event organizers may require speaker headshots for promotional materials.\\n\\n**4. Retail & Hospitality:**\\n\\n\\n\\n* Retailers or restaurants can use headshot generators for employee name tags or online staff directories.\\n\\n**5. Education & Training:**\\n\\n\\n\\n* Online courses or educational platforms can benefit from student profile pictures.\\n* Professional development programs often require headshots for certificates or online profiles.\\n\\n**6. Media & Marketing:**\\n\\n\\n\\n* Content creators or bloggers frequently need quick headshots for social media profiles or website bios.\\n* Marketing agencies can use headshot generators for clients who need profile pictures on short notice.\\n\\nSo how do we at Astria.ai come in?\\n\\n\\n# Astria\u2019s FaceID Feature for Instant Fine-tuning\\n\\nWith our FaceID tool, you can instantly fine-tune your images while preserving identity in a matter of seconds. All you need is just one photograph.\\n\\n\\n\\n![alt_text](face-id/image4.png \\"image_tooltip\\")\\n\\n\\nThis feature comes in very handy if you need to generate images quickly and efficiently \u2013 such as if you\u2019re offering a free-tier service in a user app and need profile images to be generated in a jiffy. It can also be applied in real-time applications like live-streaming or virtual try-ons.\\n\\nIn e-commerce applications, instant fine-tuning can be a game-changer as it allows users to visualize products with their own images seamlessly, enhancing the shopping experience and boosting conversion rates. In the gaming industry, instant fine-tuning can be used to create personalized gaming avatars or characters that resemble the user, thereby increasing immersion and emotional connection with the game. Additionally, social media platforms could use the FaceID feature to offer instant filters and lenses, letting users create and share more personalized content with their friends and followers.\\n\\nJust one point to remember: the adapter was trained on human faces, so best not to try faces of your pets or other subjects at the moment. A few other points to note:\\n\\n\\n\\n* FaceID can work with [Face Swap](https://docs.astria.ai/docs/features/face-swap) to improve similarity. Disable Face Swap in case your prompt is animation style.\\n* For fast generation, use [LCM schedulers](https://docs.astria.ai/docs/features/lcm).\\n* For realistic images, enable Face-Correct to improve the facial features.\\n\\n\\n# FaceID vs Full Fine-Tuning\\n\\nAstria offers full fine-tuning tools using the [Dreambooth](https://huggingface.co/docs/diffusers/en/training/dreambooth) API. This is a technique that updates the entire Stable Diffusion model by training on just a few images of a subject or style. This is a pretty efficient way of fine-tuning as it allows for the generation of realistic and diverse images of the specific subjects or concepts.\\n\\nApart from this, Astria also has the option of LoRA fine-tuning. In this technique, instead of fine-tuning the entire model, a low-rank adapter layer is inserted into the model architecture. This reduces the computational time and storage requirements leading to a lower cost of fine-tuning.\\n\\nBoth the techniques above are well suited for high fidelity on identity preservation of the subject images, but they take around 5-10 minutes for process completion and, therefore, we have FaceID for instant results.\\n\\nFaceID does not involve training of the model at all. Under the hood it only calculates and retains the embeddings of the training images, and then reproduces these embeddings during inference. This way the Stable Diffusion model doesn\u2019t have to go through any changes in its weights, and that\u2019s why the fine-tuning process is so rapid. It takes less than 10 seconds for a FaceID based fine-tune to be created.\\n\\n\\n# Guide to Using FaceID on Astria.ai\\n\\nAs mentioned before, the FaceID fine-tune can be done with just one image. But, for the sake of fidelity, we\u2019ve taken 3 images of a model from [Unsplash](https://unsplash.com). Here are the input images:\\n\\n\\n\\n![alt_text](face-id/image2.png \\"image_tooltip\\")\\n\\n\\nNow head over to the [New Finetune](https://www.astria.ai/tunes/new) section.\\n\\n\\n![alt_text](face-id/image3.png \\"image_tooltip\\")\\n\\n\\nUnder the Advanced features, select the Model type as FaceID. Remember to provide the Class name (woman, in this case).\\n\\nYour tune will be ready in a matter of seconds.\\n\\nHere\u2019s the API to create the tune:\\n\\n\\n```bash\\ncurl -X POST -H \\"Authorization: Bearer $API_KEY\\" https://api.astria.ai/tunes \\\\\\n -F tune[title]=\\"Unsplash Model Female - 1\\" \\\\\\n -F tune[name]=woman \\\\\\n -F tune[base_tune_id]=690204 \\\\\\n -F tune[images][0]=\\"@1.jpg\\" \\\\\\n -F tune[images][1]=\\"@2.jpg\\" \\\\\\n -F tune[images][2]=\\"@3.jpg\\" \\\\\\n```\\n\\n\\nBase_tune_id = 69024 refers to the Realistic Vision V5.1 (VAE) model that we used as the base model. You can check out the list of available models [here](https://www.astria.ai/gallery/tunes).\\n\\n\\n\\n![alt_text](face-id/image7.png \\"image_tooltip\\")\\n\\n\\nLet\u2019s start prompting with some real-life use cases, where instant headshot generation would be useful.\\n\\n\\n## Use-Case 1: Professional Networking\\n\\n```\\nPrompt: A professional headshot of a female software engineer, wearing a blue blazer, with a friendly smile and confident gaze, studio lighting, high-resolution, 8k, sharp focus, Nikon D850, 85mm lens, f/1.8, 1/200s, ISO 100 <faceid:1155049:1.0> **(replace this with the faceid number of your tune**)\\n\\nNegative Prompt: unprofessional, casual, blurry, low-resolution, poor lighting, unflattering angles, awkward pose, unfriendly expression, distracting background, snapshot, amateur, overexposed, underexposed, harsh shadows, uneven skin tone\\n```\\n\\nAPI to create the prompt:\\n\\n\\n```bash\\ncurl -X POST -H \\"Authorization: Bearer $API_KEY\\" https://api.astria.ai/tunes/1155049/prompts \\\\\\n -F prompt[text]=\\"A professional headshot of a female software engineer, wearing a blue blazer, with a friendly smile and confident gaze, studio lighting, high-resolution, 8k, sharp focus, Nikon D850, 85mm lens, f/1.8, 1/200s, ISO 100 \\" \\\\\\n -F prompt[negative_prompt]=\\"unprofessional, casual, blurry, low-resolution, poor lighting, unflattering angles, awkward pose, unfriendly expression, distracting background, snapshot, amateur, overexposed, underexposed, harsh shadows, uneven skin tone\\" \\\\\\n -F prompt[super_resolution]=true \\\\\\n -F prompt[face_correct]=true \\\\\\n```\\n\\n\\nNote the number 1155049 refers to the tune number. Replace it with the tune number of your own fine-tune.\\n\\n\\n![alt_text](face-id/image1.png \\"image_tooltip\\")\\n\\n\\n\\n## Use-Case 2: Fitness & Wellness Coach\\n\\n```\\nPrompt: A vibrant and inspiring headshot of a fitness coach, wearing a bright green athletic top, with an energetic smile and motivated expression, outdoor natural lighting, high-resolution, 8k, sharp focus, Nikon Z7 II, 85mm lens, f/2.8, 1/200s, ISO 200, vivid color palette, blurred park background, sun flare<faceid:1155049:1.0>\\n\\nNegative: unhealthy, unmotivated, low-energy, poorly lit, low-quality, blurry, awkward pose, unflattering angles, harsh shadows, distracting background, snapshot, amateur, overexposed, underexposed, uneven skin tone, no retouching, no visible workout equipment\\n```\\n\\n![alt_text](face-id/image6.png \\"image_tooltip\\")\\n\\n\\n\\n## Use-Case 3: Social Media and Marketing Influencer\\n\\n```\\nPrompt: A vibrant and engaging headshot of a female fashion influencer, wearing a stylish red dress, with a charming smile and confident pose, golden hour lighting, high-resolution, 8k, sharp focus, Canon EOS R5, 50mm lens, f/1.4, 1/160s, ISO 100, cinematic color grading, bokeh background <faceid:1155049:1.0>\\n\\nNegative: unfashionable, poorly lit, low-quality, blurry, awkward pose, unflattering angles, dull colors, flat lighting, distracting background, snapshot, amateur, overexposed, underexposed, harsh shadows, uneven skin tone, no makeup, no retouching\\n```\\n\\n\\n![alt_text](face-id/image5.png \\"image_tooltip\\")\\n\\n\\n\\n## Use-Case 4: Educational Platform & Online Learning\\n\\n```\\nPrompt: A friendly and approachable headshot of a female history professor, wearing a navy blue sweater, with a warm smile and inviting gaze, soft natural lighting, high-resolution, 8k, sharp focus, Sony A7R IV, 85mm lens, f/2.8, 1/125s, ISO 200, neutral color palette, clean background<faceid:1155049:1.0>\\n\\nNegative: intimidating, unapproachable, unprofessional, poorly lit, low-quality, blurry, awkward pose, unflattering angles, harsh shadows, distracting background, snapshot, amateur, overexposed, underexposed, uneven skin tone, no retouching\\n```\\n\\n\\n![alt_text](face-id/image8.png \\"image_tooltip\\")\\n\\n\\n\\n# Why Implement Astria\u2019s FaceID in Your Tech Stack\\n\\nBy implementing FaceID in your tech stack, you unlock the power of real-time, high-quality image generation. Consider the possibilities:\\n\\n\\n\\n1. Professional Networking\\n2. Social Media and Influencer Marketing\\n3. Educational Platforms\\n4. Fitness and Wellness Apps\\n5. Event Apps\\n6. E-commerce Apps\\n7. Free-Tier Services\\n\\nIntegrating FaceID into your application is a straightforward process, thanks to Astria.ai\u2019s developer-friendly [API](https://docs.astria.ai/docs/category/api). With just a few lines of code, you can integrate the feature into your tech stack, letting your users generate portraits with minimal waiting time."},{"id":"/on-brand","metadata":{"permalink":"/articles/on-brand","source":"@site/blog/on-brand.md","title":"Generate On-Brand Corporate Headshots in Minutes by Fine-Tuning Stable Diffusion Models on Astria.ai","description":"Today, we\u2019ll demonstrate how you can generate on-brand corporate headshots of yourself, your colleagues and clients using Astria.ai. You no longer need to dress up and conduct photoshoots; we can help you create professional-looking photos for your website, newsletter, PR, social media, and more simply with the help of a few prompts.","date":"2024-03-26T13:25:58.000Z","formattedDate":"March 26, 2024","tags":[],"readingTime":11.745,"hasTruncateMarker":false,"authors":[],"frontMatter":{},"prevItem":{"title":"Create Studio-Quality Custom Portraits Instantly with Astria\'s FaceID Tool","permalink":"/articles/face-id"},"nextItem":{"title":"How to Use Astria.ai\'s Multi-Pass Inference for Highly Controlled Stable Diffusion Image Generation","permalink":"/articles/multi-pass-inference"}},"content":"Today, we\u2019ll demonstrate how you can generate on-brand corporate headshots of yourself, your colleagues and clients using Astria.ai. You no longer need to dress up and conduct photoshoots; we can help you create professional-looking photos for your website, newsletter, PR, social media, and more simply with the help of a few prompts.\\r\\n\\r\\n\\r\\n# Why Are On-Brand Photographs Necessary?\\r\\n\\r\\nOn-brand photographs are important because they visually communicate a brand\'s identity and values. Companies benefit from professional headshots for several reasons:\\r\\n\\r\\n\\r\\n\\r\\n* **Projecting a Professional Image:** A polished headshot makes a strong first impression. It shows clients and potential customers that the company takes itself seriously and is invested in presenting a professional image.\\r\\n* **Building Trust and Credibility:** Seeing the faces of the people behind the company helps build trust and credibility. Potential clients feel more comfortable doing business with a company that has a human face.\\r\\n* **Enhancing Your Brand:** Headshots can be used on a company website, social media platforms, and marketing materials. Consistent, high-quality headshots contribute to a company\'s overall brand identity.\\r\\n* **Recruiting Talent:** Professional headshots on a careers page can attract qualified candidates. It shows potential employees that the company is professional and cares about its image.\\r\\n* **Boosting Employee Morale:** Investing in professional headshots can boost employee morale. It shows that the company values its employees and wants to present them in the best light.\\r\\n\\r\\n_Off-Brand Photos vs. On-Brand Photos_\\r\\n\\r\\n\\r\\n\\r\\n* **Off-brand:** Poor lighting, unprofessional attire, cluttered backgrounds, or generic stock photos that don\'t reflect the company\'s unique style.\\r\\n* **On-brand:** Photos that use the company\'s color palette, incorporate the logo subtly, and look formal in a setting that reflects the company culture (casual startup vs. traditional office).\\r\\n\\r\\nThink of on-brand photos as the building blocks of your company\'s visual story. They shape how the world perceives you, your work, and your brand\u2019s values.\\r\\n\\r\\nThe following are examples of off-brand images: walking in the park, listening to music, playing ukulele, or reading a book.\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![A woman walking in a park](on-brand/image6.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![A man listening to music in a park](on-brand/image5.jpg)\\r\\n\\r\\n
\\r\\n
\\r\\nA woman walking in a park\\r\\n
\\r\\n
\\r\\nA man listening to music in a park\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n![A woman walking in a park](on-brand/image25.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![A man listening to music in a park](on-brand/image15.png)\\r\\n\\r\\n
\\r\\n
\\r\\nA man playing Ukulele\\r\\n
\\r\\n
\\r\\nA woman reading a book\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n\\r\\n#### On-brand headshots of these same people would look something like this:\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![A woman walking in a park](on-brand/image16.png)\\r\\n
\\r\\n
\\r\\n\\r\\n![A man listening to music in a park](on-brand/image17.png)\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n \\r\\n![A woman walking in a park](on-brand/image22.png)\\r\\n\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n \\r\\n![A man listening to music in a park](on-brand/image24.png)\\r\\n\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n\\r\\nNow, wouldn\u2019t it be awesome if you could generate corporate headshots like these quickly and efficiently?\\r\\n\\r\\nThat\u2019s where we, Astria.ai, come in.\\r\\n\\r\\n\\r\\n# Key Features of Astria.ai\u2019s Platform\\r\\n\\r\\nAstria.ai specializes in generating Stable Diffusion images at breakneck speed. First, you get premium results. Second, you can bring your still photographs to life. Third, our API is quick and simple to use. Our key features are:\\r\\n\\r\\n\\r\\n\\r\\n1. **Backend V1:** Currently in beta, this feature helps you to completely rewrite the original image inference and processing pipeline. See the details [here](https://docs.astria.ai/docs/features/backend-v1).\\r\\n2. **Face Inpainting:** Face inpainting will try to detect a human face in the picture, and then run a second inference on top of the detected face to improve facial features. It requires the super-resolution toggle to be turned on in order to get more pixels to work with.\\r\\n3. **Face Swap**: Face-swap uses training images to enhance resemblance to the subject.\\r\\n4. **Face ID:** This is a model adapter allowing you to generate an image while preserving identity without fine-tuning. It\u2019s been trained on only human faces.\\r\\n5. **Latent Consistency Models:** This is a combination of a scheduler and a LoRA which allows image generation in 5-6 steps, thus reducing processing time.\\r\\n6. **LoRAs:** LoRAs can be used to improve the quality of the image or deepen the desired style. We provide a [LoRA gallery](https://www.astria.ai/gallery/tunes?model_type=lora) and allow importing external LoRAs.\\r\\n7. **Multi-Controlnet:** Use this tool to get better consistency and precision. See the syntax [here](https://docs.astria.ai/docs/features/multi-controlnet).\\r\\n8. **Multi-Pass Inference:** Currently in beta, this is a unique feature that allows you to generate a background image separately from the person in the foreground.\\r\\n9. **Multi-Person Inference:** Also in beta, it is a feature that allows you to generate images with multiple people in them.\\r\\n10. **Prompt Masking:** This uses a short text to create a mask from the input image. The mask can be used to inpaint parts of the image. The most popular use cases are [product shots](https://docs.astria.ai/docs/use-cases/product-shots) and [Masked Portraits](https://docs.astria.ai/docs/use-cases/masked-portraits).\\r\\n11. **Tiled Upscale:** A beta feature to improve image resolution.\\r\\n\\r\\n\\r\\n# Step-by-Step Process to Generate On-Brand Headshots\\r\\n\\r\\n\\r\\n### **Step 1: Collecting Images**\\r\\n\\r\\nTo get started, we collected images of 4 different people from the free image websites Pixabay and Pexels.\\r\\n\\r\\n\\r\\n### **Step 2: Training**\\r\\n\\r\\nNext, we will fine-tune all the 4 subjects.\\r\\n\\r\\n![alt_text](on-brand/image18.png \\"image_tooltip\\")\\r\\n\\r\\n\\r\\n**Title:** Give an appropriate title.\\r\\n\\r\\n**Class Name:** Select the correct class name from the dropdown menu. In our example, we have 2 male models and 2 female models, so we selected accordingly.\\r\\n\\r\\n**Images:** You can upload any number between 4 and 30 images. In this case, we have:\\r\\n\\r\\n*Male Model 1*: 20 images\\r\\n*Male Model 2*: 14 images\\r\\n*Female Model 1*: 7 images\\r\\n*Female Model 2*: 6 images\\r\\n\\r\\n**Advanced Options**\\r\\n\\r\\n\\r\\n![alt_text](on-brand/image3.png \\"image_tooltip\\")\\r\\n\\r\\n\\r\\n**Base Fine-tune:** We shall be using the Realistic Vision V5.1 V5.1 (VAE) model.\\r\\n\\r\\n**Model Type:** Among Checkpoint, LoRA (BETA), LoRA + Embedding - SDXL, and FaceID (free) from the dropdown, we are choosing Checkpoint.\\r\\n\\r\\n**Steps:** We advise going with the default setting here.\\r\\n\\r\\n**Token:** The token used here is \u201cohwx\u201d. Remember to use this for all Stable Diffusion prompts as an instance token for the naming process during training. \u201cohwx\u201d is utilized as a token to associate subjects or concepts with specific identifiers during training.\\r\\n\\r\\n**Face Detection:** This tool enhances face detection for training faces for different classes. Make sure not to crop the images before uploading.\\r\\n\\r\\n**Face Correct:** This tool enhances training images when the input images are low quality or low resolution. But since it can result in over-smoothing, we have not opted for it.\\r\\n\\r\\nTo know more about the dos and don\u2019ts of AI Photoshoots, visit our [documentation](https://docs.astria.ai/docs/use-cases/ai-photoshoot/).\\r\\n\\r\\n\\r\\n### **Step 3: Creating On-Brand Images**\\r\\n\\r\\nNow that the fine-tuned models are ready, we\u2019re all set to generate some awesome headshots.\\r\\n\\r\\n\\r\\n\\r\\n![alt_text](on-brand/image21.png \\"image_tooltip\\")\\r\\n\\r\\n\\r\\n\\r\\nLet\u2019s select the fine-tuned models one-by-one, and create the corresponding on-brand headshots.\\r\\n\\r\\nClick on Fine-tune, then move to: On brand image: Pexel Woman.\\r\\n\\r\\n![alt_text](on-brand/image12.png \\"image_tooltip\\")\\r\\n\\r\\n\\r\\n**Detailed Description:** Every image will require a different prompt. See the prompts we have used below.\\r\\n\\r\\n**Negative Prompts:** This comprises the characteristics that you do _not_ want in your output images. In this case, we entered the following:\\r\\n\\r\\n\\r\\n```\\r\\nold, wrinkles, mole, blemish,(oversmoothed, 3d render) scar, sad, severe, 2d, sketch, painting, digital art, drawing, disfigured, elongated body (deformed iris, deformed pupils, semi-realistic, cgi, sketch, cartoon, drawing, anime), text, cropped, out of frame, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, (extra fingers, mutated hands, poorly drawn hands, poorly drawn face), mutation, deformed, (blurry), dehydrated, bad anatomy, bad proportions, (extra limbs), cloned face, disfigured, gross proportions, (malformed limbs, missing arms, missing legs, extra arms, extra legs, fused fingers, too many fingers, NSFW), nude, underwear, muscular, elongated body, high contrast, airbrushed, blurry, disfigured, cartoon, blurry, dark lighting, low quality, low resolution, cropped, text, caption, signature, clay, kitsch, oversaturated\\r\\n```\\r\\n\\r\\n\\r\\n**Model:** There are different Stable Diffusion models you can choose from. We used Realistic Vision V5.1 V5.1 (VAE).\\r\\n\\r\\n\\r\\n#### **ControlNet/Img2Img**\\r\\n\\r\\n![alt_text](on-brand/image30.png \\"image_tooltip\\")\\r\\n\\r\\n**Image URL:** This is the place to upload a reference image, or the image you would like the final output to be based on. You could also use a URL instead. In addition to the detailed description and negative prompts, the model will refer to this image while generating the new images.\\r\\n\\r\\n**Mask URL:** Image masking is used to isolate specific areas of an image from the rest, allowing for more precise editing. It\u2019s like placing a \u201cmask\u201d over the parts of a picture you want to protect or hide while exposing the other areas for editing. In this case, we have left it blank.\\r\\n\\r\\n**Prompt Strength:** This is denoising strength. If you input 1 here, it will take the prompt and ignore the reference image. We are using the default: 0.8.\\r\\n\\r\\n**ControlNet Hint:** In the dropdown you will note the following options: Pose, Depth, Tile, Line art - Edge, Canny - Edge detection, MLSD - for architecture, HED boundaries, and QR Code. We used \u2018Pose\u2019 because we are creating professional headshots.\\r\\n\\r\\n**ControlNet Conditioning Scale:** We have used the default: 0.8.\\r\\n\\r\\n**TXT2IMG:** If you want to use this instead of Img2Img, then toggle on. In our case, we have used a reference image, so it is toggled off.\\r\\n\\r\\n\\r\\n#### **Advanced**\\r\\n\\r\\n![alt_text](on-brand/image20.png \\"image_tooltip\\")\\r\\n\\r\\n\\r\\n**Color Grading:** We have 3 color grading options - Film Velvia, Film Portra, and Ektar. In this case, we\u2019ve left it blank so that the model can take the inference from the reference image.\\r\\n\\r\\n**Width:** This will set the width of the image. We have left it blank.\\r\\n\\r\\n**Height:** This will set the height of the image. We have left it blank.\\r\\n\\r\\n**Number of Images:** The number of images can be selected from among the options - 1,2,3,4, and 8. We selected 2.\\r\\n\\r\\n**Steps:** This ranges from 10 - 50. We have kept the default: 50.\\r\\n\\r\\n**Seed:** The default is 42.\\r\\n\\r\\n**Cfg Scale:** This ranges from 0-20; the default is 7.5.\\r\\n\\r\\n**Scheduler:** Among euler, euler_a, dpm++2m_karras, dpm++sde_karras, dpm__2m, dpm++sde, and lcm, the default is euler_a. We\u2019ve kept the default.\\r\\n\\r\\n**Weighted Prompts**: You can enable the weighted prompts, but in our case, it is disabled.\\r\\n\\r\\n**Film Grain:** This adds noise to the image. We toggled on.\\r\\n\\r\\n**Super Resolution (X4):** This increases the resolution. We toggled on.\\r\\n\\r\\n**Super Resolution Details:** This is used along with Super Resolution (X4). This is toggled on.\\r\\n\\r\\n**Inpaint Faces:** This improves details on faces. It is toggled on.\\r\\n\\r\\n**Face Correct:** This does face restoration. It is toggled on.\\r\\n\\r\\n**Face Swap:** This uses training images to further enhance resemblance to the subject. This is toggled off.\\r\\n\\r\\nNow let\u2019s get to the detailed descriptions. Let\u2019s see what prompts work and what headshots they generate - all of them on-brand in our case.\\r\\n\\r\\n\\r\\n#### **On-Brand Image: Legal Profession**\\r\\n\\r\\nDetailed Description for Man:\\r\\n\\r\\n\\r\\n```\\r\\nportrait of (ohwx man) wearing a lawyer suit, bookshelf background, professional photo, white background, Amazing Details, Best Quality, 80mm Sigma f/1.4 or any ZEISS lens --tiled upscale\\r\\n```\\r\\n\\r\\n\\r\\nDetailed Description for Woman:\\r\\n\\r\\n\\r\\n```\\r\\nportrait of (ohwx woman) wearing a lawyer suit, bookshelf background, professional photo, white background, Amazing Details, Best Quality, 80mm Sigma f/1.4 or any ZEISS lens --tiled upscale\\r\\n```\\r\\n\\r\\n\\r\\nImages:\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 1](on-brand/image9.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 2](on-brand/image11.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 3](on-brand/image10.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 4](on-brand/image14.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n#### **On-Brand Image: Corporate Headshots**\\r\\n\\r\\nDetailed Description for Man:\\r\\n\\r\\n\\r\\n```\\r\\nportrait of (ohwx man) wearing a business suit, professional photo, white background, Amazing Details, Best Quality, Masterpiece, dramatic lighting highly detailed, analog photo, overglaze, 80mm Sigma f/1.4 or any ZEISS lens\\r\\n```\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nDetailed Description for Woman:\\r\\n\\r\\n\\r\\n```\\r\\nportrait of (ohwx woman) wearing a business suit, businesswoman, professional photo, white background, Amazing Details, Best Quality, 80mm Sigma f/1.4 or any ZEISS lens --tiled upscale\\r\\n```\\r\\n\\r\\n\\r\\nImages:\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 1](on-brand/image27.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 2](on-brand/image13.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 3](on-brand/image7.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 4](on-brand/image2.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n#### **On-Brand Image: Healthcare**\\r\\n\\r\\nDetailed Description for Man:\\r\\n\\r\\n\\r\\n```\\r\\nportrait of (ohwx man) wearing a labcoat,smiling, hospital, intricate details, symmetrical eyes, professional photo, detailed background, detailed fingers, detailed face, Amazing Details, Best Quality, ZEISS lens,8k high definition --tiled upscale\\r\\n```\\r\\n\\r\\n\\r\\nDetailed Description for Woman:\\r\\n\\r\\n\\r\\n```\\r\\nportrait of (ohwx woman) wearing a labcoat,smiling, hospital, intricate details, symmetrical eyes, professional photo, detailed background, detailed fingers, detailed face, Amazing Details, Best Quality, ZEISS lens, 8k high definition --tiled upscale\\r\\n```\\r\\n\\r\\n\\r\\nImages:\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 1](on-brand/image26.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 2](on-brand/image28.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 3](on-brand/image31.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 4](on-brand/image4.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n#### On-Brand Image: Manufacturing\\r\\n\\r\\nDetailed Description for Man:\\r\\n\\r\\n\\r\\n```text\\r\\nportrait of (ohwx man) wearing shirt and trousers,factory background, manufacturing professional,smiling, symmetrical eyes,detailed fingers, detailed hands, professional photo, Amazing Details, Best Quality, 80mm Sigma f/1.4 or any ZEISS lens --tiled upscale\\r\\n```\\r\\n\\r\\n\\r\\nDetailed Description for Woman:\\r\\n\\r\\n\\r\\n```text\\r\\nportrait of (ohwx woman) wearing shirt and trousers,manufacturing professional,smiling, symmetrical eyes,detailed fingers, detailed hands, professional photo, Amazing Details, Best Quality, 80mm Sigma f/1.4 or any ZEISS lens --tiled upscale\\r\\n```\\r\\n\\r\\n\\r\\nImages:\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 1](on-brand/image29.png)\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n![Image 2](on-brand/image1.png)\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n![Image 3](on-brand/image8.png)\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n![Image 4](on-brand/image23.png)\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n\\r\\n# To Summarize\\r\\n\\r\\nThere are several potential benefits to using Astria for corporate headshots over traditional photography shoots:\\r\\n\\r\\n\\r\\n\\r\\n* **Cost-Effectiveness:** AI-generated headshots can be significantly cheaper than hiring a professional photographer, renting a studio, and so on\\r\\n* **Scalability:** AI can generate a large number of headshots quickly and easily. This is especially beneficial for companies with a large number of employees.\\r\\n* **Customization:** With AI, you can fine-tune the generation process to create headshots that meet your specific needs. For example, you can specify the desired clothing, background, and lighting.\\r\\n* **Control over Revisions:** If you don\'t like an AI-generated headshot, you can simply generate another one. This can save time and money compared to reshooting a traditional headshot.\\r\\n* **Accessibility:** AI-generated headshots can be created from anywhere in the world, without the need to travel to a photography studio.\\r\\n\\r\\nGenerating corporate headshots is one of the many cool things you can do on our platform. Keep reading our other blogs to find out about our exciting new features."},{"id":"/multi-pass-inference","metadata":{"permalink":"/articles/multi-pass-inference","source":"@site/blog/multi-pass-inference.md","title":"How to Use Astria.ai\'s Multi-Pass Inference for Highly Controlled Stable Diffusion Image Generation","description":"How to Generate Striking Images with Astria.ai\'s Multi-Pass Inference","date":"2024-02-04T13:12:25.000Z","formattedDate":"February 4, 2024","tags":[],"readingTime":8.665,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"How to Use Astria.ai\'s Multi-Pass Inference for Highly Controlled Stable Diffusion Image Generation","description":"How to Generate Striking Images with Astria.ai\'s Multi-Pass Inference"},"prevItem":{"title":"Generate On-Brand Corporate Headshots in Minutes by Fine-Tuning Stable Diffusion Models on Astria.ai","permalink":"/articles/on-brand"}},"content":"Welcome to Astria.ai.\\n\\nIn our first blog post, we\u2019ll take a deep dive into how you can generate very detailed images using a multi-pass inference method. We\u2019ll show you how to structure high-quality prompts to generate visuals of professional quality.\\n\\n\\n## What Is Multi-Pass Inference?\\n\\nFirst, let\u2019s discuss what multi-pass inference is. Multi-pass inference is essentially a technique where you can generate the background of the composition independently from the foreground. On Astria.ai this control is achieved through multiple breaks in the prompting technique. The base image (i.e. the background elements) is generated separately via the first part of the prompt. Then using the next breaks in the prompt the subject is in-painted onto the base image.\\n\\nHere\'s how multi-pass inference enhances control over the background of an image:\\n\\n\\n### 1. Iterative Refinement\\n\\nIn a multi-pass inference, you have the opportunity to adjust and refine the background in a separate pass. This iterative process allows you to steer the image generation towards your desired outcome.\\n\\n\\n### 2. Choice over base model\\n\\nMulti-pass inference allows for choice over the base model thereby giving the users the option to use a variety of pre-trained models like Realistic Vision, Absolute Reality, and other Stable Diffusion models.\\n\\n\\n### 3. Increased Precision and Detailing\\n\\nWith multiple inference steps, you have more chances to introduce specific details or adjustments to the background. This can include changing its color scheme, adding or removing elements, or altering its overall style. Such precision is often not achievable in a single pass, where the model\'s output is more dependent on the initial prompt and less on a multi-step method.\\n\\n\\n### 4. Balancing Foreground and Background\\n\\nMulti-pass inference allows for a more balanced composition between the foreground and the background so that you can modify the background in a way that it complements the foreground elements more effectively.\\n\\nAs an example take a look at these two images of a man wearing sportswear and posing inside a gym. The first one was generated in a single prompt, while for the second one we used a multi-pass approach.\\n\\n
\\n\\n
\\n
Without multi-pass
\\n\\n![alt_text](multi-pass-inference/image7.png)\\n
\\n\\n
\\n
With multi-pass
\\n\\n![alt_text](multi-pass-inference/image6.png)\\n
\\n\\n
\\n\\n\\n\\nAs you can see in the second image the background has more character to it. The elements of the gym are more prominent as compared to the former.\\n\\n\\n## How Multi-Pass Inference Can Benefit Your Business\\n\\nThe enhanced control over image backgrounds provided by multi-pass inference offers significant benefits for businesses in various domains. By precisely tailoring image backgrounds, companies can maintain a consistent visual brand identity, crucial for marketing, advertising, and establishing a strong social media presence.\\n\\nFor e-commerce and retail sectors, the background of product images plays a critical role in shaping customer perception. Tailoring these backgrounds to complement the products not only enhances their appeal but also provides clearer context, which can lead to increased sales.\\n\\nMoreover, multi-pass inference enables rapid and cost-effective creation of high-quality, bespoke images. This reduces the reliance on expensive photoshoots and graphic design work, presenting a more economical approach to content creation. Businesses can easily modify image backgrounds to suit various platforms and formats, such as social media, websites, and print media, ensuring optimal visual presentation across all channels.\\n\\nLastly, in a digital landscape overflowing with visual content, unique and tailored images with custom backgrounds provide businesses with a competitive edge. Such visuals are more likely to capture audience interest in a crowded market, standing out from standard, generic content. Therefore, the ability to control image backgrounds through multi-pass inference is not just a technical advantage but a strategic tool for branding, marketing, product presentation, and creating visually compelling content that differentiates a business in the market.\\n\\n\\n## How Astria.ai makes Multi-pass inferencing easy\\n\\nMulti-pass inferencing, particularly in the context of advanced generative models like Stable Diffusion, often requires a developer\'s expertise due to several technical complexities. At Astria.ai, we provide a user-friendly apis that can significantly simplify this process for users who do not possess extensive technical know-how.\\n\\nLet\u2019s first understand how a developer\u2019s expertise is needed and then we\u2019ll show how Astria.ai makes this process easier.\\n\\nIf one were to fine-tune and implement Stable Diffusion for multi-pass inferencing one would need a fair understanding of how these machine learning models work so that they can adjust parameters for different passes. This would require a fair amount of coding skills especially for customizing the inference process, integrating different components (like schedulers, encoders, decoders), and handling data preprocessing and postprocessing. Developers must be proficient in relevant programming languages and frameworks.\\n\\nMoreover each pass in multi-pass inferencing may require adjustments to optimize the output. Developers need to troubleshoot issues, fine-tune parameters, and experiment with different configurations to achieve the desired results, which demands both technical skills and problem-solving abilities. Lastly, generative models can be resource-intensive. Developers need to manage and optimize the use of computational resources like GPUs, especially when working with large models or high-resolution images.\\n\\nAstria.ai simplifies the above procedures by providing simple APIs that abstract the complexities of the underlying model. The platform also comes with pre-configured settings and templates showcased in the gallery that users can select from, reducing the time to do prompt engineering, and helping understand the breadth of options available. This includes predefined prompts, styles, and optimization settings. Apart from this Astria also handles the computational resource management in the background, allowing users to focus on the creative aspects of image generation without worrying about technical constraints.\\n\\nOverall, while multi-pass inferencing with AI models requires considerable technical expertise due to its complexity, a platform like Astria.ai democratizes this capability by providing easy-to-use api and automated workflows, making advanced image generation accessible to developers.\\n\\n\\n## Step-by-Step Guide to Creating Images for a Sportswear Brand Using Multi-Pass Inferencing\\n\\n### Step 1: Training\\n\\nFirst, create a fine-tune of your subject.\\n\\n![alt_text](multi-pass-inference/image10.png)\\n\\n\\nSelect the model type as LORA. This is a fast and efficient way to train the model, as it only trains an adapter layer on top of the base model, instead of training all the weights which is typically the case if we select the Checkpoint Model type.\\n\\nWe used the following images of a male model obtained from a royalty free collection (Pixabay):\\n\\n\\n![alt_text](multi-pass-inference/image4.jpg)\\n\\n\\nOnce the tune is ready, we can begin to prompt. Click on your tune.\\n\\n![alt_text](multi-pass-inference/image3.png)\\n\\n\\n### Step 2 Inference\\n\\nLet\u2019s first look at the structure of our prompt. Suppose you have to create images to market a sportswear brand.\\n\\n\\n```\\n(medium shot) of a male model wearing hiking clothes and shoes, standing in a dense forest, behind him is a small waterfall.\\nBREAK photorealistic and highly detailed\\nBREAK ohwx man wearing hiking clothes and shoes \\n```\\n\\n* The first line contains the base prompt to generate the background and the overall composition.\\n* The second line is a common prompt that is added both to the base prompt and the person prompt, in order to avoid repetition.\\n* The third line is the person prompt, to detail how our subject is composed in the foreground. The statement - <lora:960310:1.0> - is added to load the fine-tuned model of our subject.\\n\\n```\\nNegative Prompt: (brand logos on t-shirt), (worst quality, greyscale), watermark, username, signature, text, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, jpeg artifacts, bad feet, extra fingers, mutated hands, poorly drawn hands, bad proportions, extra limbs, disfigured, bad anatomy, gross proportions, malformed limbs, missing arms, missing legs, extra arms, extra legs, mutated hands, fused fingers, too many fingers, long neck\\n```\\n\\n\\n\\nThe negative prompt is a list of prompts we want to avoid in our generated image. Anything placed in parentheses applies extra weights to that prompt.\\n\\nWe can add an input image if we want our generated image to follow an input template. On the ControlNet Hint dropdown menu, we can select pose, if we want to copy the pose of the subject from the input image. Select the Text2img toggle to be true, that\u2019ll preserve the pose of the image. (recommended). If you want the semantics i.e. the looks and feels of the original image as well, then go for Img2img.\\n\\nFor example, let\u2019s take this pose as our input image:\\n\\n\\n![alt_text](multi-pass-inference/image5.jpg)\\n\\n\\nAlso, keep the Inpaint Faces and Face Swap toggle on. Inpaint Faces iterates one more time over the faces of the subject to ensure that there is no distortion in the outcome, while the Face Swap option ensures that the face of our model is taken from the training images and swapped in the generated image to enhance resemblance in the final output.\\n\\nLet\u2019s look at the result of our first prompt:\\n\\n\\n![alt_text](multi-pass-inference/image8.png)\\n\\n\\nAs you can see, the ControlNet has ensured that the output pose is similar to the pose of the input image.\\n\\n### Step 3: Examples\\n\\nPrompt 2:\\n```\\na man at the finish line of a race on an olympic track\\nBREAK sharp details\\nBREAK ohwx man wearing running clothes and shoes, jubilant expression on his face<lora:960310:1.0>\\n\\nNegative: anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, long neck, disfigured, fused lips,\\n```\\n\\n![alt_text](multi-pass-inference/image9.png)\\n\\n\\nPrompt 3:\\n\\n```\\nfull body workout in a vibrant gym, action, perspective, speed, movement, ripped, push ups fit\\nBREAK sharp details, realistic image, Porta 160 color, ARRI ALEXA 65\\nBREAK ohwx man doing push-ups, intense look on his face \\n\\nNegative: anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, long neck, disfigured, fused lips,\\n```\\n\\n![alt_text](multi-pass-inference/image1.png)\\n\\n\\nPrompt 4:\\n(wide shot) of a man walking at night on the streets of New York, warm lighting, photorealistic\\n\\n```\\nBREAK\\nBREAK ohwx man wearing casual sports wear<lora:960310:1.0>\\nNegative: hat, cartoon, ugly\\n```\\n\\n\\n\\n![alt_text](multi-pass-inference/image2.png)\\n\\n\\n\\n## Final Note\\n\\nThe above steps can be used to generate product photography or e-commerce images. With multi-pass inference, you can gain a huge amount of control over your image backgrounds vis a vis the foreground. This technique allows you to iteratively refine and tailor the background details, ensuring that they align with your vision and objectives.\\n\\nWhether you\'re looking to create images for branding, marketing, storytelling, or artistic expression, multi-pass inference by Astria.ai provides the flexibility and precision to shape the background just as you need it. You can now harness this tool to bring depth, context, and nuance to your visual content, making your image speak in harmony with your creative goals."}]}')}}]); \ No newline at end of file diff --git a/assets/js/dff5557a.5f50d223.js b/assets/js/dff5557a.5f50d223.js new file mode 100644 index 0000000..cb0ce2f --- /dev/null +++ b/assets/js/dff5557a.5f50d223.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkastria_docs_2=self.webpackChunkastria_docs_2||[]).push([[596],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>u});var i=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=i.createContext({}),d=function(e){var t=i.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},p=function(e){var t=d(e.components);return i.createElement(s.Provider,{value:t},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var a=e.components,n=e.mdxType,r=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),c=d(a),m=n,u=c["".concat(s,".").concat(m)]||c[m]||g[m]||r;return a?i.createElement(u,l(l({ref:t},p),{},{components:a})):i.createElement(u,l({ref:t},p))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=a.length,l=new Array(r);l[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[c]="string"==typeof e?e:n,l[1]=o;for(var d=2;d{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>g,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var i=a(7462),n=(a(7294),a(3905));const r={},l="Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion",o={permalink:"/articles/real-estate",source:"@site/blog/real-estate.md",title:"Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion",description:"Virtual staging is the process of digitally adding furniture, decor, and other elements to photos of empty or sparsely furnished spaces. Along with Stable Diffusion, it can significantly improve real estate listings by creating realistic and attractive virtual staging.",date:"2024-04-24T16:27:48.000Z",formattedDate:"April 24, 2024",tags:[],readingTime:6.015,hasTruncateMarker:!1,authors:[],frontMatter:{},prevItem:{title:"Exploring Virtual Fashion: Garment Try-On with Astria",permalink:"/articles/virtual-tryon"},nextItem:{title:"Create Studio-Quality Custom Portraits Instantly with Astria's FaceID Tool",permalink:"/articles/face-id"}},s={authorsImageUrls:[]},d=[],p={toc:d},c="wrapper";function g(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,i.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Virtual staging is the process of digitally adding furniture, decor, and other elements to photos of empty or sparsely furnished spaces. Along with Stable Diffusion, it can significantly improve real estate listings by creating realistic and attractive virtual staging."),(0,n.kt)("p",null,"Digital staging transforms cold, empty rooms into warm, inviting spaces that help buyers emotionally connect with a property. A 2023 report by Realtor.com found that staged homes sell 88% faster and for an average of 20% more than non-staged homes."),(0,n.kt)("h1",{id:"why-virtual-staging-is-needed"},"Why Virtual Staging Is Needed"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Empty spaces lack appeal: Unfurnished rooms can appear cold and uninviting, making it difficult for potential buyers to visualize themselves living in the space."),(0,n.kt)("li",{parentName:"ul"},"Traditional staging is expensive: Physically staging a property requires furniture rentals, which can be costly and time-consuming."),(0,n.kt)("li",{parentName:"ul"},"Showcases potential: Virtual staging allows showcasing a space's full potential. Buyers can see how furniture can be arranged and how the space can function for their needs.")),(0,n.kt)("h1",{id:"advantages-of-using-astriaai-for-virtual-staging"},"Advantages of Using Astria.ai for Virtual Staging"),(0,n.kt)("p",null,"The advantages of using Astria.ai for virtual staging are many:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cost-Effective: Compared to traditional staging, Astria offers a much more affordable way to virtually stage a property."),(0,n.kt)("li",{parentName:"ul"},"Speed and Efficiency: Astria can generate virtual staging variations in minutes, allowing realtors to experiment with different styles and layouts."),(0,n.kt)("li",{parentName:"ul"},"Customization: With clear prompts and descriptions, it can create virtual staging that reflects the property's style, target demographic, and current design trends.")),(0,n.kt)("p",null,"Astria.ai simplifies virtual staging by harnessing cutting-edge AI technology, making it effortless to digitally stage listings with realistic results. Here's how Astria.ai achieves this:"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Controlnets: Users input text descriptions to control the composition, style, and content of the staged photo."),(0,n.kt)("li",{parentName:"ol"},"MLSD (Multi-Level Scene Description): Breaks down a room into its components, ensuring realistic staging."),(0,n.kt)("li",{parentName:"ol"},"Compositional Understanding: AI arranges furniture and decor based on interior design principles."),(0,n.kt)("li",{parentName:"ol"},"Backend Version-1: Proprietary machine learning infrastructure enables fast, high-quality staging.")),(0,n.kt)("p",null,"Backend Version-1 improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Hi-Res (Super-Resolution Details) for sharper images."),(0,n.kt)("li",{parentName:"ul"},"Faster processing times."),(0,n.kt)("li",{parentName:"ul"},"Better handling of multiple LoRAs."),(0,n.kt)("li",{parentName:"ul"},"Improved results with DPM++/Karras and DPM++SDE/Karras samplers.")),(0,n.kt)("p",null,"Multi-Controlnet, available only for Backend Version-1, combines multiple Controlnets for better consistency and precision."),(0,n.kt)("h1",{id:"how-to-use-astriaai"},"How to Use Astria.ai"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Sign up at Astria.ai."),(0,n.kt)("li",{parentName:"ol"},"Go to ",(0,n.kt)("a",{parentName:"li",href:"https://www.astria.ai/prompts"},"https://www.astria.ai/prompts"),"."),(0,n.kt)("li",{parentName:"ol"},"Select Advanced and ControlNet/Img2Img Option.")),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"alt_text",src:a(7391).Z,title:"image_tooltip",width:"1999",height:"1067"})),(0,n.kt)("ol",{start:4},(0,n.kt)("li",{parentName:"ol"},"Upload your image using Choose File."),(0,n.kt)("li",{parentName:"ol"},"Select 1 - BETA under Backend version."),(0,n.kt)("li",{parentName:"ol"},"Write out a description under Detailed Description and add \u201c-- controlnets MLSD\u201d at the end of it. --controlnet_weights 0.5 gives the best results."),(0,n.kt)("li",{parentName:"ol"},"Also use --mask_prompt windows door --mask_invert, to make sure that the windows and the doors are preserved from the original image."),(0,n.kt)("li",{parentName:"ol"},"Additionally you can add a few Loras as suggested in the docs ",(0,n.kt)("a",{parentName:"li",href:"https://docs.astria.ai/docs/use-cases/room-redesign"},"here "),"to improve the overall quality of the image."),(0,n.kt)("li",{parentName:"ol"},"Click Create Image.")),(0,n.kt)("h1",{id:"easy-hacks-to-enhance-your-listings"},"Easy Hacks to Enhance Your Listings"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Gather High-Quality Photos: The process works best with clear and well-lit photos of the empty rooms."),(0,n.kt)("li",{parentName:"ol"},"Define the Virtual Staging Style: Consider the property's target audience and the overall feel you want to create (modern, traditional, family-friendly etc.)."),(0,n.kt)("li",{parentName:"ol"},"Craft Text Prompts: Provide detailed descriptions of the desired furniture, decor, and overall ambiance."),(0,n.kt)("li",{parentName:"ol"},"Generate Variations: You can generate multiple virtual staging options to choose from, allowing for A/B testing to see which resonates best with potential buyers."),(0,n.kt)("li",{parentName:"ol"},"Refine and Integrate: Minor adjustments might be needed to ensure a seamless integration of the virtual staging with the original photo.")),(0,n.kt)("h1",{id:"virtual-staging-applications-on-astriaai"},"Virtual Staging Applications on Astria.ai"),(0,n.kt)("p",null,"In this section, let\u2019s look at how you can actually use Astria to transform empty spaces into vibrant, inviting rooms."),(0,n.kt)("p",null,"See below:"),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"Original Image => AI Generated Image by Astria.ai")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A serene and opulent private bedroom, featuring a plush king-size bed with a tufted velvet headboard and a delicate crystal chandelier above, surrounded by richly textured walls in a soothing gray tone, and a lavish area rug in a soft, creamy color, with a comfortable reading nook by the window, complete with a oversized armchair and a matching ottoman, and a spacious walk-in closet with custom cabinetry and a marble-topped dresser, all bathed in a warm, golden light, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(9210).Z,width:"371",height:"277"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(1267).Z,width:"395",height:"296"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A modern office room with a minimalist aesthetic, featuring a sleek wooden desk with a silver laptop and a ergonomic chair, surrounded by floor-to-ceiling windows with a cityscape view, and a few potted plants on a shelf, with walls lined with tall cabinets filled with neatly organized books and files, and a subtle warm lighting and a hint of natural light, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(9013).Z,width:"370",height:"270"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(9023).Z,width:"397",height:"294"}))))),(0,n.kt)("p",null,"A contemporary office space with an industrial chic vibe, featuring a reclaimed wood desk with a vintage-inspired lamp and a worn leather office chair, surrounded by exposed brick walls and polished concrete floors, with a floor-to-ceiling metal shelving unit filled with vintage books and decorative objects, and a large glass door leading to a private outdoor patio with a city view, in a 3D rendering style ","<","lora:epi_noiseoffset2:0.5>","<","lora:FilmVelvia2:0.5>","<","lora:add_detail:0.5>","<","lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5"),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(5236).Z,width:"372",height:"278"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(4879).Z,width:"397",height:"297"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A sleek and modern home gym, featuring a spacious open floor plan with high ceilings and large windows allowing for natural light, equipped with a variety of high-end exercise equipment including a treadmill, stationary bike, and free weights, surrounded by mirrored walls and a polished wood floor, with a comfortable seating area for relaxation and a large flat-screen TV for entertainment, and a modern sound system for an immersive workout experience, in a 3D rendering style\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(8275).Z,width:"369",height:"231"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(4033).Z,width:"395",height:"246"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"Coastal-themed nursery: an empty room staged as a serene coastal-themed nursery with a white crib, soft blue accents, shiplap wall, and nautical decor elements \u2013 controlnets MLSD Composition\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(8588).Z,width:"367",height:"245"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(8760).Z,width:"395",height:"264"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A peaceful and calming meditation room, featuring a serene and minimalist space with a focus on natural materials and textures, including a reclaimed wood floor, a stone feature wall, and a live edge wooden meditation bench, surrounded by floor-to-ceiling windows allowing for an abundance of natural light and a connection to nature, with a few carefully placed plants and a subtle water feature creating a sense of tranquility, and a soft, warm glow emanating from candles or string lights, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(6942).Z,width:"331",height:"492"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(329).Z,width:"396",height:"593"}))))),(0,n.kt)("p",null,"Here are the original images sources:"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/brk/apa/d/brooklyn-expansive-loft-in-bushwick/7731612663.html"},"https://newyork.craigslist.org/brk/apa/d/brooklyn-expansive-loft-in-bushwick/7731612663.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/brk/apa/d/brooklyn-below-market-basic-bedroom/7731562165.html"},"https://newyork.craigslist.org/brk/apa/d/brooklyn-below-market-basic-bedroom/7731562165.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/mnh/apa/d/new-york-bright-corner-studio-laundry/7731512365.html"},"https://newyork.craigslist.org/mnh/apa/d/new-york-bright-corner-studio-laundry/7731512365.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/brk/apa/d/brooklyn-bed-in-williamsburg-no-fee/7731545442.html"},"https://newyork.craigslist.org/brk/apa/d/brooklyn-bed-in-williamsburg-no-fee/7731545442.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://hudsonvalley.craigslist.org/apa/d/pearl-river-pearl-river-jewel-1br/7733791169.html"},"https://hudsonvalley.craigslist.org/apa/d/pearl-river-pearl-river-jewel-1br/7733791169.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://slowmotionmama.com/7-reasons-to-empty-a-space-before-decluttering/"},"https://slowmotionmama.com/7-reasons-to-empty-a-space-before-decluttering/")),(0,n.kt)("h1",{id:"to-summarize"},"To Summarize"),(0,n.kt)("p",null,"The benefits of AI virtual staging are many: accelerated sales, increased property values, and a streamlined marketing experience."),(0,n.kt)("p",null,"Things to remember:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Maintain Realism: While this AI tool is powerful, it's crucial to ensure the generated virtual staging looks realistic and avoids nonsensical elements."),(0,n.kt)("li",{parentName:"ul"},"Transparency: You may choose to disclose that virtual staging is used in the listing description to build trust with potential buyers.")))}g.isMDXComponent=!0},5236:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image1-be916a621a520b2ef8a7a6e4b8883ef1.png"},4879:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image10-35a8f0d9c331270e5a86b51979ac6432.png"},8760:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image11-b337bcdfc5f41aa2b19c73313da876e5.png"},329:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image12-19bbab97b061ef8347297d085ef61cd5.png"},9013:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image13-40d31c09df5b4fd9875928f8b45c9faf.png"},8588:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image2-493bfb8cd2175b49d8ff8277167d4e08.png"},7391:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image3-74b1da5ab268a8ab2318e6c3765bd919.png"},1267:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image4-078eb9dff48587b6c9b2c9260118adbd.png"},9023:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image5-38f7881cc5a0102037f78e10619b6f6d.png"},6942:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image6-fce6e2d70023f563e3bf857c2d3d178f.png"},9210:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image7-acd610ab0131013cc285e2ddc9e3168a.png"},4033:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image8-61ade0895e47d04ada3a450e51eb833d.png"},8275:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image9-0e21640ec733385aabf141dd9e67d65a.png"}}]); \ No newline at end of file diff --git a/assets/js/dff5557a.c6ceda4e.js b/assets/js/dff5557a.c6ceda4e.js deleted file mode 100644 index 3d9d07e..0000000 --- a/assets/js/dff5557a.c6ceda4e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkastria_docs_2=self.webpackChunkastria_docs_2||[]).push([[596],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>u});var i=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=i.createContext({}),d=function(e){var t=i.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},p=function(e){var t=d(e.components);return i.createElement(s.Provider,{value:t},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var a=e.components,n=e.mdxType,r=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),c=d(a),m=n,u=c["".concat(s,".").concat(m)]||c[m]||g[m]||r;return a?i.createElement(u,l(l({ref:t},p),{},{components:a})):i.createElement(u,l({ref:t},p))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=a.length,l=new Array(r);l[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[c]="string"==typeof e?e:n,l[1]=o;for(var d=2;d{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>g,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var i=a(7462),n=(a(7294),a(3905));const r={},l="Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion",o={permalink:"/articles/real-estate",source:"@site/blog/real-estate.md",title:"Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion",description:"Virtual staging is the process of digitally adding furniture, decor, and other elements to photos of empty or sparsely furnished spaces. Along with Stable Diffusion, it can significantly improve real estate listings by creating realistic and attractive virtual staging.",date:"2024-04-24T16:27:48.000Z",formattedDate:"April 24, 2024",tags:[],readingTime:6.015,hasTruncateMarker:!1,authors:[],frontMatter:{},nextItem:{title:"Create Studio-Quality Custom Portraits Instantly with Astria's FaceID Tool",permalink:"/articles/face-id"}},s={authorsImageUrls:[]},d=[],p={toc:d},c="wrapper";function g(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,i.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Virtual staging is the process of digitally adding furniture, decor, and other elements to photos of empty or sparsely furnished spaces. Along with Stable Diffusion, it can significantly improve real estate listings by creating realistic and attractive virtual staging."),(0,n.kt)("p",null,"Digital staging transforms cold, empty rooms into warm, inviting spaces that help buyers emotionally connect with a property. A 2023 report by Realtor.com found that staged homes sell 88% faster and for an average of 20% more than non-staged homes."),(0,n.kt)("h1",{id:"why-virtual-staging-is-needed"},"Why Virtual Staging Is Needed"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Empty spaces lack appeal: Unfurnished rooms can appear cold and uninviting, making it difficult for potential buyers to visualize themselves living in the space."),(0,n.kt)("li",{parentName:"ul"},"Traditional staging is expensive: Physically staging a property requires furniture rentals, which can be costly and time-consuming."),(0,n.kt)("li",{parentName:"ul"},"Showcases potential: Virtual staging allows showcasing a space's full potential. Buyers can see how furniture can be arranged and how the space can function for their needs.")),(0,n.kt)("h1",{id:"advantages-of-using-astriaai-for-virtual-staging"},"Advantages of Using Astria.ai for Virtual Staging"),(0,n.kt)("p",null,"The advantages of using Astria.ai for virtual staging are many:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cost-Effective: Compared to traditional staging, Astria offers a much more affordable way to virtually stage a property."),(0,n.kt)("li",{parentName:"ul"},"Speed and Efficiency: Astria can generate virtual staging variations in minutes, allowing realtors to experiment with different styles and layouts."),(0,n.kt)("li",{parentName:"ul"},"Customization: With clear prompts and descriptions, it can create virtual staging that reflects the property's style, target demographic, and current design trends.")),(0,n.kt)("p",null,"Astria.ai simplifies virtual staging by harnessing cutting-edge AI technology, making it effortless to digitally stage listings with realistic results. Here's how Astria.ai achieves this:"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Controlnets: Users input text descriptions to control the composition, style, and content of the staged photo."),(0,n.kt)("li",{parentName:"ol"},"MLSD (Multi-Level Scene Description): Breaks down a room into its components, ensuring realistic staging."),(0,n.kt)("li",{parentName:"ol"},"Compositional Understanding: AI arranges furniture and decor based on interior design principles."),(0,n.kt)("li",{parentName:"ol"},"Backend Version-1: Proprietary machine learning infrastructure enables fast, high-quality staging.")),(0,n.kt)("p",null,"Backend Version-1 improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Hi-Res (Super-Resolution Details) for sharper images."),(0,n.kt)("li",{parentName:"ul"},"Faster processing times."),(0,n.kt)("li",{parentName:"ul"},"Better handling of multiple LoRAs."),(0,n.kt)("li",{parentName:"ul"},"Improved results with DPM++/Karras and DPM++SDE/Karras samplers.")),(0,n.kt)("p",null,"Multi-Controlnet, available only for Backend Version-1, combines multiple Controlnets for better consistency and precision."),(0,n.kt)("h1",{id:"how-to-use-astriaai"},"How to Use Astria.ai"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Sign up at Astria.ai."),(0,n.kt)("li",{parentName:"ol"},"Go to ",(0,n.kt)("a",{parentName:"li",href:"https://www.astria.ai/prompts"},"https://www.astria.ai/prompts"),"."),(0,n.kt)("li",{parentName:"ol"},"Select Advanced and ControlNet/Img2Img Option.")),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"alt_text",src:a(7391).Z,title:"image_tooltip",width:"1999",height:"1067"})),(0,n.kt)("ol",{start:4},(0,n.kt)("li",{parentName:"ol"},"Upload your image using Choose File."),(0,n.kt)("li",{parentName:"ol"},"Select 1 - BETA under Backend version."),(0,n.kt)("li",{parentName:"ol"},"Write out a description under Detailed Description and add \u201c-- controlnets MLSD\u201d at the end of it. --controlnet_weights 0.5 gives the best results."),(0,n.kt)("li",{parentName:"ol"},"Also use --mask_prompt windows door --mask_invert, to make sure that the windows and the doors are preserved from the original image."),(0,n.kt)("li",{parentName:"ol"},"Additionally you can add a few Loras as suggested in the docs ",(0,n.kt)("a",{parentName:"li",href:"https://docs.astria.ai/docs/use-cases/room-redesign"},"here "),"to improve the overall quality of the image."),(0,n.kt)("li",{parentName:"ol"},"Click Create Image.")),(0,n.kt)("h1",{id:"easy-hacks-to-enhance-your-listings"},"Easy Hacks to Enhance Your Listings"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Gather High-Quality Photos: The process works best with clear and well-lit photos of the empty rooms."),(0,n.kt)("li",{parentName:"ol"},"Define the Virtual Staging Style: Consider the property's target audience and the overall feel you want to create (modern, traditional, family-friendly etc.)."),(0,n.kt)("li",{parentName:"ol"},"Craft Text Prompts: Provide detailed descriptions of the desired furniture, decor, and overall ambiance."),(0,n.kt)("li",{parentName:"ol"},"Generate Variations: You can generate multiple virtual staging options to choose from, allowing for A/B testing to see which resonates best with potential buyers."),(0,n.kt)("li",{parentName:"ol"},"Refine and Integrate: Minor adjustments might be needed to ensure a seamless integration of the virtual staging with the original photo.")),(0,n.kt)("h1",{id:"virtual-staging-applications-on-astriaai"},"Virtual Staging Applications on Astria.ai"),(0,n.kt)("p",null,"In this section, let\u2019s look at how you can actually use Astria to transform empty spaces into vibrant, inviting rooms."),(0,n.kt)("p",null,"See below:"),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"Original Image => AI Generated Image by Astria.ai")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A serene and opulent private bedroom, featuring a plush king-size bed with a tufted velvet headboard and a delicate crystal chandelier above, surrounded by richly textured walls in a soothing gray tone, and a lavish area rug in a soft, creamy color, with a comfortable reading nook by the window, complete with a oversized armchair and a matching ottoman, and a spacious walk-in closet with custom cabinetry and a marble-topped dresser, all bathed in a warm, golden light, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(9210).Z,width:"371",height:"277"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(1267).Z,width:"395",height:"296"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A modern office room with a minimalist aesthetic, featuring a sleek wooden desk with a silver laptop and a ergonomic chair, surrounded by floor-to-ceiling windows with a cityscape view, and a few potted plants on a shelf, with walls lined with tall cabinets filled with neatly organized books and files, and a subtle warm lighting and a hint of natural light, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(9013).Z,width:"370",height:"270"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(9023).Z,width:"397",height:"294"}))))),(0,n.kt)("p",null,"A contemporary office space with an industrial chic vibe, featuring a reclaimed wood desk with a vintage-inspired lamp and a worn leather office chair, surrounded by exposed brick walls and polished concrete floors, with a floor-to-ceiling metal shelving unit filled with vintage books and decorative objects, and a large glass door leading to a private outdoor patio with a city view, in a 3D rendering style ","<","lora:epi_noiseoffset2:0.5>","<","lora:FilmVelvia2:0.5>","<","lora:add_detail:0.5>","<","lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5"),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(5236).Z,width:"372",height:"278"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(4879).Z,width:"397",height:"297"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A sleek and modern home gym, featuring a spacious open floor plan with high ceilings and large windows allowing for natural light, equipped with a variety of high-end exercise equipment including a treadmill, stationary bike, and free weights, surrounded by mirrored walls and a polished wood floor, with a comfortable seating area for relaxation and a large flat-screen TV for entertainment, and a modern sound system for an immersive workout experience, in a 3D rendering style\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(8275).Z,width:"369",height:"231"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(4033).Z,width:"395",height:"246"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"Coastal-themed nursery: an empty room staged as a serene coastal-themed nursery with a white crib, soft blue accents, shiplap wall, and nautical decor elements \u2013 controlnets MLSD Composition\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(8588).Z,width:"367",height:"245"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(8760).Z,width:"395",height:"264"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A peaceful and calming meditation room, featuring a serene and minimalist space with a focus on natural materials and textures, including a reclaimed wood floor, a stone feature wall, and a live edge wooden meditation bench, surrounded by floor-to-ceiling windows allowing for an abundance of natural light and a connection to nature, with a few carefully placed plants and a subtle water feature creating a sense of tranquility, and a soft, warm glow emanating from candles or string lights, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(6942).Z,width:"331",height:"492"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(329).Z,width:"396",height:"593"}))))),(0,n.kt)("p",null,"Here are the original images sources:"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/brk/apa/d/brooklyn-expansive-loft-in-bushwick/7731612663.html"},"https://newyork.craigslist.org/brk/apa/d/brooklyn-expansive-loft-in-bushwick/7731612663.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/brk/apa/d/brooklyn-below-market-basic-bedroom/7731562165.html"},"https://newyork.craigslist.org/brk/apa/d/brooklyn-below-market-basic-bedroom/7731562165.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/mnh/apa/d/new-york-bright-corner-studio-laundry/7731512365.html"},"https://newyork.craigslist.org/mnh/apa/d/new-york-bright-corner-studio-laundry/7731512365.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/brk/apa/d/brooklyn-bed-in-williamsburg-no-fee/7731545442.html"},"https://newyork.craigslist.org/brk/apa/d/brooklyn-bed-in-williamsburg-no-fee/7731545442.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://hudsonvalley.craigslist.org/apa/d/pearl-river-pearl-river-jewel-1br/7733791169.html"},"https://hudsonvalley.craigslist.org/apa/d/pearl-river-pearl-river-jewel-1br/7733791169.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://slowmotionmama.com/7-reasons-to-empty-a-space-before-decluttering/"},"https://slowmotionmama.com/7-reasons-to-empty-a-space-before-decluttering/")),(0,n.kt)("h1",{id:"to-summarize"},"To Summarize"),(0,n.kt)("p",null,"The benefits of AI virtual staging are many: accelerated sales, increased property values, and a streamlined marketing experience."),(0,n.kt)("p",null,"Things to remember:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Maintain Realism: While this AI tool is powerful, it's crucial to ensure the generated virtual staging looks realistic and avoids nonsensical elements."),(0,n.kt)("li",{parentName:"ul"},"Transparency: You may choose to disclose that virtual staging is used in the listing description to build trust with potential buyers.")))}g.isMDXComponent=!0},5236:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image1-be916a621a520b2ef8a7a6e4b8883ef1.png"},4879:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image10-35a8f0d9c331270e5a86b51979ac6432.png"},8760:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image11-b337bcdfc5f41aa2b19c73313da876e5.png"},329:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image12-19bbab97b061ef8347297d085ef61cd5.png"},9013:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image13-40d31c09df5b4fd9875928f8b45c9faf.png"},8588:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image2-493bfb8cd2175b49d8ff8277167d4e08.png"},7391:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image3-74b1da5ab268a8ab2318e6c3765bd919.png"},1267:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image4-078eb9dff48587b6c9b2c9260118adbd.png"},9023:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image5-38f7881cc5a0102037f78e10619b6f6d.png"},6942:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image6-fce6e2d70023f563e3bf857c2d3d178f.png"},9210:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image7-acd610ab0131013cc285e2ddc9e3168a.png"},4033:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image8-61ade0895e47d04ada3a450e51eb833d.png"},8275:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image9-0e21640ec733385aabf141dd9e67d65a.png"}}]); \ No newline at end of file diff --git a/assets/js/f4a4ea7e.15b11bde.js b/assets/js/f4a4ea7e.15b11bde.js deleted file mode 100644 index e494700..0000000 --- a/assets/js/f4a4ea7e.15b11bde.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkastria_docs_2=self.webpackChunkastria_docs_2||[]).push([[237],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>u});var i=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=i.createContext({}),d=function(e){var t=i.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},p=function(e){var t=d(e.components);return i.createElement(s.Provider,{value:t},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var a=e.components,n=e.mdxType,r=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),c=d(a),m=n,u=c["".concat(s,".").concat(m)]||c[m]||g[m]||r;return a?i.createElement(u,l(l({ref:t},p),{},{components:a})):i.createElement(u,l({ref:t},p))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=a.length,l=new Array(r);l[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[c]="string"==typeof e?e:n,l[1]=o;for(var d=2;d{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>g,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var i=a(7462),n=(a(7294),a(3905));const r={},l="Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion",o={permalink:"/articles/real-estate",source:"@site/blog/real-estate.md",title:"Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion",description:"Virtual staging is the process of digitally adding furniture, decor, and other elements to photos of empty or sparsely furnished spaces. Along with Stable Diffusion, it can significantly improve real estate listings by creating realistic and attractive virtual staging.",date:"2024-04-24T16:27:48.000Z",formattedDate:"April 24, 2024",tags:[],readingTime:6.015,hasTruncateMarker:!1,authors:[],frontMatter:{},nextItem:{title:"Create Studio-Quality Custom Portraits Instantly with Astria's FaceID Tool",permalink:"/articles/face-id"}},s={authorsImageUrls:[]},d=[],p={toc:d},c="wrapper";function g(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,i.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Virtual staging is the process of digitally adding furniture, decor, and other elements to photos of empty or sparsely furnished spaces. Along with Stable Diffusion, it can significantly improve real estate listings by creating realistic and attractive virtual staging."),(0,n.kt)("p",null,"Digital staging transforms cold, empty rooms into warm, inviting spaces that help buyers emotionally connect with a property. A 2023 report by Realtor.com found that staged homes sell 88% faster and for an average of 20% more than non-staged homes."),(0,n.kt)("h1",{id:"why-virtual-staging-is-needed"},"Why Virtual Staging Is Needed"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Empty spaces lack appeal: Unfurnished rooms can appear cold and uninviting, making it difficult for potential buyers to visualize themselves living in the space."),(0,n.kt)("li",{parentName:"ul"},"Traditional staging is expensive: Physically staging a property requires furniture rentals, which can be costly and time-consuming."),(0,n.kt)("li",{parentName:"ul"},"Showcases potential: Virtual staging allows showcasing a space's full potential. Buyers can see how furniture can be arranged and how the space can function for their needs.")),(0,n.kt)("h1",{id:"advantages-of-using-astriaai-for-virtual-staging"},"Advantages of Using Astria.ai for Virtual Staging"),(0,n.kt)("p",null,"The advantages of using Astria.ai for virtual staging are many:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cost-Effective: Compared to traditional staging, Astria offers a much more affordable way to virtually stage a property."),(0,n.kt)("li",{parentName:"ul"},"Speed and Efficiency: Astria can generate virtual staging variations in minutes, allowing realtors to experiment with different styles and layouts."),(0,n.kt)("li",{parentName:"ul"},"Customization: With clear prompts and descriptions, it can create virtual staging that reflects the property's style, target demographic, and current design trends.")),(0,n.kt)("p",null,"Astria.ai simplifies virtual staging by harnessing cutting-edge AI technology, making it effortless to digitally stage listings with realistic results. Here's how Astria.ai achieves this:"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Controlnets: Users input text descriptions to control the composition, style, and content of the staged photo."),(0,n.kt)("li",{parentName:"ol"},"MLSD (Multi-Level Scene Description): Breaks down a room into its components, ensuring realistic staging."),(0,n.kt)("li",{parentName:"ol"},"Compositional Understanding: AI arranges furniture and decor based on interior design principles."),(0,n.kt)("li",{parentName:"ol"},"Backend Version-1: Proprietary machine learning infrastructure enables fast, high-quality staging.")),(0,n.kt)("p",null,"Backend Version-1 improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Hi-Res (Super-Resolution Details) for sharper images."),(0,n.kt)("li",{parentName:"ul"},"Faster processing times."),(0,n.kt)("li",{parentName:"ul"},"Better handling of multiple LoRAs."),(0,n.kt)("li",{parentName:"ul"},"Improved results with DPM++/Karras and DPM++SDE/Karras samplers.")),(0,n.kt)("p",null,"Multi-Controlnet, available only for Backend Version-1, combines multiple Controlnets for better consistency and precision."),(0,n.kt)("h1",{id:"how-to-use-astriaai"},"How to Use Astria.ai"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Sign up at Astria.ai."),(0,n.kt)("li",{parentName:"ol"},"Go to ",(0,n.kt)("a",{parentName:"li",href:"https://www.astria.ai/prompts"},"https://www.astria.ai/prompts"),"."),(0,n.kt)("li",{parentName:"ol"},"Select Advanced and ControlNet/Img2Img Option.")),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"alt_text",src:a(7391).Z,title:"image_tooltip",width:"1999",height:"1067"})),(0,n.kt)("ol",{start:4},(0,n.kt)("li",{parentName:"ol"},"Upload your image using Choose File."),(0,n.kt)("li",{parentName:"ol"},"Select 1 - BETA under Backend version."),(0,n.kt)("li",{parentName:"ol"},"Write out a description under Detailed Description and add \u201c-- controlnets MLSD\u201d at the end of it. --controlnet_weights 0.5 gives the best results."),(0,n.kt)("li",{parentName:"ol"},"Also use --mask_prompt windows door --mask_invert, to make sure that the windows and the doors are preserved from the original image."),(0,n.kt)("li",{parentName:"ol"},"Additionally you can add a few Loras as suggested in the docs ",(0,n.kt)("a",{parentName:"li",href:"https://docs.astria.ai/docs/use-cases/room-redesign"},"here "),"to improve the overall quality of the image."),(0,n.kt)("li",{parentName:"ol"},"Click Create Image.")),(0,n.kt)("h1",{id:"easy-hacks-to-enhance-your-listings"},"Easy Hacks to Enhance Your Listings"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Gather High-Quality Photos: The process works best with clear and well-lit photos of the empty rooms."),(0,n.kt)("li",{parentName:"ol"},"Define the Virtual Staging Style: Consider the property's target audience and the overall feel you want to create (modern, traditional, family-friendly etc.)."),(0,n.kt)("li",{parentName:"ol"},"Craft Text Prompts: Provide detailed descriptions of the desired furniture, decor, and overall ambiance."),(0,n.kt)("li",{parentName:"ol"},"Generate Variations: You can generate multiple virtual staging options to choose from, allowing for A/B testing to see which resonates best with potential buyers."),(0,n.kt)("li",{parentName:"ol"},"Refine and Integrate: Minor adjustments might be needed to ensure a seamless integration of the virtual staging with the original photo.")),(0,n.kt)("h1",{id:"virtual-staging-applications-on-astriaai"},"Virtual Staging Applications on Astria.ai"),(0,n.kt)("p",null,"In this section, let\u2019s look at how you can actually use Astria to transform empty spaces into vibrant, inviting rooms."),(0,n.kt)("p",null,"See below:"),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"Original Image => AI Generated Image by Astria.ai")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A serene and opulent private bedroom, featuring a plush king-size bed with a tufted velvet headboard and a delicate crystal chandelier above, surrounded by richly textured walls in a soothing gray tone, and a lavish area rug in a soft, creamy color, with a comfortable reading nook by the window, complete with a oversized armchair and a matching ottoman, and a spacious walk-in closet with custom cabinetry and a marble-topped dresser, all bathed in a warm, golden light, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(9210).Z,width:"371",height:"277"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(1267).Z,width:"395",height:"296"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A modern office room with a minimalist aesthetic, featuring a sleek wooden desk with a silver laptop and a ergonomic chair, surrounded by floor-to-ceiling windows with a cityscape view, and a few potted plants on a shelf, with walls lined with tall cabinets filled with neatly organized books and files, and a subtle warm lighting and a hint of natural light, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(9013).Z,width:"370",height:"270"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(9023).Z,width:"397",height:"294"}))))),(0,n.kt)("p",null,"A contemporary office space with an industrial chic vibe, featuring a reclaimed wood desk with a vintage-inspired lamp and a worn leather office chair, surrounded by exposed brick walls and polished concrete floors, with a floor-to-ceiling metal shelving unit filled with vintage books and decorative objects, and a large glass door leading to a private outdoor patio with a city view, in a 3D rendering style ","<","lora:epi_noiseoffset2:0.5>","<","lora:FilmVelvia2:0.5>","<","lora:add_detail:0.5>","<","lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5"),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(5236).Z,width:"372",height:"278"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(4879).Z,width:"397",height:"297"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A sleek and modern home gym, featuring a spacious open floor plan with high ceilings and large windows allowing for natural light, equipped with a variety of high-end exercise equipment including a treadmill, stationary bike, and free weights, surrounded by mirrored walls and a polished wood floor, with a comfortable seating area for relaxation and a large flat-screen TV for entertainment, and a modern sound system for an immersive workout experience, in a 3D rendering style\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(8275).Z,width:"369",height:"231"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(4033).Z,width:"395",height:"246"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"Coastal-themed nursery: an empty room staged as a serene coastal-themed nursery with a white crib, soft blue accents, shiplap wall, and nautical decor elements \u2013 controlnets MLSD Composition\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(8588).Z,width:"367",height:"245"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(8760).Z,width:"395",height:"264"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A peaceful and calming meditation room, featuring a serene and minimalist space with a focus on natural materials and textures, including a reclaimed wood floor, a stone feature wall, and a live edge wooden meditation bench, surrounded by floor-to-ceiling windows allowing for an abundance of natural light and a connection to nature, with a few carefully placed plants and a subtle water feature creating a sense of tranquility, and a soft, warm glow emanating from candles or string lights, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(6942).Z,width:"331",height:"492"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(329).Z,width:"396",height:"593"}))))),(0,n.kt)("p",null,"Here are the original images sources:"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/brk/apa/d/brooklyn-expansive-loft-in-bushwick/7731612663.html"},"https://newyork.craigslist.org/brk/apa/d/brooklyn-expansive-loft-in-bushwick/7731612663.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/brk/apa/d/brooklyn-below-market-basic-bedroom/7731562165.html"},"https://newyork.craigslist.org/brk/apa/d/brooklyn-below-market-basic-bedroom/7731562165.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/mnh/apa/d/new-york-bright-corner-studio-laundry/7731512365.html"},"https://newyork.craigslist.org/mnh/apa/d/new-york-bright-corner-studio-laundry/7731512365.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/brk/apa/d/brooklyn-bed-in-williamsburg-no-fee/7731545442.html"},"https://newyork.craigslist.org/brk/apa/d/brooklyn-bed-in-williamsburg-no-fee/7731545442.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://hudsonvalley.craigslist.org/apa/d/pearl-river-pearl-river-jewel-1br/7733791169.html"},"https://hudsonvalley.craigslist.org/apa/d/pearl-river-pearl-river-jewel-1br/7733791169.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://slowmotionmama.com/7-reasons-to-empty-a-space-before-decluttering/"},"https://slowmotionmama.com/7-reasons-to-empty-a-space-before-decluttering/")),(0,n.kt)("h1",{id:"to-summarize"},"To Summarize"),(0,n.kt)("p",null,"The benefits of AI virtual staging are many: accelerated sales, increased property values, and a streamlined marketing experience."),(0,n.kt)("p",null,"Things to remember:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Maintain Realism: While this AI tool is powerful, it's crucial to ensure the generated virtual staging looks realistic and avoids nonsensical elements."),(0,n.kt)("li",{parentName:"ul"},"Transparency: You may choose to disclose that virtual staging is used in the listing description to build trust with potential buyers.")))}g.isMDXComponent=!0},5236:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image1-be916a621a520b2ef8a7a6e4b8883ef1.png"},4879:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image10-35a8f0d9c331270e5a86b51979ac6432.png"},8760:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image11-b337bcdfc5f41aa2b19c73313da876e5.png"},329:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image12-19bbab97b061ef8347297d085ef61cd5.png"},9013:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image13-40d31c09df5b4fd9875928f8b45c9faf.png"},8588:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image2-493bfb8cd2175b49d8ff8277167d4e08.png"},7391:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image3-74b1da5ab268a8ab2318e6c3765bd919.png"},1267:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image4-078eb9dff48587b6c9b2c9260118adbd.png"},9023:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image5-38f7881cc5a0102037f78e10619b6f6d.png"},6942:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image6-fce6e2d70023f563e3bf857c2d3d178f.png"},9210:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image7-acd610ab0131013cc285e2ddc9e3168a.png"},4033:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image8-61ade0895e47d04ada3a450e51eb833d.png"},8275:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image9-0e21640ec733385aabf141dd9e67d65a.png"}}]); \ No newline at end of file diff --git a/assets/js/f4a4ea7e.91845c9e.js b/assets/js/f4a4ea7e.91845c9e.js new file mode 100644 index 0000000..2463c44 --- /dev/null +++ b/assets/js/f4a4ea7e.91845c9e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkastria_docs_2=self.webpackChunkastria_docs_2||[]).push([[237],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>u});var i=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=i.createContext({}),d=function(e){var t=i.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},p=function(e){var t=d(e.components);return i.createElement(s.Provider,{value:t},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var a=e.components,n=e.mdxType,r=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),c=d(a),m=n,u=c["".concat(s,".").concat(m)]||c[m]||g[m]||r;return a?i.createElement(u,l(l({ref:t},p),{},{components:a})):i.createElement(u,l({ref:t},p))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=a.length,l=new Array(r);l[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[c]="string"==typeof e?e:n,l[1]=o;for(var d=2;d{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>g,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var i=a(7462),n=(a(7294),a(3905));const r={},l="Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion",o={permalink:"/articles/real-estate",source:"@site/blog/real-estate.md",title:"Enhancing Real Estate Listings with Virtual Staging on Stable Diffusion",description:"Virtual staging is the process of digitally adding furniture, decor, and other elements to photos of empty or sparsely furnished spaces. Along with Stable Diffusion, it can significantly improve real estate listings by creating realistic and attractive virtual staging.",date:"2024-04-24T16:27:48.000Z",formattedDate:"April 24, 2024",tags:[],readingTime:6.015,hasTruncateMarker:!1,authors:[],frontMatter:{},prevItem:{title:"Exploring Virtual Fashion: Garment Try-On with Astria",permalink:"/articles/virtual-tryon"},nextItem:{title:"Create Studio-Quality Custom Portraits Instantly with Astria's FaceID Tool",permalink:"/articles/face-id"}},s={authorsImageUrls:[]},d=[],p={toc:d},c="wrapper";function g(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,i.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Virtual staging is the process of digitally adding furniture, decor, and other elements to photos of empty or sparsely furnished spaces. Along with Stable Diffusion, it can significantly improve real estate listings by creating realistic and attractive virtual staging."),(0,n.kt)("p",null,"Digital staging transforms cold, empty rooms into warm, inviting spaces that help buyers emotionally connect with a property. A 2023 report by Realtor.com found that staged homes sell 88% faster and for an average of 20% more than non-staged homes."),(0,n.kt)("h1",{id:"why-virtual-staging-is-needed"},"Why Virtual Staging Is Needed"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Empty spaces lack appeal: Unfurnished rooms can appear cold and uninviting, making it difficult for potential buyers to visualize themselves living in the space."),(0,n.kt)("li",{parentName:"ul"},"Traditional staging is expensive: Physically staging a property requires furniture rentals, which can be costly and time-consuming."),(0,n.kt)("li",{parentName:"ul"},"Showcases potential: Virtual staging allows showcasing a space's full potential. Buyers can see how furniture can be arranged and how the space can function for their needs.")),(0,n.kt)("h1",{id:"advantages-of-using-astriaai-for-virtual-staging"},"Advantages of Using Astria.ai for Virtual Staging"),(0,n.kt)("p",null,"The advantages of using Astria.ai for virtual staging are many:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cost-Effective: Compared to traditional staging, Astria offers a much more affordable way to virtually stage a property."),(0,n.kt)("li",{parentName:"ul"},"Speed and Efficiency: Astria can generate virtual staging variations in minutes, allowing realtors to experiment with different styles and layouts."),(0,n.kt)("li",{parentName:"ul"},"Customization: With clear prompts and descriptions, it can create virtual staging that reflects the property's style, target demographic, and current design trends.")),(0,n.kt)("p",null,"Astria.ai simplifies virtual staging by harnessing cutting-edge AI technology, making it effortless to digitally stage listings with realistic results. Here's how Astria.ai achieves this:"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Controlnets: Users input text descriptions to control the composition, style, and content of the staged photo."),(0,n.kt)("li",{parentName:"ol"},"MLSD (Multi-Level Scene Description): Breaks down a room into its components, ensuring realistic staging."),(0,n.kt)("li",{parentName:"ol"},"Compositional Understanding: AI arranges furniture and decor based on interior design principles."),(0,n.kt)("li",{parentName:"ol"},"Backend Version-1: Proprietary machine learning infrastructure enables fast, high-quality staging.")),(0,n.kt)("p",null,"Backend Version-1 improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Hi-Res (Super-Resolution Details) for sharper images."),(0,n.kt)("li",{parentName:"ul"},"Faster processing times."),(0,n.kt)("li",{parentName:"ul"},"Better handling of multiple LoRAs."),(0,n.kt)("li",{parentName:"ul"},"Improved results with DPM++/Karras and DPM++SDE/Karras samplers.")),(0,n.kt)("p",null,"Multi-Controlnet, available only for Backend Version-1, combines multiple Controlnets for better consistency and precision."),(0,n.kt)("h1",{id:"how-to-use-astriaai"},"How to Use Astria.ai"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Sign up at Astria.ai."),(0,n.kt)("li",{parentName:"ol"},"Go to ",(0,n.kt)("a",{parentName:"li",href:"https://www.astria.ai/prompts"},"https://www.astria.ai/prompts"),"."),(0,n.kt)("li",{parentName:"ol"},"Select Advanced and ControlNet/Img2Img Option.")),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"alt_text",src:a(7391).Z,title:"image_tooltip",width:"1999",height:"1067"})),(0,n.kt)("ol",{start:4},(0,n.kt)("li",{parentName:"ol"},"Upload your image using Choose File."),(0,n.kt)("li",{parentName:"ol"},"Select 1 - BETA under Backend version."),(0,n.kt)("li",{parentName:"ol"},"Write out a description under Detailed Description and add \u201c-- controlnets MLSD\u201d at the end of it. --controlnet_weights 0.5 gives the best results."),(0,n.kt)("li",{parentName:"ol"},"Also use --mask_prompt windows door --mask_invert, to make sure that the windows and the doors are preserved from the original image."),(0,n.kt)("li",{parentName:"ol"},"Additionally you can add a few Loras as suggested in the docs ",(0,n.kt)("a",{parentName:"li",href:"https://docs.astria.ai/docs/use-cases/room-redesign"},"here "),"to improve the overall quality of the image."),(0,n.kt)("li",{parentName:"ol"},"Click Create Image.")),(0,n.kt)("h1",{id:"easy-hacks-to-enhance-your-listings"},"Easy Hacks to Enhance Your Listings"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Gather High-Quality Photos: The process works best with clear and well-lit photos of the empty rooms."),(0,n.kt)("li",{parentName:"ol"},"Define the Virtual Staging Style: Consider the property's target audience and the overall feel you want to create (modern, traditional, family-friendly etc.)."),(0,n.kt)("li",{parentName:"ol"},"Craft Text Prompts: Provide detailed descriptions of the desired furniture, decor, and overall ambiance."),(0,n.kt)("li",{parentName:"ol"},"Generate Variations: You can generate multiple virtual staging options to choose from, allowing for A/B testing to see which resonates best with potential buyers."),(0,n.kt)("li",{parentName:"ol"},"Refine and Integrate: Minor adjustments might be needed to ensure a seamless integration of the virtual staging with the original photo.")),(0,n.kt)("h1",{id:"virtual-staging-applications-on-astriaai"},"Virtual Staging Applications on Astria.ai"),(0,n.kt)("p",null,"In this section, let\u2019s look at how you can actually use Astria to transform empty spaces into vibrant, inviting rooms."),(0,n.kt)("p",null,"See below:"),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"Original Image => AI Generated Image by Astria.ai")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A serene and opulent private bedroom, featuring a plush king-size bed with a tufted velvet headboard and a delicate crystal chandelier above, surrounded by richly textured walls in a soothing gray tone, and a lavish area rug in a soft, creamy color, with a comfortable reading nook by the window, complete with a oversized armchair and a matching ottoman, and a spacious walk-in closet with custom cabinetry and a marble-topped dresser, all bathed in a warm, golden light, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(9210).Z,width:"371",height:"277"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(1267).Z,width:"395",height:"296"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A modern office room with a minimalist aesthetic, featuring a sleek wooden desk with a silver laptop and a ergonomic chair, surrounded by floor-to-ceiling windows with a cityscape view, and a few potted plants on a shelf, with walls lined with tall cabinets filled with neatly organized books and files, and a subtle warm lighting and a hint of natural light, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(9013).Z,width:"370",height:"270"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(9023).Z,width:"397",height:"294"}))))),(0,n.kt)("p",null,"A contemporary office space with an industrial chic vibe, featuring a reclaimed wood desk with a vintage-inspired lamp and a worn leather office chair, surrounded by exposed brick walls and polished concrete floors, with a floor-to-ceiling metal shelving unit filled with vintage books and decorative objects, and a large glass door leading to a private outdoor patio with a city view, in a 3D rendering style ","<","lora:epi_noiseoffset2:0.5>","<","lora:FilmVelvia2:0.5>","<","lora:add_detail:0.5>","<","lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5"),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(5236).Z,width:"372",height:"278"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(4879).Z,width:"397",height:"297"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A sleek and modern home gym, featuring a spacious open floor plan with high ceilings and large windows allowing for natural light, equipped with a variety of high-end exercise equipment including a treadmill, stationary bike, and free weights, surrounded by mirrored walls and a polished wood floor, with a comfortable seating area for relaxation and a large flat-screen TV for entertainment, and a modern sound system for an immersive workout experience, in a 3D rendering style\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(8275).Z,width:"369",height:"231"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(4033).Z,width:"395",height:"246"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"Coastal-themed nursery: an empty room staged as a serene coastal-themed nursery with a white crib, soft blue accents, shiplap wall, and nautical decor elements \u2013 controlnets MLSD Composition\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(8588).Z,width:"367",height:"245"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(8760).Z,width:"395",height:"264"}))))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-text"},"A peaceful and calming meditation room, featuring a serene and minimalist space with a focus on natural materials and textures, including a reclaimed wood floor, a stone feature wall, and a live edge wooden meditation bench, surrounded by floor-to-ceiling windows allowing for an abundance of natural light and a connection to nature, with a few carefully placed plants and a subtle water feature creating a sense of tranquility, and a soft, warm glow emanating from candles or string lights, in a 3D rendering style <lora:epi_noiseoffset2:0.5><lora:FilmVelvia2:0.5><lora:add_detail:0.5><lora:epiCRealismHelper:0.2> --mask_prompt windows door --mask_invert --controlnets mlsd --controlnet_weights 0.5\n")),(0,n.kt)("table",null,(0,n.kt)("tr",null,(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(6942).Z,width:"331",height:"492"}))),(0,n.kt)("td",null,(0,n.kt)("p",null,(0,n.kt)("img",{alt:"image",src:a(329).Z,width:"396",height:"593"}))))),(0,n.kt)("p",null,"Here are the original images sources:"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/brk/apa/d/brooklyn-expansive-loft-in-bushwick/7731612663.html"},"https://newyork.craigslist.org/brk/apa/d/brooklyn-expansive-loft-in-bushwick/7731612663.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/brk/apa/d/brooklyn-below-market-basic-bedroom/7731562165.html"},"https://newyork.craigslist.org/brk/apa/d/brooklyn-below-market-basic-bedroom/7731562165.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/mnh/apa/d/new-york-bright-corner-studio-laundry/7731512365.html"},"https://newyork.craigslist.org/mnh/apa/d/new-york-bright-corner-studio-laundry/7731512365.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://newyork.craigslist.org/brk/apa/d/brooklyn-bed-in-williamsburg-no-fee/7731545442.html"},"https://newyork.craigslist.org/brk/apa/d/brooklyn-bed-in-williamsburg-no-fee/7731545442.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://hudsonvalley.craigslist.org/apa/d/pearl-river-pearl-river-jewel-1br/7733791169.html"},"https://hudsonvalley.craigslist.org/apa/d/pearl-river-pearl-river-jewel-1br/7733791169.html")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://slowmotionmama.com/7-reasons-to-empty-a-space-before-decluttering/"},"https://slowmotionmama.com/7-reasons-to-empty-a-space-before-decluttering/")),(0,n.kt)("h1",{id:"to-summarize"},"To Summarize"),(0,n.kt)("p",null,"The benefits of AI virtual staging are many: accelerated sales, increased property values, and a streamlined marketing experience."),(0,n.kt)("p",null,"Things to remember:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Maintain Realism: While this AI tool is powerful, it's crucial to ensure the generated virtual staging looks realistic and avoids nonsensical elements."),(0,n.kt)("li",{parentName:"ul"},"Transparency: You may choose to disclose that virtual staging is used in the listing description to build trust with potential buyers.")))}g.isMDXComponent=!0},5236:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image1-be916a621a520b2ef8a7a6e4b8883ef1.png"},4879:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image10-35a8f0d9c331270e5a86b51979ac6432.png"},8760:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image11-b337bcdfc5f41aa2b19c73313da876e5.png"},329:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image12-19bbab97b061ef8347297d085ef61cd5.png"},9013:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image13-40d31c09df5b4fd9875928f8b45c9faf.png"},8588:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image2-493bfb8cd2175b49d8ff8277167d4e08.png"},7391:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image3-74b1da5ab268a8ab2318e6c3765bd919.png"},1267:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image4-078eb9dff48587b6c9b2c9260118adbd.png"},9023:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image5-38f7881cc5a0102037f78e10619b6f6d.png"},6942:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image6-fce6e2d70023f563e3bf857c2d3d178f.png"},9210:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image7-acd610ab0131013cc285e2ddc9e3168a.png"},4033:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image8-61ade0895e47d04ada3a450e51eb833d.png"},8275:(e,t,a)=>{a.d(t,{Z:()=>i});const i=a.p+"assets/images/image9-0e21640ec733385aabf141dd9e67d65a.png"}}]); \ No newline at end of file diff --git a/assets/js/main.72e8848e.js b/assets/js/main.72e8848e.js new file mode 100644 index 0000000..6b06231 --- /dev/null +++ b/assets/js/main.72e8848e.js @@ -0,0 +1,2 @@ +/*! For license information please see main.72e8848e.js.LICENSE.txt */ +(self.webpackChunkastria_docs_2=self.webpackChunkastria_docs_2||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),l=n(6887);const s={17896441:[()=>Promise.all([n.e(532),n.e(347),n.e(918)]).then(n.bind(n,8945)),"@theme/DocItem",8945],"1be78505":[()=>Promise.all([n.e(532),n.e(514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"244732a8":[()=>n.e(111).then(n.bind(n,5567)),"@site/blog/face-id.md",5567],"322446a6":[()=>n.e(56).then(n.bind(n,1718)),"@site/blog/virtual-tryon.md",1718],"382055d6":[()=>n.e(504).then(n.bind(n,9196)),"@site/blog/face-id.md?truncated=true",9196],"3fd67606":[()=>n.e(940).then(n.t.bind(n,3769,19)),"/Users/burg/git/astria-articles/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"5348e8a7":[()=>n.e(823).then(n.t.bind(n,4469,19)),"/Users/burg/git/astria-articles/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",4469],"6399bba5":[()=>n.e(296).then(n.bind(n,8515)),"@site/blog/multi-pass-inference.md",8515],"6f65f4bf":[()=>n.e(195).then(n.bind(n,4456)),"@site/blog/virtual-tryon.md?truncated=true",4456],"814f3328":[()=>n.e(535).then(n.t.bind(n,5641,19)),"~blog/default/blog-post-list-prop-default.json",5641],"8a5ad8b9":[()=>n.e(89).then(n.bind(n,4745)),"@site/blog/on-brand.md?truncated=true",4745],"90e7b1d0":[()=>n.e(321).then(n.t.bind(n,9264,19)),"~blog/default/articles-18f.json",9264],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"9e4087bc":[()=>n.e(608).then(n.bind(n,3169)),"@theme/BlogArchivePage",3169],"9fda4f55":[()=>n.e(868).then(n.bind(n,2713)),"@site/docs/0-changes.md",2713],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(347),n.e(218),n.e(886)]).then(n.bind(n,3269)),"@theme/BlogListPage",3269],b1884dda:[()=>n.e(151).then(n.bind(n,8128)),"@site/blog/multi-pass-inference.md?truncated=true",8128],c85f55fc:[()=>n.e(339).then(n.t.bind(n,9888,19)),"~blog/default/articles-archive-305.json",9888],ccc49370:[()=>Promise.all([n.e(532),n.e(347),n.e(218),n.e(103)]).then(n.bind(n,5203)),"@theme/BlogPostPage",5203],d5c79faf:[()=>n.e(894).then(n.bind(n,4376)),"@site/blog/on-brand.md",4376],dff5557a:[()=>n.e(596).then(n.bind(n,177)),"@site/blog/real-estate.md?truncated=true",177],f4a4ea7e:[()=>n.e(237).then(n.bind(n,4725)),"@site/blog/real-estate.md",4725]};function u(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(9670),d=n(226);function f(e,t){if("*"===e)return i()({loading:u,loader:()=>n.e(972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[`${e}-${t}`],f={},p=[],m=[],g=(0,c.Z)(o);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:u,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const p=[{path:"/articles/archive/",component:f("/articles/archive/","380"),exact:!0},{path:"/articles/face-id/",component:f("/articles/face-id/","d93"),exact:!0},{path:"/articles/multi-pass-inference/",component:f("/articles/multi-pass-inference/","9ef"),exact:!0},{path:"/articles/on-brand/",component:f("/articles/on-brand/","989"),exact:!0},{path:"/articles/real-estate/",component:f("/articles/real-estate/","a97"),exact:!0},{path:"/articles/virtual-tryon/",component:f("/articles/virtual-tryon/","bb4"),exact:!0},{path:"/articles/docs/",component:f("/articles/docs/","5f0"),routes:[{path:"/articles/docs/changes/",component:f("/articles/docs/changes/","6b3"),exact:!0,sidebar:"tutorialSidebar"}]},{path:"/articles/",component:f("/articles/","03a"),exact:!0},{path:"*",component:f("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},7221:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(412);const s=[n(6657),n(2497),n(3310),n(8320),n(2295)];var u=n(723),c=n(6550),d=n(8790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(7462),m=n(5742),g=n(2263),h=n(4996),v=n(6668),b=n(1944),y=n(4711),w=n(9727),k=n(3320),E=n(8780),S=n(197);function x(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),a=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.Z)(),{pathname:r}=(0,c.TH)();return e+(0,E.applyTrailingSlash)((0,h.Z)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function _(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,v.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(b.d,{image:n}),r.createElement(C,null),r.createElement(x,null),r.createElement(S.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const T=new Map;function A(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var L=n(8934),R=n(8940);function N(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const P=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:a}),N("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?N("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(P,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const D=I,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",B="__docusaurus-base-url-issue-banner-suggestion-container",j="__DOCUSAURUS_INSERT_BASEURL_BANNER";function z(e){return`\nwindow['${j}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${j}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${M}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{window[j]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,z(e))),r.createElement("div",{id:M}))}function $(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(U,null):null}function q(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,g.Z)(),i=(0,h.Z)(e),{htmlLang:l,direction:s}=o[a];return r.createElement(m.Z,null,r.createElement("html",{lang:l,dir:s}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var H=n(4763),G=n(2389);function Z(){const e=(0,G.Z)();return r.createElement(m.Z,null,r.createElement("html",{"data-has-hydrated":e}))}function V(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(H.Z,null,r.createElement(R.M,null,r.createElement(L.t,null,r.createElement(f,null,r.createElement(q,null),r.createElement(_,null),r.createElement($,null),r.createElement(D,{location:A(t)},e)),r.createElement(Z,null))))}var W=n(6887);const Y=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var K=n(9670);const Q=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Q.has(e))(e))return!1;Q.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(W).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,K.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Y(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),O(e))},te=Object.freeze(ee);if(l.Z.canUseDOM){window.docusaurus=te;const e=a.hydrate;O(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(V,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":["G-PR5YMLZ2Y1"],"anonymizeIP":false,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/articles/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/articles/docs","mainDocId":"changes","docs":[{"id":"changes","path":"/articles/docs/changes","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/articles/docs/changes","label":"changes"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.4.3","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.3"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.3"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.3"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"2.4.3"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.3"}}}'),u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(412),o=n(5742),i=n(8780),l=n(7961);function s(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(u,{error:t}))}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function c(e){let{error:t,tryAgain:n}=e;return r.createElement(f,{fallback:()=>r.createElement(s,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(l.Z,null,r.createElement(s,{error:t,tryAgain:n})))}const d=e=>r.createElement(c,e);class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??d)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),l=n(2263),s=n(3919),u=n(412);const c=a.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:m,isActive:g,"data-noBrokenLinkCheck":h,autoAddBaseUrl:v=!0,...b}=e;const{siteConfig:{trailingSlash:y,baseUrl:w}}=(0,l.Z)(),{withBaseUrl:k}=(0,d.C)(),E=(0,a.useContext)(c),S=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>S.current));const x=f||p;const C=(0,s.Z)(x),_=x?.replace("pathname://","");let T=void 0!==_?(A=_,v&&(e=>e.startsWith("/"))(A)?k(A):A):void 0;var A;T&&C&&(T=(0,i.applyTrailingSlash)(T,{trailingSlash:y,baseUrl:w}));const L=(0,a.useRef)(!1),R=n?o.OL:o.rU,N=u.Z.canUseIntersectionObserver,P=(0,a.useRef)(),O=()=>{L.current||null==T||(window.docusaurus.preload(T),L.current=!0)};(0,a.useEffect)((()=>(!N&&C&&null!=T&&window.docusaurus.prefetch(T),()=>{N&&P.current&&P.current.disconnect()})),[P,T,N,C]);const I=T?.startsWith("#")??!1,D=!T||!C||I;return D||h||E.collectLink(T),D?a.createElement("a",(0,r.Z)({ref:S,href:T},x&&!C&&{target:"_blank",rel:"noopener noreferrer"},b)):a.createElement(R,(0,r.Z)({},b,{onMouseEnter:O,onTouchStart:O,innerRef:e=>{S.current=e,N&&e&&C&&(P.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(P.current.unobserve(e),P.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),P.current.observe(e))},to:T},n&&{isActive:g,activeClassName:m}))}const p=a.forwardRef(f)},1875:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=()=>null},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(7294),a=n(2263),o=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>g,gA:()=>f,_r:()=>c,Jo:()=>h,zh:()=>d,yW:()=>m,gB:()=>p});var r=n(6550),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},c=()=>i("docusaurus-plugin-content-docs")??u,d=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function p(e){return d(e).versions}function m(e){const t=d(e);return l(t)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return s(t,n)}function h(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6657:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("event","page_view",{page_title:document.title,page_location:window.location.href,page_path:t.pathname+t.search+t.hash})}))}}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a={iconExternalLink:"iconExternalLink_nPIU"};function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},7961:(e,t,n)=>{"use strict";n.d(t,{Z:()=>dt});var r=n(7294),a=n(6010),o=n(4763),i=n(1944),l=n(7462),s=n(6550),u=n(5999),c=n(5936);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,u.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function g(e){const t=e.children??m,{containerRef:n,onClick:a}=p();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,l.Z)({},e,{href:`#${d}`,onClick:a}),t))}var h=n(5281),v=n(9727);const b={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(g,{className:b.skipToContent})}var w=n(6668),k=n(9689);function E(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...s}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 15 15",width:t,height:n},s),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const S={closeButton:"closeButton_CVFx"};function x(e){return r.createElement("button",(0,l.Z)({type:"button","aria-label":(0,u.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",S.closeButton,e.className)}),r.createElement(E,{width:14,height:14,strokeWidth:3.1}))}const C={content:"content_knG7"};function _(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,l.Z)({},e,{className:(0,a.Z)(C.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:T.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:T.announcementBarPlaceholder}),r.createElement(_,{className:T.announcementBarContent}),i&&r.createElement(x,{onClick:n,className:T.announcementBarClose}))}var L=n(2961),R=n(2466);var N=n(902),P=n(3102);const O=r.createContext(null);function I(e){let{children:t}=e;const n=function(){const e=(0,L.e)(),t=(0,P.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,N.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(O.Provider,{value:n},t)}function D(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function M(){const e=(0,r.useContext)(O);if(!e)throw new N.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,P.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:D(o)})),[a,o,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=M();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var B=n(2949),j=n(2389);function z(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function U(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:o,onChange:i}=e;const l=(0,j.Z)(),s=(0,u.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===o?(0,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)($.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",$.toggleButton,!l&&$.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===o?"light":"dark"),disabled:!l,title:s,"aria-label":s,"aria-live":"polite"},r.createElement(z,{className:(0,a.Z)($.toggleIcon,$.lightToggleIcon)}),r.createElement(U,{className:(0,a.Z)($.toggleIcon,$.darkToggleIcon)})))}const H=r.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function Z(e){let{className:t}=e;const n=(0,w.L)().navbar.style,a=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:i}=(0,B.I)();return a?null:r.createElement(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:o,onChange:i})}var V=n(1327);function W(){return r.createElement(V.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,L.e)();return r.createElement("button",{type:"button","aria-label":(0,u.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(E,{color:"var(--ifm-color-emphasis-600)"}))}function K(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(W,null),r.createElement(Z,{className:"margin-right--md"}),r.createElement(Y,null))}var Q=n(9960),X=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:s,isDropdownLink:u,prependBaseUrlToHref:c,...d}=e;const f=(0,X.Z)(a),p=(0,X.Z)(t),m=(0,X.Z)(o,{forcePrependBaseUrl:!0}),g=i&&o&&!(0,J.Z)(o),h=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,g&&r.createElement(te.Z,u&&{width:12,height:12}))};return o?r.createElement(Q.Z,(0,l.Z)({href:c?m:o},d,h)):r.createElement(Q.Z,(0,l.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},d,h))}function re(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ne,(0,l.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function ae(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,l.Z)({className:(0,a.Z)("menu__link",t)},o)))}function oe(e){let{mobile:t=!1,position:n,...a}=e;const o=t?ae:re;return r.createElement(o,(0,l.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(6043),le=n(8596),se=n(2263);function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ce(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[u]),r.createElement("div",{ref:u,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(ne,(0,l.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),s.children??s.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(xe,(0,l.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:o,onClick:i,...u}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(ne,(0,l.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},u,{onClick:e=>{e.preventDefault(),p()}}),u.children??u.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>r.createElement(xe,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function fe(e){let{mobile:t=!1,...n}=e;const a=t?de:ce;return r.createElement(a,n)}var pe=n(4711);function me(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const ge="iconLanguage_nlXk";var he=n(1875);const ve={searchBox:"searchBox_ZlJk"};function be(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,ve.searchBox)},t)}var ye=n(143),we=n(2802);var ke=n(373);const Ee=e=>e.docs.find((t=>t.id===e.mainDocId));const Se={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.Z)(),f=(0,pe.l)(),{search:p,hash:m}=(0,s.TH)(),g=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${m}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],h=t?(0,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(fe,(0,l.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(me,{className:ge}),h),items:g}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(be,{className:n},r.createElement(he.Z,null))},dropdown:fe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,ye.Iw)(a),s=(0,we.vY)(t,a);return null===s?null:r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.path===s.path||!!i?.sidebar&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,ye.Iw)(a),s=(0,we.oz)(t,a).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,we.lO)(a)[0],s=t??i.label,u=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(oe,(0,l.Z)({},o,{label:s,to:u}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...c}=e;const{search:d,hash:f}=(0,s.TH)(),p=(0,ye.Iw)(n),m=(0,ye.gB)(n),{savePreferredVersionName:g}=(0,ke.J)(n),h=[...o,...m.map((e=>{const t=p.alternateDocVersions[e.name]??Ee(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>g(e.name)}})),...i],v=(0,we.lO)(n)[0],b=t&&h.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):v.label,y=t&&h.length>1?void 0:Ee(v).path;return h.length<=1?r.createElement(oe,(0,l.Z)({},c,{mobile:t,label:b,to:y,isActive:a?()=>!1:void 0})):r.createElement(fe,(0,l.Z)({},c,{mobile:t,label:b,to:y,items:h,isActive:a?()=>!1:void 0}))}};function xe(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Se[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function Ce(){const e=(0,L.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(xe,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function _e(e){return r.createElement("button",(0,l.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Te(){const e=0===(0,w.L)().navbar.items.length,t=M();return r.createElement(r.Fragment,null,!e&&r.createElement(_e,{onClick:()=>t.hide()}),t.content)}function Ae(){const e=(0,L.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(F,{header:r.createElement(K,null),primaryMenu:r.createElement(Ce,null),secondaryMenu:r.createElement(Te,null)}):null}const Le={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Re(e){return r.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Ne(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,L.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,R.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,"aria-label":(0,u.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Le.navbarHideable,!s&&Le.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Re,{onClick:i.toggle}),r.createElement(Ae,null))}var Pe=n(8780);const Oe={errorBoundaryError:"errorBoundaryError_a6uf"};function Ie(e){return r.createElement("button",(0,l.Z)({type:"button"},e),r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function De(e){let{error:t}=e;const n=(0,Pe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:Oe.errorBoundaryError},n)}class Me extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Fe="right";function Be(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,l.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function je(){const{toggle:e,shown:t}=(0,L.e)();return r.createElement("button",{onClick:e,"aria-label":(0,u.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},r.createElement(Be,null))}const ze={colorModeToggle:"colorModeToggle_DEke"};function Ue(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(Me,{key:t,onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t})},r.createElement(xe,e)))))}function $e(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function qe(){const e=(0,L.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??Fe)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement($e,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(je,null),r.createElement(W,null),r.createElement(Ue,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(Ue,{items:a}),r.createElement(Z,{className:ze.colorModeToggle}),!o&&r.createElement(be,null,r.createElement(he.Z,null)))})}function He(){return r.createElement(Ne,null,r.createElement(qe,null))}function Ge(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...s}=t,u=(0,X.Z)(n),c=(0,X.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(Q.Z,(0,l.Z)({className:"footer__link-item"},a?{href:i?c:a}:{to:u},s),o,a&&!(0,J.Z)(a)&&r.createElement(te.Z,null))}function Ze(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(Ge,{item:t}))}function Ve(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(Ze,{key:t,item:e})))))}function We(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(Ve,{key:t,column:e}))))}function Ye(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function Ke(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(Ge,{item:t})}function Qe(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(Ke,{item:e}),t.length!==n+1&&r.createElement(Ye,null))))))}function Xe(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(We,{columns:t}):r.createElement(Qe,{links:t})}var Je=n(941);const et={footerLogoLink:"footerLogoLink_BH7S"};function tt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(Je.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function nt(e){let{logo:t}=e;return t.href?r.createElement(Q.Z,{href:t.href,className:et.footerLogoLink,target:t.target},r.createElement(tt,{logo:t})):r.createElement(tt,{logo:t})}function rt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function at(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function ot(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(at,{style:o,links:n&&n.length>0&&r.createElement(Xe,{links:n}),logo:a&&r.createElement(nt,{logo:a}),copyright:t&&r.createElement(rt,{copyright:t})})}const it=r.memo(ot),lt=(0,N.Qc)([B.S,k.pl,R.OC,ke.L5,i.VC,function(e){let{children:t}=e;return r.createElement(P.n2,null,r.createElement(L.M,null,r.createElement(I,null,t)))}]);function st(e){let{children:t}=e;return r.createElement(lt,null,t)}function ut(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(Ie,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(De,{error:t})))))}const ct={mainWrapper:"mainWrapper_z2l0"};function dt(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:u}=e;return(0,v.t)(),r.createElement(st,null,r.createElement(i.d,{title:s,description:u}),r.createElement(y,null),r.createElement(A,null),r.createElement(He,null),r.createElement("div",{id:d,className:(0,a.Z)(h.k.wrapper.main,ct.mainWrapper,l)},r.createElement(o.Z,{fallback:e=>r.createElement(ut,e)},t)),!n&&r.createElement(it,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),l=n(2263),s=n(6668),u=n(941);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(u.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.Z)(),{navbar:{title:n,logo:u}}=(0,s.L)(),{imageClassName:d,titleClassName:f,...p}=e,m=(0,i.Z)(u?.href||"/"),g=n?"":t,h=u?.alt??g;return a.createElement(o.Z,(0,r.Z)({to:m},p,u?.target&&{target:u.target}),u&&a.createElement(c,{logo:u,alt:h,imageClassName:d}),null!=n&&a.createElement("b",{className:f},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:u,className:c,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:u[e],alt:d,className:(0,o.Z)(s.themedImage,s[`themedImage--${e}`],c)},f)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>s,z:()=>h});var r=n(7462),a=n(7294),o=n(412),i=n(1442);const l="ease-in-out";function s(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const u={display:"none",overflow:"hidden",height:"0px"},c={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?u:c;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=r?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??l}`,height:`${t}px`}}function s(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return d(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function p(e){if(!o.Z.canUseDOM)return e?u:c}function m(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const u=(0,a.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:o}),a.createElement(t,{ref:u,style:s?void 0:p(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(u.current,n),i?.(n))},className:l},r)}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(m,(0,r.Z)({},n,{collapsed:l})):null}function h(e){let{lazy:t,...n}=e;const r=t?g:m;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(7294),a=n(2389),o=n(12),i=n(902),l=n(6668);const s=(0,o.WA)("docusaurus.announcement.dismiss"),u=(0,o.WA)("docusaurus.announcement.id"),c=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{o(c())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>h,S:()=>g});var r=n(7294),a=n(412),o=n(902),i=n(12),l=n(6668);const s=r.createContext(void 0),u="theme",c=(0,i.WA)(u),d={light:"light",dark:"dark"},f=e=>e===d.dark?d.dark:d.light,p=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{c.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[a,o]=(0,r.useState)(p(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),c.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=c.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===d.dark},setLightTheme(){i(d.light)},setDarkTheme(){i(d.dark)}})),[a,i])}();return r.createElement(s.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>b,L5:()=>h});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(2802),s=n(902),u=n(12);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,u.WA)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(c(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function m(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=m();return r.createElement(p.Provider,{value:n},t)}function h(e){let{children:t}=e;return l.cE?r.createElement(g,null,t):r.createElement(r.Fragment,null,t)}function v(){const e=(0,r.useContext)(p);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function b(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=v(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},2961:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(7294),a=n(3102),o=n(7524),i=n(6550),l=(n(1688),n(902));function s(e){!function(e){const t=(0,i.k6)(),n=(0,l.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(6668);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,u.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function f(e){let{children:t}=e;const n=d();return r.createElement(c.Provider,{value:n},t)}function p(){const e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(7294),a=n(412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(){return a.Z.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const s=!1;function u(){const[e,t]=(0,r.useState)((()=>s?"ssr":l()));return(0,r.useEffect)((()=>{function e(){t(l())}const n=s?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},2802:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>f,_F:()=>g,cE:()=>d,hI:()=>k,lO:()=>b,vY:()=>w,oz:()=>y,s1:()=>v});var r=n(7294),a=n(6550),o=n(8790),i=n(143),l=n(373),s=n(1116);function u(e){return Array.from(new Set(e))}var c=n(8596);const d=!!i._r;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,c.Mg)(e,t),m=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||m(e.items,t))}function h(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,c.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,c.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function v(){const e=(0,s.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?h({sidebarItems:e.items,pathname:t}):null}function b(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}function y(e,t){const n=b(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function w(e,t){const n=b(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function k(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:u}}},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>c,VC:()=>p});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),u=n(2263);function c(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const c=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>u,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>s,RF:()=>d});var r=n(7294),a=n(412),o=n(2389),i=n(902);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const c=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(c()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(2263);const r="default";function a(e,t){return`docs-${e}-${t}`}},12:(e,t,n)=>{"use strict";n.d(t,{WA:()=>s});n(7294),n(1688);const r="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function o(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function s(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=o(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(2263),a=n(6550),o=n(8780);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.Z)(),{pathname:s}=(0,a.TH)(),u=(0,o.applyTrailingSlash)(s,{trailingSlash:n,baseUrl:e}),c=l===i?e:e.replace(`/${l}/`,"/"),d=u.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${c}`:`${c}${e}/`}(n)}${d}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>_,ob:()=>p,PP:()=>A,Ep:()=>f});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(8776);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(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 d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,g(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),g=s(n),h=0;h{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=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 a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{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())}),r.trickleSpeed)};return r.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)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.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");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.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 l=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(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var o,i,l=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);S+=E.value.length,E=E.next){var x=E.value;if(t.length>e.length)return;if(!(x instanceof a)){var C,_=1;if(b){if(!(C=o(k,S,e,v))||C.index>=e.length)break;var T=C.index,A=C.index+C[0].length,L=S;for(L+=E.value.length;T>=L;)L+=(E=E.next).value.length;if(S=L-=E.value.length,E.value instanceof a)continue;for(var R=E;R!==t.tail&&(Ld.reach&&(d.reach=I);var D=E.prev;if(P&&(D=s(t,D,P),S+=P.length),u(t,D,_),E=s(t,D,new a(f,h?r.tokenize(N,h):N,y,N)),O&&s(t,E,O),_>1){var M={cause:f+","+m,reach:I};i(e,t,n,E.prev,S,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function u(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,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 r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,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={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash: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}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};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[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|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|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|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|vcpkg|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;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\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}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\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}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\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]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"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]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,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"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside: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){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\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})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).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 r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\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:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?: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}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \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(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].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,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&p(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function u(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function c(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,c={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return c[n]=a,n})).join(""),n,r),f=Object.keys(c);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=u(c[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var g=[p];e(g),m.push.apply(m,g)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var h=r.content;Array.isArray(h)?e(h):e([h])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}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(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{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:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},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/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++a;var g=f.substring(0,m),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),v=f.substring(m+p.length),b=[];g&&b.push.apply(b,i([g])),b.push(h),v&&b.push.apply(b,i([v])),"string"==typeof u?l.splice.apply(l,[s,1].concat(b)):u.content=b}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,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")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,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-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",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/,function:{pattern:/(\()(?:abspath|addsuffix|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(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},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|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.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:/[{}[\];(),.:]/},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",{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(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,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,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,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\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,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:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},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+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),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|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|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!#$%&'*+\-./:<=>?@\\^`|~]+/,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:/[()]/};const o=a},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function u(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in a(t,o),l[t]=!0,n[t])l[i]=!0}t(s.require,u),t(s.optional,u),t(s.modify,u)}n[r]=l,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),u=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(s);i=i.map(u),l=(l||[]).map(u);var c=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(c[t]=!0,e(t))}))}));for(var f,p=r(s),m=c;a(m);){for(var g in f={},m){var h=s[g];t(h&&h.modify,(function(e){e in d&&(f[e]=!0)}))}for(var v in d)if(!(v in c))for(var b in p(v))if(b in c){f[v]=!0;break}for(var y in m=f)c[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,l={},s={};function u(e){if(e in l)return l[e];s[e]=!0;var a,c=[];for(var d in t(e))d in n&&c.push(d);if(0===c.length)a=r(e);else{var f=i(c.map((function(e){var t=u(e);return delete s[e],t})));o?a=o(f,(function(){return r(e)})):r(e)}return l[e]=a}for(var c in n)u(c);var d=[];for(var f in s)d.push(l[f]);return i(d)}(p,c,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n