From 55197f22097f4e140bfa8a5fcb92f1ff0506b2b9 Mon Sep 17 00:00:00 2001 From: Qing Date: Sun, 12 Jun 2022 13:01:45 +0800 Subject: [PATCH 1/6] frontend: better error handling --- lama_cleaner/app/src/adapters/inpainting.ts | 6 +++++- .../app/src/components/Editor/Editor.tsx | 19 +++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/lama_cleaner/app/src/adapters/inpainting.ts b/lama_cleaner/app/src/adapters/inpainting.ts index cac4bb4..fedd6e3 100644 --- a/lama_cleaner/app/src/adapters/inpainting.ts +++ b/lama_cleaner/app/src/adapters/inpainting.ts @@ -34,7 +34,11 @@ export default async function inpaint( method: 'POST', body: fd, }).then(async r => { - return r.blob() + console.log(r) + if (r.ok) { + return r.blob() + } + throw new Error('Something went wrong on server side.') }) return URL.createObjectURL(res) diff --git a/lama_cleaner/app/src/components/Editor/Editor.tsx b/lama_cleaner/app/src/components/Editor/Editor.tsx index 9cebfe2..8d08b8b 100644 --- a/lama_cleaner/app/src/components/Editor/Editor.tsx +++ b/lama_cleaner/app/src/components/Editor/Editor.tsx @@ -15,7 +15,7 @@ import { TransformComponent, TransformWrapper, } from 'react-zoom-pan-pinch' -import { useRecoilValue } from 'recoil' +import { useRecoilState, useRecoilValue } from 'recoil' import { useWindowSize, useKey, useKeyPressEvent } from 'react-use' import inpaint from '../../adapters/inpainting' import Button from '../shared/Button' @@ -28,7 +28,7 @@ import { loadImage, useImage, } from '../../utils' -import { settingState } from '../../store/Atoms' +import { settingState, toastState } from '../../store/Atoms' const TOOLBAR_SIZE = 200 const BRUSH_COLOR = '#ffcc00bb' @@ -73,6 +73,7 @@ function mouseXY(ev: SyntheticEvent) { export default function Editor(props: EditorProps) { const { file } = props const settings = useRecoilValue(settingState) + const [toastVal, setToastState] = useRecoilState(toastState) const [brushSize, setBrushSize] = useState(40) const [original, isOriginalLoaded] = useImage(file) const [renders, setRenders] = useState([]) @@ -144,12 +145,11 @@ export default function Editor(props: EditorProps) { } const newLineGroups = [...lineGroups, curLineGroup] - setLineGroups(newLineGroups) setCurLineGroup([]) setIsDraging(false) setIsInpaintingLoading(true) - drawAllLinesOnMask(newLineGroups) + try { const res = await inpaint( file, @@ -165,9 +165,16 @@ export default function Editor(props: EditorProps) { const newRenders = [...renders, newRender] setRenders(newRenders) draw(newRender, []) + // Only append new LineGroup after inpainting success + setLineGroups(newLineGroups) } catch (e: any) { - // eslint-disable-next-line - alert(e.message ? e.message : e.toString()) + setToastState({ + open: true, + desc: e.message ? e.message : e.toString(), + state: 'error', + duration: 2000, + }) + drawOnCurrentRender([]) } setIsInpaintingLoading(false) } From 35b92ba9de44bc9d007e2f1eded635134f356089 Mon Sep 17 00:00:00 2001 From: Qing Date: Sun, 12 Jun 2022 13:14:17 +0800 Subject: [PATCH 2/6] ldm add plms sampler --- lama_cleaner/app/src/adapters/inpainting.ts | 1 + .../components/Settings/HDSettingBlock.tsx | 5 + .../components/Settings/ModelSettingBlock.tsx | 20 ++ .../components/Shortcuts/ShortcutsModal.tsx | 2 +- .../src/components/shared/NumberInput.scss | 3 +- lama_cleaner/app/src/store/Atoms.tsx | 4 +- lama_cleaner/model/ddim_sampler.py | 193 +++++++++++++++ lama_cleaner/model/ldm.py | 225 ++---------------- lama_cleaner/model/plms_sampler.py | 225 ++++++++++++++++++ lama_cleaner/schema.py | 6 + lama_cleaner/server.py | 1 + 11 files changed, 478 insertions(+), 207 deletions(-) create mode 100644 lama_cleaner/model/ddim_sampler.py create mode 100644 lama_cleaner/model/plms_sampler.py diff --git a/lama_cleaner/app/src/adapters/inpainting.ts b/lama_cleaner/app/src/adapters/inpainting.ts index fedd6e3..3965d54 100644 --- a/lama_cleaner/app/src/adapters/inpainting.ts +++ b/lama_cleaner/app/src/adapters/inpainting.ts @@ -16,6 +16,7 @@ export default async function inpaint( fd.append('mask', mask) fd.append('ldmSteps', settings.ldmSteps.toString()) + fd.append('ldmSampler', settings.ldmSampler.toString()) fd.append('hdStrategy', settings.hdStrategy) fd.append('hdStrategyCropMargin', settings.hdStrategyCropMargin.toString()) fd.append( diff --git a/lama_cleaner/app/src/components/Settings/HDSettingBlock.tsx b/lama_cleaner/app/src/components/Settings/HDSettingBlock.tsx index 565950f..57fed00 100644 --- a/lama_cleaner/app/src/components/Settings/HDSettingBlock.tsx +++ b/lama_cleaner/app/src/components/Settings/HDSettingBlock.tsx @@ -11,6 +11,11 @@ export enum HDStrategy { CROP = 'Crop', } +export enum LDMSampler { + ddim = 'ddim', + plms = 'plms', +} + function HDSettingBlock() { const [setting, setSettingState] = useRecoilState(settingState) diff --git a/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx b/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx index aac6e1b..2d7a1f9 100644 --- a/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx +++ b/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx @@ -2,6 +2,7 @@ import React, { ReactNode } from 'react' import { useRecoilState } from 'recoil' import { settingState } from '../../store/Atoms' import Selector from '../shared/Selector' +import { LDMSampler } from './HDSettingBlock' import NumberInputSetting from './NumberInputSetting' import SettingBlock from './SettingBlock' @@ -19,6 +20,12 @@ function ModelSettingBlock() { }) } + const onLDMSamplerChange = (value: LDMSampler) => { + setSettingState(old => { + return { ...old, ldmSampler: value } + }) + } + const renderModelDesc = ( name: string, paperUrl: string, @@ -65,6 +72,19 @@ function ModelSettingBlock() { }) }} /> + + onLDMSamplerChange(val as LDMSampler)} + /> + } + /> ) } diff --git a/lama_cleaner/app/src/components/Shortcuts/ShortcutsModal.tsx b/lama_cleaner/app/src/components/Shortcuts/ShortcutsModal.tsx index ef8efbb..643c47b 100644 --- a/lama_cleaner/app/src/components/Shortcuts/ShortcutsModal.tsx +++ b/lama_cleaner/app/src/components/Shortcuts/ShortcutsModal.tsx @@ -56,7 +56,7 @@ export default function ShortcutsModal() { /> - + diff --git a/lama_cleaner/app/src/components/shared/NumberInput.scss b/lama_cleaner/app/src/components/shared/NumberInput.scss index d51dc32..673cb98 100644 --- a/lama_cleaner/app/src/components/shared/NumberInput.scss +++ b/lama_cleaner/app/src/components/shared/NumberInput.scss @@ -2,8 +2,9 @@ all: unset; flex: 1 0 auto; border-radius: 0.5rem; - padding: 0.4rem 0.8rem; + padding: 0 0.8rem; outline: 1px solid var(--border-color); + height: 36px; &:focus-visible { outline: 1px solid var(--yellow-accent); diff --git a/lama_cleaner/app/src/store/Atoms.tsx b/lama_cleaner/app/src/store/Atoms.tsx index 01efff2..5317637 100644 --- a/lama_cleaner/app/src/store/Atoms.tsx +++ b/lama_cleaner/app/src/store/Atoms.tsx @@ -1,5 +1,5 @@ import { atom } from 'recoil' -import { HDStrategy } from '../components/Settings/HDSettingBlock' +import { HDStrategy, LDMSampler } from '../components/Settings/HDSettingBlock' import { AIModel } from '../components/Settings/ModelSettingBlock' import { ToastState } from '../components/shared/Toast' @@ -43,6 +43,7 @@ export interface Settings { // For LDM ldmSteps: number + ldmSampler: LDMSampler } export const settingStateDefault = { @@ -50,6 +51,7 @@ export const settingStateDefault = { runInpaintingManually: false, model: AIModel.LAMA, ldmSteps: 50, + ldmSampler: LDMSampler.plms, hdStrategy: HDStrategy.RESIZE, hdStrategyResizeLimit: 2048, hdStrategyCropTrigerSize: 2048, diff --git a/lama_cleaner/model/ddim_sampler.py b/lama_cleaner/model/ddim_sampler.py new file mode 100644 index 0000000..d1e4400 --- /dev/null +++ b/lama_cleaner/model/ddim_sampler.py @@ -0,0 +1,193 @@ +import torch +import numpy as np +from tqdm import tqdm + +from lama_cleaner.model.utils import make_ddim_timesteps, make_ddim_sampling_parameters, noise_like + +from loguru import logger + + +class DDIMSampler(object): + def __init__(self, model, schedule="linear"): + super().__init__() + self.model = model + self.ddpm_num_timesteps = model.num_timesteps + self.schedule = schedule + + def register_buffer(self, name, attr): + setattr(self, name, attr) + + def make_schedule( + self, ddim_num_steps, ddim_discretize="uniform", ddim_eta=0.0, verbose=True + ): + self.ddim_timesteps = make_ddim_timesteps( + ddim_discr_method=ddim_discretize, + num_ddim_timesteps=ddim_num_steps, + # array([1]) + num_ddpm_timesteps=self.ddpm_num_timesteps, + verbose=verbose, + ) + alphas_cumprod = self.model.alphas_cumprod # torch.Size([1000]) + assert ( + alphas_cumprod.shape[0] == self.ddpm_num_timesteps + ), "alphas have to be defined for each timestep" + to_torch = lambda x: x.clone().detach().to(torch.float32).to(self.model.device) + + self.register_buffer("betas", to_torch(self.model.betas)) + self.register_buffer("alphas_cumprod", to_torch(alphas_cumprod)) + self.register_buffer( + "alphas_cumprod_prev", to_torch(self.model.alphas_cumprod_prev) + ) + + # calculations for diffusion q(x_t | x_{t-1}) and others + self.register_buffer( + "sqrt_alphas_cumprod", to_torch(np.sqrt(alphas_cumprod.cpu())) + ) + self.register_buffer( + "sqrt_one_minus_alphas_cumprod", + to_torch(np.sqrt(1.0 - alphas_cumprod.cpu())), + ) + self.register_buffer( + "log_one_minus_alphas_cumprod", to_torch(np.log(1.0 - alphas_cumprod.cpu())) + ) + self.register_buffer( + "sqrt_recip_alphas_cumprod", to_torch(np.sqrt(1.0 / alphas_cumprod.cpu())) + ) + self.register_buffer( + "sqrt_recipm1_alphas_cumprod", + to_torch(np.sqrt(1.0 / alphas_cumprod.cpu() - 1)), + ) + + # ddim sampling parameters + ddim_sigmas, ddim_alphas, ddim_alphas_prev = make_ddim_sampling_parameters( + alphacums=alphas_cumprod.cpu(), + ddim_timesteps=self.ddim_timesteps, + eta=ddim_eta, + verbose=verbose, + ) + self.register_buffer("ddim_sigmas", ddim_sigmas) + self.register_buffer("ddim_alphas", ddim_alphas) + self.register_buffer("ddim_alphas_prev", ddim_alphas_prev) + self.register_buffer("ddim_sqrt_one_minus_alphas", np.sqrt(1.0 - ddim_alphas)) + sigmas_for_original_sampling_steps = ddim_eta * torch.sqrt( + (1 - self.alphas_cumprod_prev) + / (1 - self.alphas_cumprod) + * (1 - self.alphas_cumprod / self.alphas_cumprod_prev) + ) + self.register_buffer( + "ddim_sigmas_for_original_num_steps", sigmas_for_original_sampling_steps + ) + + @torch.no_grad() + def sample(self, steps, conditioning, batch_size, shape): + self.make_schedule(ddim_num_steps=steps, ddim_eta=0, verbose=False) + # sampling + C, H, W = shape + size = (batch_size, C, H, W) + + # samples: 1,3,128,128 + return self.ddim_sampling( + conditioning, + size, + quantize_denoised=False, + ddim_use_original_steps=False, + noise_dropout=0, + temperature=1.0, + ) + + @torch.no_grad() + def ddim_sampling( + self, + cond, + shape, + ddim_use_original_steps=False, + quantize_denoised=False, + temperature=1.0, + noise_dropout=0.0, + ): + device = self.model.betas.device + b = shape[0] + img = torch.randn(shape, device=device, dtype=cond.dtype) + timesteps = ( + self.ddpm_num_timesteps if ddim_use_original_steps else self.ddim_timesteps + ) + + time_range = ( + reversed(range(0, timesteps)) + if ddim_use_original_steps + else np.flip(timesteps) + ) + total_steps = timesteps if ddim_use_original_steps else timesteps.shape[0] + logger.info(f"Running DDIM Sampling with {total_steps} timesteps") + + iterator = tqdm(time_range, desc="DDIM Sampler", total=total_steps) + + for i, step in enumerate(iterator): + index = total_steps - i - 1 + ts = torch.full((b,), step, device=device, dtype=torch.long) + + outs = self.p_sample_ddim( + img, + cond, + ts, + index=index, + use_original_steps=ddim_use_original_steps, + quantize_denoised=quantize_denoised, + temperature=temperature, + noise_dropout=noise_dropout, + ) + img, _ = outs + + return img + + @torch.no_grad() + def p_sample_ddim( + self, + x, + c, + t, + index, + repeat_noise=False, + use_original_steps=False, + quantize_denoised=False, + temperature=1.0, + noise_dropout=0.0, + ): + b, *_, device = *x.shape, x.device + e_t = self.model.apply_model(x, t, c) + + alphas = self.model.alphas_cumprod if use_original_steps else self.ddim_alphas + alphas_prev = ( + self.model.alphas_cumprod_prev + if use_original_steps + else self.ddim_alphas_prev + ) + sqrt_one_minus_alphas = ( + self.model.sqrt_one_minus_alphas_cumprod + if use_original_steps + else self.ddim_sqrt_one_minus_alphas + ) + sigmas = ( + self.model.ddim_sigmas_for_original_num_steps + if use_original_steps + else self.ddim_sigmas + ) + # select parameters corresponding to the currently considered timestep + a_t = torch.full((b, 1, 1, 1), alphas[index], device=device) + a_prev = torch.full((b, 1, 1, 1), alphas_prev[index], device=device) + sigma_t = torch.full((b, 1, 1, 1), sigmas[index], device=device) + sqrt_one_minus_at = torch.full( + (b, 1, 1, 1), sqrt_one_minus_alphas[index], device=device + ) + + # current prediction for x_0 + pred_x0 = (x - sqrt_one_minus_at * e_t) / a_t.sqrt() + if quantize_denoised: # 没用 + pred_x0, _, *_ = self.model.first_stage_model.quantize(pred_x0) + # direction pointing to x_t + dir_xt = (1.0 - a_prev - sigma_t ** 2).sqrt() * e_t + noise = sigma_t * noise_like(x.shape, device, repeat_noise) * temperature + if noise_dropout > 0.0: # 没用 + noise = torch.nn.functional.dropout(noise, p=noise_dropout) + x_prev = a_prev.sqrt() * pred_x0 + dir_xt + noise + return x_prev, pred_x0 diff --git a/lama_cleaner/model/ldm.py b/lama_cleaner/model/ldm.py index 2fea7c0..7720092 100644 --- a/lama_cleaner/model/ldm.py +++ b/lama_cleaner/model/ldm.py @@ -5,17 +5,15 @@ import torch from loguru import logger from lama_cleaner.model.base import InpaintModel -from lama_cleaner.schema import Config +from lama_cleaner.model.ddim_sampler import DDIMSampler +from lama_cleaner.model.plms_sampler import PLMSSampler +from lama_cleaner.schema import Config, LDMSampler torch.manual_seed(42) import torch.nn as nn -from tqdm import tqdm from lama_cleaner.helper import download_model, norm_img, get_cache_path_by_url from lama_cleaner.model.utils import ( make_beta_schedule, - make_ddim_timesteps, - make_ddim_sampling_parameters, - noise_like, timestep_embedding, ) @@ -94,7 +92,7 @@ class DDPM(nn.Module): self.linear_start = linear_start self.linear_end = linear_end assert ( - alphas_cumprod.shape[0] == self.num_timesteps + alphas_cumprod.shape[0] == self.num_timesteps ), "alphas have to be defined for each timestep" to_torch = lambda x: torch.tensor(x, dtype=torch.float32).to(self.device) @@ -120,7 +118,7 @@ class DDPM(nn.Module): # calculations for posterior q(x_{t-1} | x_t, x_0) posterior_variance = (1 - self.v_posterior) * betas * ( - 1.0 - alphas_cumprod_prev + 1.0 - alphas_cumprod_prev ) / (1.0 - alphas_cumprod) + self.v_posterior * betas # above: equal to 1. / (1. / (1. - alpha_cumprod_tm1) + alpha_t / beta_t) self.register_buffer("posterior_variance", to_torch(posterior_variance)) @@ -142,16 +140,16 @@ class DDPM(nn.Module): if self.parameterization == "eps": lvlb_weights = self.betas ** 2 / ( - 2 - * self.posterior_variance - * to_torch(alphas) - * (1 - self.alphas_cumprod) + 2 + * self.posterior_variance + * to_torch(alphas) + * (1 - self.alphas_cumprod) ) elif self.parameterization == "x0": lvlb_weights = ( - 0.5 - * np.sqrt(torch.Tensor(alphas_cumprod)) - / (2.0 * 1 - torch.Tensor(alphas_cumprod)) + 0.5 + * np.sqrt(torch.Tensor(alphas_cumprod)) + / (2.0 * 1 - torch.Tensor(alphas_cumprod)) ) else: raise NotImplementedError("mu not supported") @@ -221,192 +219,6 @@ class LatentDiffusion(DDPM): return x_recon -class DDIMSampler(object): - def __init__(self, model, schedule="linear"): - super().__init__() - self.model = model - self.ddpm_num_timesteps = model.num_timesteps - self.schedule = schedule - - def register_buffer(self, name, attr): - setattr(self, name, attr) - - def make_schedule( - self, ddim_num_steps, ddim_discretize="uniform", ddim_eta=0.0, verbose=True - ): - self.ddim_timesteps = make_ddim_timesteps( - ddim_discr_method=ddim_discretize, - num_ddim_timesteps=ddim_num_steps, - # array([1]) - num_ddpm_timesteps=self.ddpm_num_timesteps, - verbose=verbose, - ) - alphas_cumprod = self.model.alphas_cumprod # torch.Size([1000]) - assert ( - alphas_cumprod.shape[0] == self.ddpm_num_timesteps - ), "alphas have to be defined for each timestep" - to_torch = lambda x: x.clone().detach().to(torch.float32).to(self.model.device) - - self.register_buffer("betas", to_torch(self.model.betas)) - self.register_buffer("alphas_cumprod", to_torch(alphas_cumprod)) - self.register_buffer( - "alphas_cumprod_prev", to_torch(self.model.alphas_cumprod_prev) - ) - - # calculations for diffusion q(x_t | x_{t-1}) and others - self.register_buffer( - "sqrt_alphas_cumprod", to_torch(np.sqrt(alphas_cumprod.cpu())) - ) - self.register_buffer( - "sqrt_one_minus_alphas_cumprod", - to_torch(np.sqrt(1.0 - alphas_cumprod.cpu())), - ) - self.register_buffer( - "log_one_minus_alphas_cumprod", to_torch(np.log(1.0 - alphas_cumprod.cpu())) - ) - self.register_buffer( - "sqrt_recip_alphas_cumprod", to_torch(np.sqrt(1.0 / alphas_cumprod.cpu())) - ) - self.register_buffer( - "sqrt_recipm1_alphas_cumprod", - to_torch(np.sqrt(1.0 / alphas_cumprod.cpu() - 1)), - ) - - # ddim sampling parameters - ddim_sigmas, ddim_alphas, ddim_alphas_prev = make_ddim_sampling_parameters( - alphacums=alphas_cumprod.cpu(), - ddim_timesteps=self.ddim_timesteps, - eta=ddim_eta, - verbose=verbose, - ) - self.register_buffer("ddim_sigmas", ddim_sigmas) - self.register_buffer("ddim_alphas", ddim_alphas) - self.register_buffer("ddim_alphas_prev", ddim_alphas_prev) - self.register_buffer("ddim_sqrt_one_minus_alphas", np.sqrt(1.0 - ddim_alphas)) - sigmas_for_original_sampling_steps = ddim_eta * torch.sqrt( - (1 - self.alphas_cumprod_prev) - / (1 - self.alphas_cumprod) - * (1 - self.alphas_cumprod / self.alphas_cumprod_prev) - ) - self.register_buffer( - "ddim_sigmas_for_original_num_steps", sigmas_for_original_sampling_steps - ) - - @torch.no_grad() - def sample(self, steps, conditioning, batch_size, shape): - self.make_schedule(ddim_num_steps=steps, ddim_eta=0, verbose=False) - # sampling - C, H, W = shape - size = (batch_size, C, H, W) - - # samples: 1,3,128,128 - return self.ddim_sampling( - conditioning, - size, - quantize_denoised=False, - ddim_use_original_steps=False, - noise_dropout=0, - temperature=1.0, - ) - - @torch.no_grad() - def ddim_sampling( - self, - cond, - shape, - ddim_use_original_steps=False, - quantize_denoised=False, - temperature=1.0, - noise_dropout=0.0, - ): - device = self.model.betas.device - b = shape[0] - img = torch.randn(shape, device=device, dtype=cond.dtype) - timesteps = ( - self.ddpm_num_timesteps if ddim_use_original_steps else self.ddim_timesteps - ) - - time_range = ( - reversed(range(0, timesteps)) - if ddim_use_original_steps - else np.flip(timesteps) - ) - total_steps = timesteps if ddim_use_original_steps else timesteps.shape[0] - logger.info(f"Running DDIM Sampling with {total_steps} timesteps") - - iterator = tqdm(time_range, desc="DDIM Sampler", total=total_steps) - - for i, step in enumerate(iterator): - index = total_steps - i - 1 - ts = torch.full((b,), step, device=device, dtype=torch.long) - - outs = self.p_sample_ddim( - img, - cond, - ts, - index=index, - use_original_steps=ddim_use_original_steps, - quantize_denoised=quantize_denoised, - temperature=temperature, - noise_dropout=noise_dropout, - ) - img, _ = outs - - return img - - @torch.no_grad() - def p_sample_ddim( - self, - x, - c, - t, - index, - repeat_noise=False, - use_original_steps=False, - quantize_denoised=False, - temperature=1.0, - noise_dropout=0.0, - ): - b, *_, device = *x.shape, x.device - e_t = self.model.apply_model(x, t, c) - - alphas = self.model.alphas_cumprod if use_original_steps else self.ddim_alphas - alphas_prev = ( - self.model.alphas_cumprod_prev - if use_original_steps - else self.ddim_alphas_prev - ) - sqrt_one_minus_alphas = ( - self.model.sqrt_one_minus_alphas_cumprod - if use_original_steps - else self.ddim_sqrt_one_minus_alphas - ) - sigmas = ( - self.model.ddim_sigmas_for_original_num_steps - if use_original_steps - else self.ddim_sigmas - ) - # select parameters corresponding to the currently considered timestep - a_t = torch.full((b, 1, 1, 1), alphas[index], device=device) - a_prev = torch.full((b, 1, 1, 1), alphas_prev[index], device=device) - sigma_t = torch.full((b, 1, 1, 1), sigmas[index], device=device) - sqrt_one_minus_at = torch.full( - (b, 1, 1, 1), sqrt_one_minus_alphas[index], device=device - ) - - # current prediction for x_0 - pred_x0 = (x - sqrt_one_minus_at * e_t) / a_t.sqrt() - if quantize_denoised: # 没用 - pred_x0, _, *_ = self.model.first_stage_model.quantize(pred_x0) - # direction pointing to x_t - dir_xt = (1.0 - a_prev - sigma_t ** 2).sqrt() * e_t - noise = sigma_t * noise_like(x.shape, device, repeat_noise) * temperature - if noise_dropout > 0.0: # 没用 - noise = torch.nn.functional.dropout(noise, p=noise_dropout) - x_prev = a_prev.sqrt() * pred_x0 + dir_xt + noise - return x_prev, pred_x0 - - def load_jit_model(url, device): model_path = download_model(url) logger.info(f"Load LDM model from: {model_path}") @@ -432,8 +244,7 @@ class LDM(InpaintModel): self.cond_stage_model_decode = self.cond_stage_model_decode.half() self.cond_stage_model_encode = self.cond_stage_model_encode.half() - model = LatentDiffusion(self.diffusion_model, device) - self.sampler = DDIMSampler(model) + self.model = LatentDiffusion(self.diffusion_model, device) @staticmethod def is_downloaded() -> bool: @@ -454,6 +265,13 @@ class LDM(InpaintModel): # image [1,3,512,512] float32 # mask: [1,1,512,512] float32 # masked_image: [1,3,512,512] float32 + if config.ldm_sampler == LDMSampler.ddim: + sampler = DDIMSampler(self.model) + elif config.ldm_sampler == LDMSampler.plms: + sampler = PLMSSampler(self.model) + else: + raise ValueError() + steps = config.ldm_steps image = norm_img(image) mask = norm_img(mask) @@ -465,7 +283,6 @@ class LDM(InpaintModel): mask = torch.from_numpy(mask).unsqueeze(0).to(self.device) masked_image = (1 - mask) * image - image = self._norm(image) mask = self._norm(mask) masked_image = self._norm(masked_image) @@ -476,7 +293,7 @@ class LDM(InpaintModel): c = torch.cat((c, cc), dim=1) # 1,4,128,128 shape = (c.shape[1] - 1,) + c.shape[2:] - samples_ddim = self.sampler.sample( + samples_ddim = sampler.sample( steps=steps, conditioning=c, batch_size=c.shape[0], shape=shape ) torch.cuda.empty_cache() diff --git a/lama_cleaner/model/plms_sampler.py b/lama_cleaner/model/plms_sampler.py new file mode 100644 index 0000000..d9c0416 --- /dev/null +++ b/lama_cleaner/model/plms_sampler.py @@ -0,0 +1,225 @@ +# From: https://github.com/CompVis/latent-diffusion/blob/main/ldm/models/diffusion/plms.py +import torch +import numpy as np +from lama_cleaner.model.utils import make_ddim_timesteps, make_ddim_sampling_parameters, noise_like +from tqdm import tqdm + + +class PLMSSampler(object): + def __init__(self, model, schedule="linear", **kwargs): + super().__init__() + self.model = model + self.ddpm_num_timesteps = model.num_timesteps + self.schedule = schedule + + def register_buffer(self, name, attr): + setattr(self, name, attr) + + def make_schedule(self, ddim_num_steps, ddim_discretize="uniform", ddim_eta=0., verbose=True): + if ddim_eta != 0: + raise ValueError('ddim_eta must be 0 for PLMS') + self.ddim_timesteps = make_ddim_timesteps(ddim_discr_method=ddim_discretize, num_ddim_timesteps=ddim_num_steps, + num_ddpm_timesteps=self.ddpm_num_timesteps, verbose=verbose) + alphas_cumprod = self.model.alphas_cumprod + assert alphas_cumprod.shape[0] == self.ddpm_num_timesteps, 'alphas have to be defined for each timestep' + to_torch = lambda x: x.clone().detach().to(torch.float32).to(self.model.device) + + self.register_buffer('betas', to_torch(self.model.betas)) + self.register_buffer('alphas_cumprod', to_torch(alphas_cumprod)) + self.register_buffer('alphas_cumprod_prev', to_torch(self.model.alphas_cumprod_prev)) + + # calculations for diffusion q(x_t | x_{t-1}) and others + self.register_buffer('sqrt_alphas_cumprod', to_torch(np.sqrt(alphas_cumprod.cpu()))) + self.register_buffer('sqrt_one_minus_alphas_cumprod', to_torch(np.sqrt(1. - alphas_cumprod.cpu()))) + self.register_buffer('log_one_minus_alphas_cumprod', to_torch(np.log(1. - alphas_cumprod.cpu()))) + self.register_buffer('sqrt_recip_alphas_cumprod', to_torch(np.sqrt(1. / alphas_cumprod.cpu()))) + self.register_buffer('sqrt_recipm1_alphas_cumprod', to_torch(np.sqrt(1. / alphas_cumprod.cpu() - 1))) + + # ddim sampling parameters + ddim_sigmas, ddim_alphas, ddim_alphas_prev = make_ddim_sampling_parameters(alphacums=alphas_cumprod.cpu(), + ddim_timesteps=self.ddim_timesteps, + eta=ddim_eta, verbose=verbose) + self.register_buffer('ddim_sigmas', ddim_sigmas) + self.register_buffer('ddim_alphas', ddim_alphas) + self.register_buffer('ddim_alphas_prev', ddim_alphas_prev) + self.register_buffer('ddim_sqrt_one_minus_alphas', np.sqrt(1. - ddim_alphas)) + sigmas_for_original_sampling_steps = ddim_eta * torch.sqrt( + (1 - self.alphas_cumprod_prev) / (1 - self.alphas_cumprod) * ( + 1 - self.alphas_cumprod / self.alphas_cumprod_prev)) + self.register_buffer('ddim_sigmas_for_original_num_steps', sigmas_for_original_sampling_steps) + + @torch.no_grad() + def sample(self, + steps, + batch_size, + shape, + conditioning=None, + callback=None, + normals_sequence=None, + img_callback=None, + quantize_x0=False, + eta=0., + mask=None, + x0=None, + temperature=1., + noise_dropout=0., + score_corrector=None, + corrector_kwargs=None, + verbose=False, + x_T=None, + log_every_t=100, + unconditional_guidance_scale=1., + unconditional_conditioning=None, + # this has to come in the same format as the conditioning, # e.g. as encoded tokens, ... + **kwargs + ): + if conditioning is not None: + if isinstance(conditioning, dict): + cbs = conditioning[list(conditioning.keys())[0]].shape[0] + if cbs != batch_size: + print(f"Warning: Got {cbs} conditionings but batch-size is {batch_size}") + else: + if conditioning.shape[0] != batch_size: + print(f"Warning: Got {conditioning.shape[0]} conditionings but batch-size is {batch_size}") + + self.make_schedule(ddim_num_steps=steps, ddim_eta=eta, verbose=verbose) + # sampling + C, H, W = shape + size = (batch_size, C, H, W) + print(f'Data shape for PLMS sampling is {size}') + + samples = self.plms_sampling(conditioning, size, + callback=callback, + img_callback=img_callback, + quantize_denoised=quantize_x0, + mask=mask, x0=x0, + ddim_use_original_steps=False, + noise_dropout=noise_dropout, + temperature=temperature, + score_corrector=score_corrector, + corrector_kwargs=corrector_kwargs, + x_T=x_T, + log_every_t=log_every_t, + unconditional_guidance_scale=unconditional_guidance_scale, + unconditional_conditioning=unconditional_conditioning, + ) + return samples + + @torch.no_grad() + def plms_sampling(self, cond, shape, + x_T=None, ddim_use_original_steps=False, + callback=None, timesteps=None, quantize_denoised=False, + mask=None, x0=None, img_callback=None, log_every_t=100, + temperature=1., noise_dropout=0., score_corrector=None, corrector_kwargs=None, + unconditional_guidance_scale=1., unconditional_conditioning=None, ): + device = self.model.betas.device + b = shape[0] + if x_T is None: + img = torch.randn(shape, device=device) + else: + img = x_T + + if timesteps is None: + timesteps = self.ddpm_num_timesteps if ddim_use_original_steps else self.ddim_timesteps + elif timesteps is not None and not ddim_use_original_steps: + subset_end = int(min(timesteps / self.ddim_timesteps.shape[0], 1) * self.ddim_timesteps.shape[0]) - 1 + timesteps = self.ddim_timesteps[:subset_end] + + time_range = list(reversed(range(0, timesteps))) if ddim_use_original_steps else np.flip(timesteps) + total_steps = timesteps if ddim_use_original_steps else timesteps.shape[0] + print(f"Running PLMS Sampling with {total_steps} timesteps") + + iterator = tqdm(time_range, desc='PLMS Sampler', total=total_steps) + old_eps = [] + + for i, step in enumerate(iterator): + index = total_steps - i - 1 + ts = torch.full((b,), step, device=device, dtype=torch.long) + ts_next = torch.full((b,), time_range[min(i + 1, len(time_range) - 1)], device=device, dtype=torch.long) + + if mask is not None: + assert x0 is not None + img_orig = self.model.q_sample(x0, ts) # TODO: deterministic forward pass? + img = img_orig * mask + (1. - mask) * img + + outs = self.p_sample_plms(img, cond, ts, index=index, use_original_steps=ddim_use_original_steps, + quantize_denoised=quantize_denoised, temperature=temperature, + noise_dropout=noise_dropout, score_corrector=score_corrector, + corrector_kwargs=corrector_kwargs, + unconditional_guidance_scale=unconditional_guidance_scale, + unconditional_conditioning=unconditional_conditioning, + old_eps=old_eps, t_next=ts_next) + img, pred_x0, e_t = outs + old_eps.append(e_t) + if len(old_eps) >= 4: + old_eps.pop(0) + if callback: callback(i) + if img_callback: img_callback(pred_x0, i) + + return img + + @torch.no_grad() + def p_sample_plms(self, x, c, t, index, repeat_noise=False, use_original_steps=False, quantize_denoised=False, + temperature=1., noise_dropout=0., score_corrector=None, corrector_kwargs=None, + unconditional_guidance_scale=1., unconditional_conditioning=None, old_eps=None, t_next=None): + b, *_, device = *x.shape, x.device + + def get_model_output(x, t): + if unconditional_conditioning is None or unconditional_guidance_scale == 1.: + e_t = self.model.apply_model(x, t, c) + else: + x_in = torch.cat([x] * 2) + t_in = torch.cat([t] * 2) + c_in = torch.cat([unconditional_conditioning, c]) + e_t_uncond, e_t = self.model.apply_model(x_in, t_in, c_in).chunk(2) + e_t = e_t_uncond + unconditional_guidance_scale * (e_t - e_t_uncond) + + if score_corrector is not None: + assert self.model.parameterization == "eps" + e_t = score_corrector.modify_score(self.model, e_t, x, t, c, **corrector_kwargs) + + return e_t + + alphas = self.model.alphas_cumprod if use_original_steps else self.ddim_alphas + alphas_prev = self.model.alphas_cumprod_prev if use_original_steps else self.ddim_alphas_prev + sqrt_one_minus_alphas = self.model.sqrt_one_minus_alphas_cumprod if use_original_steps else self.ddim_sqrt_one_minus_alphas + sigmas = self.model.ddim_sigmas_for_original_num_steps if use_original_steps else self.ddim_sigmas + + def get_x_prev_and_pred_x0(e_t, index): + # select parameters corresponding to the currently considered timestep + a_t = torch.full((b, 1, 1, 1), alphas[index], device=device) + a_prev = torch.full((b, 1, 1, 1), alphas_prev[index], device=device) + sigma_t = torch.full((b, 1, 1, 1), sigmas[index], device=device) + sqrt_one_minus_at = torch.full((b, 1, 1, 1), sqrt_one_minus_alphas[index], device=device) + + # current prediction for x_0 + pred_x0 = (x - sqrt_one_minus_at * e_t) / a_t.sqrt() + if quantize_denoised: + pred_x0, _, *_ = self.model.first_stage_model.quantize(pred_x0) + # direction pointing to x_t + dir_xt = (1. - a_prev - sigma_t ** 2).sqrt() * e_t + noise = sigma_t * noise_like(x.shape, device, repeat_noise) * temperature + if noise_dropout > 0.: + noise = torch.nn.functional.dropout(noise, p=noise_dropout) + x_prev = a_prev.sqrt() * pred_x0 + dir_xt + noise + return x_prev, pred_x0 + + e_t = get_model_output(x, t) + if len(old_eps) == 0: + # Pseudo Improved Euler (2nd order) + x_prev, pred_x0 = get_x_prev_and_pred_x0(e_t, index) + e_t_next = get_model_output(x_prev, t_next) + e_t_prime = (e_t + e_t_next) / 2 + elif len(old_eps) == 1: + # 2nd order Pseudo Linear Multistep (Adams-Bashforth) + e_t_prime = (3 * e_t - old_eps[-1]) / 2 + elif len(old_eps) == 2: + # 3nd order Pseudo Linear Multistep (Adams-Bashforth) + e_t_prime = (23 * e_t - 16 * old_eps[-1] + 5 * old_eps[-2]) / 12 + elif len(old_eps) >= 3: + # 4nd order Pseudo Linear Multistep (Adams-Bashforth) + e_t_prime = (55 * e_t - 59 * old_eps[-1] + 37 * old_eps[-2] - 9 * old_eps[-3]) / 24 + + x_prev, pred_x0 = get_x_prev_and_pred_x0(e_t_prime, index) + + return x_prev, pred_x0, e_t diff --git a/lama_cleaner/schema.py b/lama_cleaner/schema.py index 0d6fad8..a66afa1 100644 --- a/lama_cleaner/schema.py +++ b/lama_cleaner/schema.py @@ -9,8 +9,14 @@ class HDStrategy(str, Enum): CROP = 'Crop' +class LDMSampler(str, Enum): + ddim = 'ddim' + plms = 'plms' + + class Config(BaseModel): ldm_steps: int + ldm_sampler: str hd_strategy: str hd_strategy_crop_margin: int hd_strategy_crop_trigger_size: int diff --git a/lama_cleaner/server.py b/lama_cleaner/server.py index 64e21e4..79b8a0b 100644 --- a/lama_cleaner/server.py +++ b/lama_cleaner/server.py @@ -93,6 +93,7 @@ def process(): config = Config( ldm_steps=form["ldmSteps"], + ldm_sampler=form["ldmSampler"], hd_strategy=form["hdStrategy"], hd_strategy_crop_margin=form["hdStrategyCropMargin"], hd_strategy_crop_trigger_size=form["hdStrategyCropTrigerSize"], From a35ed7f71698911875448d6c1ce369e9c9228e16 Mon Sep 17 00:00:00 2001 From: Qing Date: Sun, 12 Jun 2022 22:06:29 +0800 Subject: [PATCH 3/6] update README --- README.md | 34 ++++++++++++++++++++++++++++++++-- assets/settings.png | Bin 0 -> 81782 bytes 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 assets/settings.png diff --git a/README.md b/README.md index cf14c46..c3eb3b5 100644 --- a/README.md +++ b/README.md @@ -36,10 +36,40 @@ Available commands: | --port | Port for flask web server | 8080 | | --debug | Enable debug mode for flask web server | | +## Settings + +You can change the configs of inpainting process in the settings interface of the web page. + + + +### Inpainting Model + +Select the inpainting model to use, and set the configs corresponding to the model. + +LaMa model has no configs that can be specified at runtime. + +LDM model has two configs to control the quality of final result: +1. steps: You can get better result with large steps, but it will be more time-consuming +2. sampler: ddim or [plms](https://arxiv.org/abs/2202.09778). In general plms can get better results with fewer steps + + +### High Resolution Strategy + +There are three strategies for handling high-resolution images. + +- **Original**: Use the original resolution of the picture, suitable for picture size below 2K. +- **Resize**: Resize the longer side of the image to a specific size(keep ratio), then do inpainting on the resized image. +The inpainting result will be pasted back on the original image to make sure other part of image not loss quality. +- **Crop**: Crop masking area from the original image to do inpainting, and paste the result back. +Mainly for performance and memory reasons on high resolution image. This strategy may give better results for ldm model. + + ## Model Comparison -Diffusion model(ldm) is **MUCH MORE** slower than GANs(lama)(1080x720 image takes 8s on 3090), but it's possible to get better -result, see below example: +| Model | Pron | Corn | +|-------|-----------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------| +| LaMa | - Perform will on high resolution image(~2k)
- Faster than diffusion model | | +| LDM | - It's possible to get better and more detail result, see example below
- The balance of time and quality can be achieved by steps | - Slower than GAN model
- Need more GPU memory
- Not good for high resolution images | | Original Image | LaMa | LDM | | ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- | diff --git a/assets/settings.png b/assets/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed3258304a9bbc3a31d602039ad82ec5e01e0bb GIT binary patch literal 81782 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 BaFhT5 literal 0 HcmV?d00001 From a494e7a7faf3c70e71e83a36b53f2d669f940a23 Mon Sep 17 00:00:00 2001 From: Qing Date: Sun, 12 Jun 2022 22:07:58 +0800 Subject: [PATCH 4/6] update README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c3eb3b5..5762f21 100644 --- a/README.md +++ b/README.md @@ -49,8 +49,8 @@ Select the inpainting model to use, and set the configs corresponding to the mod LaMa model has no configs that can be specified at runtime. LDM model has two configs to control the quality of final result: -1. steps: You can get better result with large steps, but it will be more time-consuming -2. sampler: ddim or [plms](https://arxiv.org/abs/2202.09778). In general plms can get better results with fewer steps +1. Steps: You can get better result with large steps, but it will be more time-consuming +2. Sampler: ddim or [plms](https://arxiv.org/abs/2202.09778). In general plms can get better results with fewer steps ### High Resolution Strategy From 9a9e1fe2b7878945e710623c655f3d9788d09c6f Mon Sep 17 00:00:00 2001 From: Qing Date: Sun, 12 Jun 2022 22:13:33 +0800 Subject: [PATCH 5/6] yarn build --- lama_cleaner/app/build/asset-manifest.json | 8 ++++---- lama_cleaner/app/build/index.html | 2 +- .../{main.d1028b29.chunk.css => main.bdd774f1.chunk.css} | 2 +- lama_cleaner/app/build/static/js/main.2711860b.chunk.js | 1 - lama_cleaner/app/build/static/js/main.9f4ed6dc.chunk.js | 1 + 5 files changed, 7 insertions(+), 7 deletions(-) rename lama_cleaner/app/build/static/css/{main.d1028b29.chunk.css => main.bdd774f1.chunk.css} (85%) delete mode 100644 lama_cleaner/app/build/static/js/main.2711860b.chunk.js create mode 100644 lama_cleaner/app/build/static/js/main.9f4ed6dc.chunk.js diff --git a/lama_cleaner/app/build/asset-manifest.json b/lama_cleaner/app/build/asset-manifest.json index c01cc13..ad15f15 100644 --- a/lama_cleaner/app/build/asset-manifest.json +++ b/lama_cleaner/app/build/asset-manifest.json @@ -1,7 +1,7 @@ { "files": { - "main.css": "/static/css/main.d1028b29.chunk.css", - "main.js": "/static/js/main.2711860b.chunk.js", + "main.css": "/static/css/main.bdd774f1.chunk.css", + "main.js": "/static/js/main.9f4ed6dc.chunk.js", "runtime-main.js": "/static/js/runtime-main.5e86ac81.js", "static/js/2.1b1d3019.chunk.js": "/static/js/2.1b1d3019.chunk.js", "index.html": "/index.html", @@ -11,7 +11,7 @@ "entrypoints": [ "static/js/runtime-main.5e86ac81.js", "static/js/2.1b1d3019.chunk.js", - "static/css/main.d1028b29.chunk.css", - "static/js/main.2711860b.chunk.js" + "static/css/main.bdd774f1.chunk.css", + "static/js/main.9f4ed6dc.chunk.js" ] } \ No newline at end of file diff --git a/lama_cleaner/app/build/index.html b/lama_cleaner/app/build/index.html index 14a8333..1c69c5b 100644 --- a/lama_cleaner/app/build/index.html +++ b/lama_cleaner/app/build/index.html @@ -1 +1 @@ -lama-cleaner - Image inpainting powered by LaMa
\ No newline at end of file +lama-cleaner - Image inpainting powered by LaMa
\ No newline at end of file diff --git a/lama_cleaner/app/build/static/css/main.d1028b29.chunk.css b/lama_cleaner/app/build/static/css/main.bdd774f1.chunk.css similarity index 85% rename from lama_cleaner/app/build/static/css/main.d1028b29.chunk.css rename to lama_cleaner/app/build/static/css/main.bdd774f1.chunk.css index 1d231a0..bbc62d6 100644 --- a/lama_cleaner/app/build/static/css/main.d1028b29.chunk.css +++ b/lama_cleaner/app/build/static/css/main.bdd774f1.chunk.css @@ -1 +1 @@ -@font-face{font-family:"WorkSans";src:url(/static/media/WorkSans-Regular.bb287b89.ttf)}@font-face{font-family:"WorkSans-Semibold";src:url(/static/media/WorkSans-SemiBold.1e98db4e.ttf)}@font-face{font-family:"WorkSans-Bold";src:url(/static/media/WorkSans-Bold.2bea7a7f.ttf)}@font-face{font-family:"WorkSans-Black";src:url(/static/media/WorkSans-Black.67c2c5a1.ttf)}:root{--page-bg:#fff;--page-bg-light:hsla(0,0%,100%,0.5);--page-text-color:#040404;--link-color:#000;--border-color:#646478;--border-color-light:rgba(100,100,120,0.5);--tooltip-bg:#e6e6ea;--tooltip-text-color:#000;--error-color:#ef4444;--success-color:#10b981;--editor-toolkit-bg:hsla(0,0%,100%,0.5);--editor-options-bg:#e6e6ea;--editor-size-border-color:var(--border-color);--editor-toolkit-panel-border:0;--modal-bg:var(--page-bg);--modal-text-color:#000;--modal-hotkey-border-color:#000;--model-mask-bg:rgba(209,213,219,0.4);--text-color:#040404;--text-color-gray:#6b6f76;--btn-primary-bg:#d2d2dc;--btn-text-color:var(--text-color);--btn-text-hover-color:#040404;--btn-border-color:#646478;--btn-primary-hover-bg:var(--yellow-accent);--animation-pulsing-bg:hsla(0,0%,100%,0.5);--switch-root-background-color:#dfe1e4;--switch-thumb-color:var(--page-bg);--switch-thumb-checked-color:var(--page-bg)}:root,[data-theme=dark]{--yellow-accent:#fc0;--options-text-color:var(--page-text-color)}[data-theme=dark]{--page-bg:#040404;--page-bg-light:rgba(4,4,4,0.5333333333333333);--page-text-color:#f9f9f9;--link-color:var(--yellow-accent);--border-color:#646478;--border-color-light:#666;--tooltip-bg:#212121;--tooltip-text-color:#d2d2d2;--editor-toolkit-bg:rgba(0,0,0,0.5);--editor-options-bg:#212121;--editor-size-border-color:var(--yellow-accent);--editor-toolkit-panel-border:1px solid rgba(100,100,120,0.4);--modal-bg:var(--page-bg);--modal-text-color:var(--page-text-color);--modal-hotkey-border-color:var(--page-text-color);--model-mask-bg:rgba(76,76,87,0.4);--text-color:#fff;--text-color-gray:#8a8f98;--btn-primary-bg:#8c8cb4;--btn-text-color:var(--text-color);--btn-text-hover-color:var(--page-bg);--btn-border-color:var(--yellow-accent);--btn-primary-hover-bg:var(--yellow-accent);--animation-pulsing-bg:#f0f0ff;--switch-root-background-color:#3c3f44;--switch-thumb-color:#1f2023;--switch-thumb-checked-color:#fff}@-webkit-keyframes pulsing{0%{opacity:1}50%{opacity:.75;background-color:hsla(0,0%,100%,.5);background-color:var(--animation-pulsing-bg)}to{opacity:1}}@keyframes pulsing{0%{opacity:1}50%{opacity:.75;background-color:hsla(0,0%,100%,.5);background-color:var(--animation-pulsing-bg)}to{opacity:1}}@-webkit-keyframes opacityReveal{0%{opacity:0}to{opacity:1}}@keyframes opacityReveal{0%{opacity:0}to{opacity:1}}@-webkit-keyframes slideDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slideUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slideIn{0%{-webkit-transform:translateX(calc(100% + 25px));transform:translateX(calc(100% + 25px))}to{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideIn{0%{-webkit-transform:translateX(calc(100% + 25px));transform:translateX(calc(100% + 25px))}to{-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.lama-cleaner{display:grid;grid-template-areas:"main-content";width:100vw;height:100vh;background-color:#fff;background-color:var(--page-bg);color:#040404;color:var(--page-text-color);transition-property:background-color,color;transition-duration:.2s;transition-timing-function:repeat(2,ease-out)}.editor-container{display:flex;width:100vw;height:100vh;justify-content:center;align-items:center}.react-transform-wrapper{display:grid!important;width:100%!important;height:100%!important}.editor-canvas-container{display:grid;grid-template-areas:"editor-content";grid-row-gap:1rem;row-gap:1rem}.editor-canvas{grid-area:editor-content;z-index:2}.original-image-container{grid-area:editor-content;pointer-events:none;display:grid;grid-template-areas:"original-image-content"}.original-image-container img{grid-area:original-image-content}.original-image-container .editor-slider{grid-area:original-image-content;height:100%;width:6px;justify-self:end;background-color:#fc0;background-color:var(--yellow-accent);transition:all .3s cubic-bezier(.4,0,.2,1);z-index:2}.editor-canvas-loading{pointer-events:none;-webkit-animation:pulsing .75s infinite;animation:pulsing .75s infinite}.editor-toolkit-panel{position:fixed;bottom:.5rem;border-radius:3rem;padding:1rem 3rem;display:grid;grid-template-areas:"toolkit-size-selector toolkit-brush-slider toolkit-btns";grid-column-gap:2rem;-webkit-column-gap:2rem;column-gap:2rem;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background-color:hsla(0,0%,100%,.5);background-color:var(--page-bg-light);-webkit-animation:slideUp .2s ease-out;animation:slideUp .2s ease-out;border:0;border:var(--editor-toolkit-panel-border);box-shadow:0 0 0 1px rgba(0,0,0,.1019607843),0 3px 16px rgba(0,0,0,.0784313725),0 2px 6px 1px rgba(0,0,0,.0901960784)}@media screen and (max-width:767px){.editor-toolkit-panel{padding:1rem 2rem;grid-template-areas:"toolkit-size-selector toolkit-size-selector" "toolkit-brush-slider toolkit-brush-slider" "toolkit-btns toolkit-btns";grid-row-gap:2rem;row-gap:2rem;justify-items:center}}.editor-toolkit-panel .eyeicon-active{background-color:#fc0;background-color:var(--yellow-accent);color:#040404;color:var(--btn-text-hover-color)}.editor-brush-slider{grid-area:toolkit-brush-slider;-webkit-user-select:none;-ms-user-select:none;user-select:none;display:grid;grid-template-columns:repeat(2,-webkit-max-content);grid-template-columns:repeat(2,max-content);height:-webkit-max-content;height:max-content;grid-column-gap:1rem;-webkit-column-gap:1rem;column-gap:1rem;align-items:center}.editor-brush-slider input[type=range]{-webkit-appearance:none;appearance:none;width:100%;cursor:pointer;background:transparent;border-color:transparent;color:transparent}.editor-brush-slider input[type=range]:focus{outline:none}.editor-brush-slider input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;height:1.2rem;width:1.2rem;border-radius:50%;border:1px solid #000;z-index:2;background:#fc0;background:var(--yellow-accent);margin-top:-.5rem}.editor-brush-slider input[type=range]::-webkit-slider-runnable-track{border-radius:2rem;height:.2rem;background:#d2d2dc;background:var(--btn-primary-bg)}.editor-brush-slider input[type=range]::-moz-range-track{border-radius:2rem;background:#d2d2dc;background:var(--btn-primary-bg)}.editor-brush-slider input[type=range]::-moz-range-progress{background:#fc0;background:var(--yellow-accent)}.editor-toolkit-btns{grid-area:toolkit-btns;display:grid;grid-auto-flow:column;grid-column-gap:1rem;-webkit-column-gap:1rem;column-gap:1rem}.brush-shape{position:absolute;border-radius:50%;background-color:rgba(255,204,0,.7333333333);border:1px solid #fc0;border:1px solid var(--yellow-accent);pointer-events:none}.landing-page{display:grid;place-self:center;justify-items:center;grid-row-gap:2rem;row-gap:2rem;grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}@media screen and (max-width:767px){.landing-page{padding:1rem}}.landing-page h1{text-align:center;font-size:1.4rem}@media screen and (max-width:767px){.landing-page h1{font-size:1.2rem}}.landing-page a{color:#000;color:var(--link-color)}.landing-file-selector{display:grid}header{height:60px;padding:1rem 2rem;position:absolute;top:0;display:flex;justify-content:space-between;align-items:center;width:100%;z-index:20;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid rgba(100,100,120,.2);background-color:hsla(0,0%,100%,.5);background-color:var(--page-bg-light)}.shortcuts{z-index:1}.header-icons-wrapper{grid-gap:12px;gap:12px}.header-icons,.header-icons-wrapper{display:flex;justify-content:center;align-items:center;justify-self:end}.header-icons{grid-gap:6px;gap:6px}.theme-toggle-ui{z-index:10;transition:all .2s ease-in;-webkit-user-select:none;-ms-user-select:none;user-select:none}.theme-toggle-ui .theme-btn{display:flex;justify-content:center;align-items:center;cursor:pointer;outline:none}.theme-toggle-ui .theme-btn svg{width:22px;height:22px}.modal-shortcuts{grid-area:main-content;background-color:#fff;background-color:var(--modal-bg);color:#000;color:var(--modal-text-color);box-shadow:0 0 20px rgba(0,0,40,.2)}@media screen and (max-width:767px){.modal-shortcuts{display:grid;width:100%;height:auto;margin-top:-11rem;-webkit-animation:slideDown .2s ease-out;animation:slideDown .2s ease-out}}.shortcut-options{display:grid;grid-row-gap:1rem;row-gap:1rem}.shortcut-options .shortcut-option{display:grid;grid-template-columns:repeat(2,auto);grid-column-gap:6rem;-webkit-column-gap:6rem;column-gap:6rem;align-items:center}@media screen and (max-width:767px){.shortcut-options .shortcut-option{grid-template-columns:auto;grid-column-gap:0;-webkit-column-gap:0;column-gap:0;grid-row-gap:.6rem;row-gap:.6rem}}.shortcut-options .shortcut-key{justify-self:end;border:1px solid #000;border:1px solid var(--modal-hotkey-border-color);padding:.4rem;width:-webkit-max-content;width:max-content;border-radius:.2rem}@media screen and (max-width:767px){.shortcut-options .shortcut-key{padding:.2rem .4rem}}.shortcut-options .shortcut-description{justify-self:start;text-align:left}@media screen and (max-width:767px){.shortcut-options .shortcut-description{text-align:left;width:auto;justify-self:start}}.setting-block{display:flex;flex-direction:column}.setting-block .option-desc{color:#6b6f76;color:var(--text-color-gray);margin-top:12px;border:1px solid #646478;border:1px solid var(--border-color);border-radius:.3rem;padding:1rem}.setting-block .option-desc .sub-setting-block{margin-top:8px;color:#040404;color:var(--text-color)}.setting-block-content{display:flex;justify-content:space-between;align-items:center;grid-gap:12rem;gap:12rem}.setting-block-content-title{display:flex;flex-direction:column;justify-content:space-between}.setting-block-desc{font-size:1rem;margin-top:8px;color:#6b6f76;color:var(--text-color-gray)}.hd-setting-block .inline-tip{display:inline;cursor:pointer;color:#040404;color:var(--text-color)}.model-desc-link{color:#6b6f76;color:var(--text-color-gray);text-decoration:none}.modal-setting{grid-area:main-content;background-color:#fff;background-color:var(--modal-bg);color:#000;color:var(--modal-text-color);box-shadow:0 0 20px rgba(0,0,40,.2);width:700px}@media screen and (max-width:767px){.modal-setting{display:grid;width:100%;height:auto;margin-top:-11rem;-webkit-animation:slideDown .2s ease-out;animation:slideDown .2s ease-out}}.file-select-label{display:grid;cursor:pointer;border:2px dashed #646478;border:2px dashed var(--border-color);border-radius:.5rem;min-width:600px}@media screen and (max-width:767px){.file-select-label{min-width:300px}}.file-select-label .file-select-label-hover,.file-select-label:hover{color:#000;background-color:#fc0;background-color:var(--yellow-accent)}.file-select-container{display:grid;padding:4rem;width:100%;height:100%}.file-select-container input{display:none}.file-select-message{font-family:"WorkSans";text-align:center}.btn-primary{display:grid;grid-auto-flow:column;grid-column-gap:1rem;-webkit-column-gap:1rem;column-gap:1rem;color:#040404;color:var(--btn-text-color);font-family:"WorkSans",sans-serif;width:-webkit-max-content;width:max-content;padding:.5rem;place-items:center;border-radius:.5rem;z-index:1;cursor:pointer}.btn-primary:hover{background-color:#fc0;background-color:var(--btn-primary-hover-bg);color:#040404;color:var(--btn-text-hover-color)}.btn-primary svg{width:20px;height:auto}.btn-primary-disabled{pointer-events:none;opacity:.5}.modal-mask{position:fixed;z-index:9998;inset:0;background-color:rgba(209,213,219,.4);background-color:var(--model-mask-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}@media(prefers-reduced-motion:no-preference){.modal-mask{-webkit-animation:opacityReveal .15s cubic-bezier(.16,1,.3,1) forwards;animation:opacityReveal .15s cubic-bezier(.16,1,.3,1) forwards}}@-webkit-keyframes contentShow{0%{opacity:0;-webkit-transform:translate(-50%,-48%) scale(.96);transform:translate(-50%,-48%) scale(.96)}to{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}@keyframes contentShow{0%{opacity:0;-webkit-transform:translate(-50%,-48%) scale(.96);transform:translate(-50%,-48%) scale(.96)}to{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}.modal{background-color:#fff;background-color:var(--page-bg);z-index:9999;position:fixed;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:grid;grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content;grid-row-gap:2rem;row-gap:2rem;place-self:center;padding:2rem;border-radius:.95rem}.modal:focus{outline:none}.modal .modal-header{display:grid;grid-template-columns:repeat(2,auto);align-items:center}.modal .modal-header .btn-primary{justify-self:end}@media(prefers-reduced-motion:no-preference){.modal{-webkit-animation:contentShow .15s cubic-bezier(.16,1,.3,1) forwards;animation:contentShow .15s cubic-bezier(.16,1,.3,1) forwards}}.select-trigger{all:unset;display:inline-flex;align-items:center;justify-content:space-between;border-radius:.5rem;height:38px;grid-gap:8px;gap:8px;padding:0 .8rem;border:1px solid #646478;border:1px solid var(--border-color);background-color:#fff;background-color:var(--page-bg);color:#040404;color:var(--options-text-color)}.select-trigger svg{width:1rem;height:1rem;margin-top:.25rem}.select-trigger:hover{border-color:#fc0;border-color:var(--yellow-accent)}.select-content{overflow:hidden;background-color:#fff;background-color:var(--page-bg);border-radius:.5rem}.select-viewport{border:1px solid #646478;border:1px solid var(--border-color);border-radius:.5rem;padding:5px}.select-item{all:unset;background-color:#fff;background-color:var(--page-bg);color:#040404;color:var(--options-text-color);display:flex;align-items:center;border-radius:.5rem;padding:6px 6px 6px 25px;position:relative;-webkit-user-select:none;-ms-user-select:none;user-select:none}.select-item:focus{color:#040404;color:var(--btn-text-hover-color);background-color:#fc0;background-color:var(--yellow-accent)}.select-item-indicator{position:absolute;left:0;width:25px;padding-right:4px;display:inline-flex;align-items:center;justify-content:center}.switch-root{all:"unset";width:42px;height:25px;background-color:#dfe1e4;background-color:var(--switch-root-background-color);border-radius:9999px;border:none;position:relative;transition:background-color .1s;-webkit-tap-highlight-color:rgba(0,0,0,0)}.switch-root:focus-visible{outline:none}.switch-root[data-state=checked]{background-color:#fc0;background-color:var(--yellow-accent)}.switch-thumb{display:block;width:17px;height:17px;background-color:#fff;background-color:var(--switch-thumb-color);border-radius:9999px;transition:-webkit-transform .1s;transition:transform .1s;transition:transform .1s,-webkit-transform .1s;-webkit-transform:translateX(4px);transform:translateX(4px);will-change:transform}.switch-thumb[data-state=checked]{-webkit-transform:translateX(21px);transform:translateX(21px);background-color:#fff;background-color:var(--switch-thumb-checked-color);outline:1px solid rgba(100,100,120,.5)}.number-input{all:unset;flex:1 0 auto;border-radius:.5rem;padding:.4rem .8rem;outline:1px solid #646478;outline:1px solid var(--border-color)}.number-input:focus-visible{outline:1px solid #fc0;outline:1px solid var(--yellow-accent)}.toast-viewpoint{position:fixed;top:48px;right:0;display:flex;flex-direction:row;padding:25px;grid-gap:10px;gap:10px;max-width:100vw;margin:0;z-index:999999}.toast-viewpoint:focus-visible{outline:none}.toast-root{border:1px solid rgba(100,100,120,.5);border:1px solid var(--border-color-light);background-color:#fff;background-color:var(--page-bg);border-radius:.6rem;padding:15px;display:flex;align-items:center;grid-gap:12px;gap:12px}.toast-root[data-state=open]{-webkit-animation:slideIn .15s cubic-bezier(.16,1,.3,1);animation:slideIn .15s cubic-bezier(.16,1,.3,1)}.toast-root[data-state=close]{-webkit-animation:opacityReveal .1s ease-in forwards;animation:opacityReveal .1s ease-in forwards}.toast-root[data-state=cancel]{-webkit-transform:translateX(0);transform:translateX(0);-webkit-animation:transform .1s ease-out;animation:transform .1s ease-out}.toast-root.error{border:1px solid #ef4444;border:1px solid var(--error-color)}.toast-root.success{border:1px solid #10b981;border:1px solid var(--success-color)}.error-icon{height:24px;width:24px;color:#ef4444;color:var(--error-color)}.success-icon{height:24px;width:24px;color:#10b981;color:var(--success-color)}.loading-icon{-webkit-animation-name:spin;animation-name:spin;-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-transform-origin:center center;transform-origin:center center;-webkit-animation-timing-function:linear;animation-timing-function:linear}.loading-icon,.toast-desc,.toast-icon{display:flex;align-items:center}.toast-desc{margin:0;color:#040404;color:var(--text-color);min-width:240px}.info-tooltip:hover:before{content:attr(data-tooltip);position:absolute;background-color:#e6e6ea;background-color:var(--tooltip-bg);color:#000;color:var(--tooltip-text-color);padding:.5rem;border-radius:.3rem;z-index:2;opacity:0;-webkit-animation-name:opacityReveal;animation-name:opacityReveal;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}.info-tooltip-top:hover:before{-webkit-transform:translateY(-100%);transform:translateY(-100%);margin-bottom:1.5rem}.info-tooltip-bottom:hover:before{-webkit-transform:translateY(100%);transform:translateY(100%);margin-top:1.5rem}*,:after,:before{box-sizing:border-box;margin:0;padding:0}body,html{font-family:"WorkSans",sans-serif} \ No newline at end of file +@font-face{font-family:"WorkSans";src:url(/static/media/WorkSans-Regular.bb287b89.ttf)}@font-face{font-family:"WorkSans-Semibold";src:url(/static/media/WorkSans-SemiBold.1e98db4e.ttf)}@font-face{font-family:"WorkSans-Bold";src:url(/static/media/WorkSans-Bold.2bea7a7f.ttf)}@font-face{font-family:"WorkSans-Black";src:url(/static/media/WorkSans-Black.67c2c5a1.ttf)}:root{--page-bg:#fff;--page-bg-light:hsla(0,0%,100%,0.5);--page-text-color:#040404;--link-color:#000;--border-color:#646478;--border-color-light:rgba(100,100,120,0.5);--tooltip-bg:#e6e6ea;--tooltip-text-color:#000;--error-color:#ef4444;--success-color:#10b981;--editor-toolkit-bg:hsla(0,0%,100%,0.5);--editor-options-bg:#e6e6ea;--editor-size-border-color:var(--border-color);--editor-toolkit-panel-border:0;--modal-bg:var(--page-bg);--modal-text-color:#000;--modal-hotkey-border-color:#000;--model-mask-bg:rgba(209,213,219,0.4);--text-color:#040404;--text-color-gray:#6b6f76;--btn-primary-bg:#d2d2dc;--btn-text-color:var(--text-color);--btn-text-hover-color:#040404;--btn-border-color:#646478;--btn-primary-hover-bg:var(--yellow-accent);--animation-pulsing-bg:hsla(0,0%,100%,0.5);--switch-root-background-color:#dfe1e4;--switch-thumb-color:var(--page-bg);--switch-thumb-checked-color:var(--page-bg)}:root,[data-theme=dark]{--yellow-accent:#fc0;--options-text-color:var(--page-text-color)}[data-theme=dark]{--page-bg:#040404;--page-bg-light:rgba(4,4,4,0.5333333333333333);--page-text-color:#f9f9f9;--link-color:var(--yellow-accent);--border-color:#646478;--border-color-light:#666;--tooltip-bg:#212121;--tooltip-text-color:#d2d2d2;--editor-toolkit-bg:rgba(0,0,0,0.5);--editor-options-bg:#212121;--editor-size-border-color:var(--yellow-accent);--editor-toolkit-panel-border:1px solid rgba(100,100,120,0.4);--modal-bg:var(--page-bg);--modal-text-color:var(--page-text-color);--modal-hotkey-border-color:var(--page-text-color);--model-mask-bg:rgba(76,76,87,0.4);--text-color:#fff;--text-color-gray:#8a8f98;--btn-primary-bg:#8c8cb4;--btn-text-color:var(--text-color);--btn-text-hover-color:var(--page-bg);--btn-border-color:var(--yellow-accent);--btn-primary-hover-bg:var(--yellow-accent);--animation-pulsing-bg:#f0f0ff;--switch-root-background-color:#3c3f44;--switch-thumb-color:#1f2023;--switch-thumb-checked-color:#fff}@-webkit-keyframes pulsing{0%{opacity:1}50%{opacity:.75;background-color:hsla(0,0%,100%,.5);background-color:var(--animation-pulsing-bg)}to{opacity:1}}@keyframes pulsing{0%{opacity:1}50%{opacity:.75;background-color:hsla(0,0%,100%,.5);background-color:var(--animation-pulsing-bg)}to{opacity:1}}@-webkit-keyframes opacityReveal{0%{opacity:0}to{opacity:1}}@keyframes opacityReveal{0%{opacity:0}to{opacity:1}}@-webkit-keyframes slideDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slideUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slideIn{0%{-webkit-transform:translateX(calc(100% + 25px));transform:translateX(calc(100% + 25px))}to{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideIn{0%{-webkit-transform:translateX(calc(100% + 25px));transform:translateX(calc(100% + 25px))}to{-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.lama-cleaner{display:grid;grid-template-areas:"main-content";width:100vw;height:100vh;background-color:#fff;background-color:var(--page-bg);color:#040404;color:var(--page-text-color);transition-property:background-color,color;transition-duration:.2s;transition-timing-function:repeat(2,ease-out)}.editor-container{display:flex;width:100vw;height:100vh;justify-content:center;align-items:center}.react-transform-wrapper{display:grid!important;width:100%!important;height:100%!important}.editor-canvas-container{display:grid;grid-template-areas:"editor-content";grid-row-gap:1rem;row-gap:1rem}.editor-canvas{grid-area:editor-content;z-index:2}.original-image-container{grid-area:editor-content;pointer-events:none;display:grid;grid-template-areas:"original-image-content"}.original-image-container img{grid-area:original-image-content}.original-image-container .editor-slider{grid-area:original-image-content;height:100%;width:6px;justify-self:end;background-color:#fc0;background-color:var(--yellow-accent);transition:all .3s cubic-bezier(.4,0,.2,1);z-index:2}.editor-canvas-loading{pointer-events:none;-webkit-animation:pulsing .75s infinite;animation:pulsing .75s infinite}.editor-toolkit-panel{position:fixed;bottom:.5rem;border-radius:3rem;padding:1rem 3rem;display:grid;grid-template-areas:"toolkit-size-selector toolkit-brush-slider toolkit-btns";grid-column-gap:2rem;-webkit-column-gap:2rem;column-gap:2rem;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background-color:hsla(0,0%,100%,.5);background-color:var(--page-bg-light);-webkit-animation:slideUp .2s ease-out;animation:slideUp .2s ease-out;border:0;border:var(--editor-toolkit-panel-border);box-shadow:0 0 0 1px rgba(0,0,0,.1019607843),0 3px 16px rgba(0,0,0,.0784313725),0 2px 6px 1px rgba(0,0,0,.0901960784)}@media screen and (max-width:767px){.editor-toolkit-panel{padding:1rem 2rem;grid-template-areas:"toolkit-size-selector toolkit-size-selector" "toolkit-brush-slider toolkit-brush-slider" "toolkit-btns toolkit-btns";grid-row-gap:2rem;row-gap:2rem;justify-items:center}}.editor-toolkit-panel .eyeicon-active{background-color:#fc0;background-color:var(--yellow-accent);color:#040404;color:var(--btn-text-hover-color)}.editor-brush-slider{grid-area:toolkit-brush-slider;-webkit-user-select:none;-ms-user-select:none;user-select:none;display:grid;grid-template-columns:repeat(2,-webkit-max-content);grid-template-columns:repeat(2,max-content);height:-webkit-max-content;height:max-content;grid-column-gap:1rem;-webkit-column-gap:1rem;column-gap:1rem;align-items:center}.editor-brush-slider input[type=range]{-webkit-appearance:none;appearance:none;width:100%;cursor:pointer;background:transparent;border-color:transparent;color:transparent}.editor-brush-slider input[type=range]:focus{outline:none}.editor-brush-slider input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;height:1.2rem;width:1.2rem;border-radius:50%;border:1px solid #000;z-index:2;background:#fc0;background:var(--yellow-accent);margin-top:-.5rem}.editor-brush-slider input[type=range]::-webkit-slider-runnable-track{border-radius:2rem;height:.2rem;background:#d2d2dc;background:var(--btn-primary-bg)}.editor-brush-slider input[type=range]::-moz-range-track{border-radius:2rem;background:#d2d2dc;background:var(--btn-primary-bg)}.editor-brush-slider input[type=range]::-moz-range-progress{background:#fc0;background:var(--yellow-accent)}.editor-toolkit-btns{grid-area:toolkit-btns;display:grid;grid-auto-flow:column;grid-column-gap:1rem;-webkit-column-gap:1rem;column-gap:1rem}.brush-shape{position:absolute;border-radius:50%;background-color:rgba(255,204,0,.7333333333);border:1px solid #fc0;border:1px solid var(--yellow-accent);pointer-events:none}.landing-page{display:grid;place-self:center;justify-items:center;grid-row-gap:2rem;row-gap:2rem;grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}@media screen and (max-width:767px){.landing-page{padding:1rem}}.landing-page h1{text-align:center;font-size:1.4rem}@media screen and (max-width:767px){.landing-page h1{font-size:1.2rem}}.landing-page a{color:#000;color:var(--link-color)}.landing-file-selector{display:grid}header{height:60px;padding:1rem 2rem;position:absolute;top:0;display:flex;justify-content:space-between;align-items:center;width:100%;z-index:20;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid rgba(100,100,120,.2);background-color:hsla(0,0%,100%,.5);background-color:var(--page-bg-light)}.shortcuts{z-index:1}.header-icons-wrapper{grid-gap:12px;gap:12px}.header-icons,.header-icons-wrapper{display:flex;justify-content:center;align-items:center;justify-self:end}.header-icons{grid-gap:6px;gap:6px}.theme-toggle-ui{z-index:10;transition:all .2s ease-in;-webkit-user-select:none;-ms-user-select:none;user-select:none}.theme-toggle-ui .theme-btn{display:flex;justify-content:center;align-items:center;cursor:pointer;outline:none}.theme-toggle-ui .theme-btn svg{width:22px;height:22px}.modal-shortcuts{grid-area:main-content;background-color:#fff;background-color:var(--modal-bg);color:#000;color:var(--modal-text-color);box-shadow:0 0 20px rgba(0,0,40,.2)}@media screen and (max-width:767px){.modal-shortcuts{display:grid;width:100%;height:auto;margin-top:-11rem;-webkit-animation:slideDown .2s ease-out;animation:slideDown .2s ease-out}}.shortcut-options{display:grid;grid-row-gap:1rem;row-gap:1rem}.shortcut-options .shortcut-option{display:grid;grid-template-columns:repeat(2,auto);grid-column-gap:6rem;-webkit-column-gap:6rem;column-gap:6rem;align-items:center}@media screen and (max-width:767px){.shortcut-options .shortcut-option{grid-template-columns:auto;grid-column-gap:0;-webkit-column-gap:0;column-gap:0;grid-row-gap:.6rem;row-gap:.6rem}}.shortcut-options .shortcut-key{justify-self:end;border:1px solid #000;border:1px solid var(--modal-hotkey-border-color);padding:.4rem;width:-webkit-max-content;width:max-content;border-radius:.2rem}@media screen and (max-width:767px){.shortcut-options .shortcut-key{padding:.2rem .4rem}}.shortcut-options .shortcut-description{justify-self:start;text-align:left}@media screen and (max-width:767px){.shortcut-options .shortcut-description{text-align:left;width:auto;justify-self:start}}.setting-block{display:flex;flex-direction:column}.setting-block .option-desc{color:#6b6f76;color:var(--text-color-gray);margin-top:12px;border:1px solid #646478;border:1px solid var(--border-color);border-radius:.3rem;padding:1rem}.setting-block .option-desc .sub-setting-block{margin-top:8px;color:#040404;color:var(--text-color)}.setting-block-content{display:flex;justify-content:space-between;align-items:center;grid-gap:12rem;gap:12rem}.setting-block-content-title{display:flex;flex-direction:column;justify-content:space-between}.setting-block-desc{font-size:1rem;margin-top:8px;color:#6b6f76;color:var(--text-color-gray)}.hd-setting-block .inline-tip{display:inline;cursor:pointer;color:#040404;color:var(--text-color)}.model-desc-link{color:#6b6f76;color:var(--text-color-gray);text-decoration:none}.modal-setting{grid-area:main-content;background-color:#fff;background-color:var(--modal-bg);color:#000;color:var(--modal-text-color);box-shadow:0 0 20px rgba(0,0,40,.2);width:700px}@media screen and (max-width:767px){.modal-setting{display:grid;width:100%;height:auto;margin-top:-11rem;-webkit-animation:slideDown .2s ease-out;animation:slideDown .2s ease-out}}.file-select-label{display:grid;cursor:pointer;border:2px dashed #646478;border:2px dashed var(--border-color);border-radius:.5rem;min-width:600px}@media screen and (max-width:767px){.file-select-label{min-width:300px}}.file-select-label .file-select-label-hover,.file-select-label:hover{color:#000;background-color:#fc0;background-color:var(--yellow-accent)}.file-select-container{display:grid;padding:4rem;width:100%;height:100%}.file-select-container input{display:none}.file-select-message{font-family:"WorkSans";text-align:center}.btn-primary{display:grid;grid-auto-flow:column;grid-column-gap:1rem;-webkit-column-gap:1rem;column-gap:1rem;color:#040404;color:var(--btn-text-color);font-family:"WorkSans",sans-serif;width:-webkit-max-content;width:max-content;padding:.5rem;place-items:center;border-radius:.5rem;z-index:1;cursor:pointer}.btn-primary:hover{background-color:#fc0;background-color:var(--btn-primary-hover-bg);color:#040404;color:var(--btn-text-hover-color)}.btn-primary svg{width:20px;height:auto}.btn-primary-disabled{pointer-events:none;opacity:.5}.modal-mask{position:fixed;z-index:9998;inset:0;background-color:rgba(209,213,219,.4);background-color:var(--model-mask-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}@media(prefers-reduced-motion:no-preference){.modal-mask{-webkit-animation:opacityReveal .15s cubic-bezier(.16,1,.3,1) forwards;animation:opacityReveal .15s cubic-bezier(.16,1,.3,1) forwards}}@-webkit-keyframes contentShow{0%{opacity:0;-webkit-transform:translate(-50%,-48%) scale(.96);transform:translate(-50%,-48%) scale(.96)}to{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}@keyframes contentShow{0%{opacity:0;-webkit-transform:translate(-50%,-48%) scale(.96);transform:translate(-50%,-48%) scale(.96)}to{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}.modal{background-color:#fff;background-color:var(--page-bg);z-index:9999;position:fixed;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:grid;grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content;grid-row-gap:2rem;row-gap:2rem;place-self:center;padding:2rem;border-radius:.95rem}.modal:focus{outline:none}.modal .modal-header{display:grid;grid-template-columns:repeat(2,auto);align-items:center}.modal .modal-header .btn-primary{justify-self:end}@media(prefers-reduced-motion:no-preference){.modal{-webkit-animation:contentShow .15s cubic-bezier(.16,1,.3,1) forwards;animation:contentShow .15s cubic-bezier(.16,1,.3,1) forwards}}.select-trigger{all:unset;display:inline-flex;align-items:center;justify-content:space-between;border-radius:.5rem;height:38px;grid-gap:8px;gap:8px;padding:0 .8rem;border:1px solid #646478;border:1px solid var(--border-color);background-color:#fff;background-color:var(--page-bg);color:#040404;color:var(--options-text-color)}.select-trigger svg{width:1rem;height:1rem;margin-top:.25rem}.select-trigger:hover{border-color:#fc0;border-color:var(--yellow-accent)}.select-content{overflow:hidden;background-color:#fff;background-color:var(--page-bg);border-radius:.5rem}.select-viewport{border:1px solid #646478;border:1px solid var(--border-color);border-radius:.5rem;padding:5px}.select-item{all:unset;background-color:#fff;background-color:var(--page-bg);color:#040404;color:var(--options-text-color);display:flex;align-items:center;border-radius:.5rem;padding:6px 6px 6px 25px;position:relative;-webkit-user-select:none;-ms-user-select:none;user-select:none}.select-item:focus{color:#040404;color:var(--btn-text-hover-color);background-color:#fc0;background-color:var(--yellow-accent)}.select-item-indicator{position:absolute;left:0;width:25px;padding-right:4px;display:inline-flex;align-items:center;justify-content:center}.switch-root{all:"unset";width:42px;height:25px;background-color:#dfe1e4;background-color:var(--switch-root-background-color);border-radius:9999px;border:none;position:relative;transition:background-color .1s;-webkit-tap-highlight-color:rgba(0,0,0,0)}.switch-root:focus-visible{outline:none}.switch-root[data-state=checked]{background-color:#fc0;background-color:var(--yellow-accent)}.switch-thumb{display:block;width:17px;height:17px;background-color:#fff;background-color:var(--switch-thumb-color);border-radius:9999px;transition:-webkit-transform .1s;transition:transform .1s;transition:transform .1s,-webkit-transform .1s;-webkit-transform:translateX(4px);transform:translateX(4px);will-change:transform}.switch-thumb[data-state=checked]{-webkit-transform:translateX(21px);transform:translateX(21px);background-color:#fff;background-color:var(--switch-thumb-checked-color);outline:1px solid rgba(100,100,120,.5)}.number-input{all:unset;flex:1 0 auto;border-radius:.5rem;padding:0 .8rem;outline:1px solid #646478;outline:1px solid var(--border-color);height:36px}.number-input:focus-visible{outline:1px solid #fc0;outline:1px solid var(--yellow-accent)}.toast-viewpoint{position:fixed;top:48px;right:0;display:flex;flex-direction:row;padding:25px;grid-gap:10px;gap:10px;max-width:100vw;margin:0;z-index:999999}.toast-viewpoint:focus-visible{outline:none}.toast-root{border:1px solid rgba(100,100,120,.5);border:1px solid var(--border-color-light);background-color:#fff;background-color:var(--page-bg);border-radius:.6rem;padding:15px;display:flex;align-items:center;grid-gap:12px;gap:12px}.toast-root[data-state=open]{-webkit-animation:slideIn .15s cubic-bezier(.16,1,.3,1);animation:slideIn .15s cubic-bezier(.16,1,.3,1)}.toast-root[data-state=close]{-webkit-animation:opacityReveal .1s ease-in forwards;animation:opacityReveal .1s ease-in forwards}.toast-root[data-state=cancel]{-webkit-transform:translateX(0);transform:translateX(0);-webkit-animation:transform .1s ease-out;animation:transform .1s ease-out}.toast-root.error{border:1px solid #ef4444;border:1px solid var(--error-color)}.toast-root.success{border:1px solid #10b981;border:1px solid var(--success-color)}.error-icon{height:24px;width:24px;color:#ef4444;color:var(--error-color)}.success-icon{height:24px;width:24px;color:#10b981;color:var(--success-color)}.loading-icon{-webkit-animation-name:spin;animation-name:spin;-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-transform-origin:center center;transform-origin:center center;-webkit-animation-timing-function:linear;animation-timing-function:linear}.loading-icon,.toast-desc,.toast-icon{display:flex;align-items:center}.toast-desc{margin:0;color:#040404;color:var(--text-color);min-width:240px}.info-tooltip:hover:before{content:attr(data-tooltip);position:absolute;background-color:#e6e6ea;background-color:var(--tooltip-bg);color:#000;color:var(--tooltip-text-color);padding:.5rem;border-radius:.3rem;z-index:2;opacity:0;-webkit-animation-name:opacityReveal;animation-name:opacityReveal;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}.info-tooltip-top:hover:before{-webkit-transform:translateY(-100%);transform:translateY(-100%);margin-bottom:1.5rem}.info-tooltip-bottom:hover:before{-webkit-transform:translateY(100%);transform:translateY(100%);margin-top:1.5rem}*,:after,:before{box-sizing:border-box;margin:0;padding:0}body,html{font-family:"WorkSans",sans-serif} \ No newline at end of file diff --git a/lama_cleaner/app/build/static/js/main.2711860b.chunk.js b/lama_cleaner/app/build/static/js/main.2711860b.chunk.js deleted file mode 100644 index a92fb81..0000000 --- a/lama_cleaner/app/build/static/js/main.2711860b.chunk.js +++ /dev/null @@ -1 +0,0 @@ -(this["webpackJsonplama-cleaner"]=this["webpackJsonplama-cleaner"]||[]).push([[0],{48:function(e,t,n){},51:function(e,t,n){"use strict";n.r(t);var a=n(0),c=n.n(a),i=n(15),r=n.n(i),o=(n(48),n(10)),s=n(2),l=n(55),u=n(8),j=n.n(u),d=n(14);var b=n(3),h=n(16),f=n(21),p=n(1),v=function(e){var t=e.width,n=e.value,c=e.chevronDirection,i=e.options,r=e.autoFocusAfterClose,o=e.onChange,s=Object(a.useRef)(null);return Object(p.jsxs)(f.f,{value:n,onValueChange:o,onOpenChange:function(e){e||r||window.setTimeout((function(){var e;null===s||void 0===s||null===(e=s.current)||void 0===e||e.blur()}),100)},children:[Object(p.jsxs)(f.g,{className:"select-trigger",style:{width:t},ref:s,children:[Object(p.jsx)(f.h,{}),Object(p.jsx)(f.b,{children:"up"===c?Object(p.jsx)(h.e,{}):Object(p.jsx)(h.d,{})})]}),Object(p.jsx)(f.a,{className:"select-content",children:Object(p.jsx)(f.i,{className:"select-viewport",children:i.map((function(e){return Object(p.jsxs)(f.c,{value:e,className:"select-item",children:[Object(p.jsx)(f.e,{children:e}),Object(p.jsx)(f.d,{className:"select-item-indicator",children:Object(p.jsx)(h.c,{})})]},e)}))})})]})};v.defaultProps={chevronDirection:"down",autoFocusAfterClose:!0};var O=v,g=n(4),x=["value","onValue"],m=c.a.forwardRef((function(e,t){var n=e.value,a=e.onValue,c=Object(g.a)(e,x);return Object(p.jsx)("input",Object(b.a)(Object(b.a)({value:n,onInput:function(e){var t=e.target.value.replace(/\D/g,"");null===a||void 0===a||a(t)},className:"number-input"},c),{},{ref:t,type:"text"}))}));var w=function(e){var t=e.title,n=e.desc,a=e.input,c=e.optionDesc,i=e.className;return Object(p.jsxs)("div",{className:"setting-block ".concat(i),children:[Object(p.jsxs)("div",{className:"setting-block-content",children:[Object(p.jsxs)("div",{className:"setting-block-content-title",children:[Object(p.jsx)("span",{children:t}),n&&Object(p.jsx)("span",{className:"setting-block-desc",children:n})]}),a]}),c&&Object(p.jsx)("div",{className:"option-desc",children:c})]})};var y,k=function(e){var t=e.title,n=e.value,a=e.suffix,c=e.onValue;return Object(p.jsx)(w,{className:"sub-setting-block",title:t,input:Object(p.jsxs)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",gap:"8px"},children:[Object(p.jsx)(m,{style:{width:"80px"},value:"".concat(n),onValue:c}),a&&Object(p.jsx)("span",{children:a})]})})};!function(e){e.ORIGINAL="Original",e.RESIZE="Resize",e.CROP="Crop"}(y||(y={}));var S,C=function(){var e=Object(o.c)(D),t=Object(s.a)(e,2),n=t[0],a=t[1],c=function(e){a((function(t){return Object(b.a)(Object(b.a)({},t),{},{hdStrategy:e})}))},i=function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{hdStrategyResizeLimit:t})}))},r=function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{hdStrategyCropTrigerSize:t})}))},l=function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{hdStrategyCropMargin:t})}))},u=function(){return Object(p.jsxs)("div",{children:["Use the original resolution of the picture, suitable for picture size below 2K. Try"," ",Object(p.jsx)("div",{tabIndex:0,role:"button",className:"inline-tip",onClick:function(){return c(y.RESIZE)},children:"Resize Strategy"})," ","if you do not get good results on high resolution images."]})};return Object(p.jsx)(w,{className:"hd-setting-block",title:"High Resolution Strategy",input:Object(p.jsx)(O,{width:80,value:n.hdStrategy,options:Object.values(y),onChange:function(e){return c(e)}}),optionDesc:function(){switch(n.hdStrategy){case y.ORIGINAL:return u();case y.CROP:return Object(p.jsxs)("div",{children:[Object(p.jsx)("div",{children:"Crop masking area from the original image to do inpainting, and paste the result back. Mainly for performance and memory reasons on high resolution image."}),Object(p.jsx)(k,{title:"Trigger size",value:"".concat(n.hdStrategyCropTrigerSize),suffix:"pixel",onValue:r}),Object(p.jsx)(k,{title:"Crop margin",value:"".concat(n.hdStrategyCropMargin),suffix:"pixel",onValue:l})]});case y.RESIZE:return Object(p.jsxs)("div",{children:[Object(p.jsx)("div",{children:"Resize the longer side of the image to a specific size(keep ratio), then do inpainting on the resized image."}),Object(p.jsx)(k,{title:"Size limit",value:"".concat(n.hdStrategyResizeLimit),suffix:"pixel",onValue:i})]});default:return u()}}()})};!function(e){e.LAMA="lama",e.LDM="ldm"}(S||(S={}));var M,L=function(){var e=Object(o.c)(D),t=Object(s.a)(e,2),n=t[0],a=t[1],c=function(e,t,n){return Object(p.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"4px"},children:[Object(p.jsx)("a",{className:"model-desc-link",href:t,target:"_blank",rel:"noreferrer noopener",children:e}),Object(p.jsx)("a",{className:"model-desc-link",href:n,target:"_blank",rel:"noreferrer noopener",children:n})]})};return Object(p.jsx)(w,{className:"model-setting-block",title:"Inpainting Model",input:Object(p.jsx)(O,{width:80,value:n.model,options:Object.values(S),onChange:function(e){return t=e,void a((function(e){return Object(b.a)(Object(b.a)({},e),{},{model:t})}));var t}}),optionDesc:function(){switch(n.model){case S.LAMA:return c("Resolution-robust Large Mask Inpainting with Fourier Convolutions","https://arxiv.org/abs/2109.07161","https://github.com/saic-mdal/lama");case S.LDM:return Object(p.jsxs)("div",{children:[c("High-Resolution Image Synthesis with Latent Diffusion Models","https://arxiv.org/abs/2112.10752","https://github.com/CompVis/latent-diffusion"),Object(p.jsx)(k,{title:"Steps",value:"".concat(n.ldmSteps),onValue:function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{ldmSteps:t})}))}})]});default:return Object(p.jsx)(p.Fragment,{})}}()})},N=Object(o.b)({key:"fileState",default:void 0}),z=Object(o.b)({key:"toastState",default:{open:!1,desc:"",state:"default",duration:3e3}}),I=Object(o.b)({key:"shortcutsState",default:!1}),E={show:!1,runInpaintingManually:!1,model:S.LAMA,ldmSteps:50,hdStrategy:y.RESIZE,hdStrategyResizeLimit:2048,hdStrategyCropTrigerSize:2048,hdStrategyCropMargin:128},D=Object(o.b)({key:"settingsState",default:E,effects:[(M="settingsState",function(e){var t=e.setSelf,n=e.onSet,a=localStorage.getItem(M);if(null!=a){var c=JSON.parse(a);c.show=!1,t(c)}n((function(e,t,n){return n?localStorage.removeItem(M):localStorage.setItem(M,JSON.stringify(e))}))})]}),R=n(9),T=function(){var e=Object(a.useState)(window.innerWidth),t=Object(s.a)(e,2),n=t[0],c=t[1],i=Object(a.useCallback)((function(){c(window.innerWidth)}),[]);return Object(a.useEffect)((function(){return window.addEventListener("resize",i),function(){window.removeEventListener("resize",i)}})),n<768?"mobile":n>=768&&n<1224?"tablet":n>=1224?"desktop":void 0};function A(e){var t=e.onSelection,n=Object(a.useState)(!1),c=Object(s.a)(n,2),i=c[0],r=c[1],o=Object(a.useState)("file-upload-".concat(Math.random().toString())),l=Object(s.a)(o,1)[0],u=T();function b(e){if(e&&e.type.match("image.*"))try{if(e.size>20971520)throw new Error("file too large");t(e)}catch(n){alert("error: ".concat(n.message))}}function h(e){return f.apply(this,arguments)}function f(){return(f=Object(d.a)(j.a.mark((function e(t){return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e){t.file((function(t){return e(t)}))})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function v(e){return O.apply(this,arguments)}function O(){return(O=Object(d.a)(j.a.mark((function e(t){var n,a,c,i,r;return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(n=[],a=[],c=0;c0)){e.next=23;break}if(!(null===(i=a.shift())||void 0===i?void 0:i.isFile)){e.next=12;break}return e.next=8,h(i);case 8:r=e.sent,n.push(r),e.next=21;break;case 12:if(!(null===i||void 0===i?void 0:i.isDirectory)){e.next=21;break}return e.t0=a.push,e.t1=a,e.t2=R.a,e.next=18,g(i.createReader());case 18:e.t3=e.sent,e.t4=(0,e.t2)(e.t3),e.t0.apply.call(e.t0,e.t1,e.t4);case 21:e.next=3;break;case 23:return e.abrupt("return",n);case 24:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function g(e){return x.apply(this,arguments)}function x(){return(x=Object(d.a)(j.a.mark((function e(t){var n,a;return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=[],e.next=3,m(t);case 3:a=e.sent;case 4:if(!(a.length>0)){e.next=11;break}return n.push.apply(n,Object(R.a)(a)),e.next=8,m(t);case 8:a=e.sent,e.next=4;break;case 11:return e.abrupt("return",n);case 12:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function m(e){return w.apply(this,arguments)}function w(){return(w=Object(d.a)(j.a.mark((function e(t){return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e,n){t.readEntries(e,n)})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function y(){return(y=Object(d.a)(j.a.mark((function e(t){var n;return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.preventDefault(),e.next=3,v(t.dataTransfer.items);case 3:n=e.sent,r(!1),b(n[0]);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(p.jsx)("label",{htmlFor:l,className:"file-select-label",children:Object(p.jsxs)("div",{className:["file-select-container",i?"file-select-label-hover":""].join(" "),onDrop:function(e){return y.apply(this,arguments)},onDragOver:function(e){e.stopPropagation(),e.preventDefault(),r(!0)},onDragLeave:function(){return r(!1)},children:[Object(p.jsx)("input",{id:l,name:l,type:"file",onChange:function(e){var t,n=null===(t=e.currentTarget.files)||void 0===t?void 0:t[0];n&&b(n)},accept:"image/png, image/jpeg"}),Object(p.jsx)("p",{className:"file-select-message",children:"desktop"===u?"Click here or drag an image file":"Tap here to load your picture"})]})})}var Z=function(){var e=Object(o.e)(N);return Object(p.jsxs)("div",{className:"landing-page",children:[Object(p.jsxs)("h1",{children:["Image inpainting powered by \ud83e\udd99",Object(p.jsx)("a",{href:"https://github.com/saic-mdal/lama",children:"LaMa"})]}),Object(p.jsx)("div",{className:"landing-file-selector",children:Object(p.jsx)(A,{onSelection:function(){var t=Object(d.a)(j.a.mark((function t(n){return j.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e(n);case 1:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}()})})]})},P=Object(o.b)({key:"themeState",default:"light"}),H=function(){var e=Object(o.c)(P),t=Object(s.a)(e,2),n=t[0],c=t[1];Object(a.useEffect)((function(){window.matchMedia("(prefers-color-scheme: dark)").matches?c("dark"):c("light")}),[c]);return Object(p.jsx)("div",{className:"theme-toggle-ui",children:Object(p.jsx)("div",{className:"theme-btn",onClick:function(){c("light"===n?"dark":"light")},role:"button",tabIndex:0,"aria-hidden":"true",children:"light"===n?Object(p.jsx)(h.i,{}):Object(p.jsx)(h.j,{style:{color:"#ffcc00"}})})})},V=n(38),F=n(54),W=n(40);function U(e){for(var t=e.split(",")[0].split(":")[1].split(";")[0],n=atob(e.split(",")[1]),a=[],c=0;ct){var c=Math.ceil(t*a);return"".concat(e,"x").concat(c)}var i=Math.ceil(n*a);return"".concat(i,"x").concat(e)}),[n,t,u]),d=Object(a.useCallback)((function(){for(var e=[],t=0;tt?(l(a[0]),c(parseInt(a[0],10))):(l(a[1]),c(parseInt(a[1],10)))},chevronDirection:"up"})}var ne="#ffcc00bb";function ae(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:ne;e.strokeStyle=n,e.lineCap="round",e.lineJoin="round",t.forEach((function(t){(null===t||void 0===t?void 0:t.pts.length)&&t.size&&(e.lineWidth=t.size,e.beginPath(),e.moveTo(t.pts[0].x,t.pts[0].y),t.pts.forEach((function(t){return e.lineTo(t.x,t.y)})),e.stroke())}))}function ce(e){var t=e.nativeEvent;return{x:t.offsetX,y:t.offsetY}}function ie(e){var t=e.file,n=Object(o.d)(D),c=Object(a.useState)(40),i=Object(s.a)(c,2),r=i[0],u=i[1],b=function(e){var t=Object(a.useState)(new Image),n=Object(s.a)(t,1)[0],c=Object(a.useState)(!1),i=Object(s.a)(c,2),r=i[0],o=i[1];return Object(a.useEffect)((function(){return n.onload=function(){o(!0)},o(!1),n.src=URL.createObjectURL(e),function(){n.onload=null}}),[e,n]),[n,r]}(t),f=Object(s.a)(b,2),v=f[0],O=f[1],g=Object(a.useState)([]),x=Object(s.a)(g,2),m=x[0],w=x[1],y=Object(a.useState)(),k=Object(s.a)(y,2),S=k[0],C=k[1],M=Object(a.useState)((function(){return document.createElement("canvas")})),L=Object(s.a)(M,1)[0],N=Object(a.useState)([]),z=Object(s.a)(N,2),I=z[0],E=z[1],T=Object(a.useState)([]),A=Object(s.a)(T,2),Z=A[0],P=A[1],H=Object(a.useState)({x:-1,y:-1}),U=Object(s.a)(H,2),J=U[0],_=J.x,Y=J.y,X=U[1],$=Object(a.useState)(!1),ee=Object(s.a)($,2),ne=ee[0],ie=ee[1],re=Object(a.useState)(!1),oe=Object(s.a)(re,2),se=oe[0],le=oe[1],ue=Object(a.useState)(!1),je=Object(s.a)(ue,2),de=je[0],be=je[1],he=Object(a.useState)(!1),fe=Object(s.a)(he,2),pe=fe[0],ve=fe[1],Oe=Object(a.useState)(!1),ge=Object(s.a)(Oe,2),xe=ge[0],me=ge[1],we=Object(a.useState)(1),ye=Object(s.a)(we,2),ke=ye[0],Se=ye[1],Ce=Object(a.useState)(!1),Me=Object(s.a)(Ce,2),Le=Me[0],Ne=Me[1],ze=Object(a.useState)(1),Ie=Object(s.a)(ze,2),Ee=Ie[0],De=Ie[1],Re=Object(a.useState)(1080),Te=Object(s.a)(Re,2),Ae=Te[0],Ze=Te[1],Pe=Object(F.a)(),He=Pe.width/2,Ve=Pe.height/2,Fe=Object(a.useRef)(),We=Object(a.useState)(!1),Ue=Object(s.a)(We,2),Be=Ue[0],Ge=Ue[1],Je=Object(a.useState)(!1),Ke=Object(s.a)(Je,2),_e=Ke[0],Ye=Ke[1],Xe=Object(a.useState)(!1),$e=Object(s.a)(Xe,2),Qe=$e[0],qe=$e[1],et=Object(a.useState)(0),tt=Object(s.a)(et,2),nt=tt[0],at=tt[1],ct=Object(a.useCallback)((function(e,t){S&&(S.clearRect(0,0,S.canvas.width,S.canvas.height),S.drawImage(e,0,0,v.naturalWidth,v.naturalHeight),ae(S,t))}),[S,v]),it=function(e){if(!(null===S||void 0===S?void 0:S.canvas.width)||!(null===S||void 0===S?void 0:S.canvas.height))throw new Error("canvas has invalid size");L.width=null===S||void 0===S?void 0:S.canvas.width,L.height=null===S||void 0===S?void 0:S.canvas.height;var t=L.getContext("2d");if(!t)throw new Error("could not retrieve mask canvas");e.forEach((function(e){ae(t,e,"white")}))},rt=function(){var e=Object(d.a)(j.a.mark((function e(){var a,c,i,r;return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(ot()){e.next=2;break}return e.abrupt("return");case 2:return a=[].concat(Object(R.a)(I),[Z]),E(a),P([]),Ye(!1),me(!0),it(a),e.prev=8,e.next=11,K(t,L.toDataURL(),n,Ae.toString());case 11:if(c=e.sent){e.next=14;break}throw new Error("empty response");case 14:return i=new Image,e.next=17,B(i,c);case 17:r=[].concat(Object(R.a)(m),[i]),w(r),ct(i,[]),e.next=25;break;case 22:e.prev=22,e.t0=e.catch(8),alert(e.t0.message?e.t0.message:e.t0.toString());case 25:me(!1);case 26:case"end":return e.stop()}}),e,null,[[8,22]])})));return function(){return e.apply(this,arguments)}}(),ot=function(){return 0!==Z.length},st=function(){return 0!==m.length},lt=Object(a.useCallback)((function(e){0===m.length?ct(v,e):ct(m[m.length-1],e)}),[v,m,ct]),ut=function(e){return"Control"===e.key||"Meta"===e.key};Object(W.a)(ut,(function(){Qe&&(xe||(qe(!1),n.runInpaintingManually||rt()))}),{event:"keyup"},[xe,Qe,ot]),Object(W.a)(ut,(function(){xe||qe(!0)}),{event:"keydown"},[xe]),Object(a.useEffect)((function(){if(O){var e=Pe.width/v.naturalWidth,t=(Pe.height-200)/v.naturalHeight,n=1;if((e<1||t<1)&&(n=Math.min(e,t)),De(n),Se(n),(null===S||void 0===S?void 0:S.canvas)&&(S.canvas.width=v.naturalWidth,S.canvas.height=v.naturalHeight,lt([])),!Be){var a;null===(a=Fe.current)||void 0===a||a.centerView(n,1),Ge(!0);var c=Math.max(v.width,v.height);Ze(c)}}}),[null===S||void 0===S?void 0:S.canvas,Fe,v,O,Pe,Be,lt]);var jt=Object(a.useCallback)((function(){if(Ee&&v&&Pe){var e=Fe.current;if(!e)throw new Error("no viewport");var t=(Pe.width-v.width*Ee)/2,n=(Pe.height-v.height*Ee)/2;e.setTransform(t,n,Ee,200,"easeOutQuad"),e.state.scale=Ee,Se(Ee),Ne(!1)}}),[Fe,Ee,v,Pe]);Object(a.useEffect)((function(){return window.addEventListener("resize",(function(){jt()})),function(){window.removeEventListener("resize",(function(){jt()}))}}),[Pe,jt]);Object(W.a)("Escape",(function(){xe||(_e||Qe?(Ye(!1),P([]),lt([])):jt())}),{event:"keydown"},[_e,xe,Qe,jt,lt]);var dt=Object(a.useCallback)((function(){if(0!==Z.length){var e=Z.slice(0,Z.length-1);P(e),lt(e)}}),[Z,lt]),bt=Object(a.useCallback)((function(){if(m.length){var e=I.slice(0,I.length-1);E(e),P([]),Ye(!1);var t=m.slice(0,m.length-1);w(t),0===t.length?ct(v,[]):ct(t[t.length-1],[])}}),[ct,m,I,v]),ht=function(){n.runInpaintingManually&&0!==Z.length?dt():bt()};Object(W.a)((function(e){var t=(e.metaKey||e.ctrlKey)&&"z"===e.key;return"Tab"===e.key&&e.preventDefault(),!!t&&(e.preventDefault(),!0)}),ht,void 0,[dt,bt]);Object(l.a)("Tab",(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),st()&&ve((function(){return window.setTimeout((function(){at(100)}),10),!0}))}),(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),st()&&(at(0),window.setTimeout((function(){ve(!1)}),350))}));var ft=function(e){e===ne||de||ie(e)},pt=Object(a.useCallback)((function(){return de?"grab":ne?"none":void 0}),[ne,de]);Object(l.a)("[",(function(){u((function(e){return e>10?e-10:e<=10&&e>0?e-5:e}))})),Object(l.a)("]",(function(){u((function(e){return e+10}))})),Object(l.a)("R",(function(){n.runInpaintingManually&&ot()&&rt()})),Object(l.a)(" ",(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),ie(!1),be(!0)}),(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),ie(!0),be(!1)}));var vt=function(e,t){var n=function(){var e,t,n=Ee;return void 0!==(null===(e=Fe.current)||void 0===e?void 0:e.state.scale)&&(n=null===(t=Fe.current)||void 0===t?void 0:t.state.scale),n}();return{width:"".concat(r*n,"px"),height:"".concat(r*n,"px"),left:"".concat(e,"px"),top:"".concat(t,"px"),transform:"translate(-50%, -50%)"}};return Object(p.jsxs)("div",{className:"editor-container","aria-hidden":"true",onMouseMove:function(e){var t=e.nativeEvent;X({x:t.pageX,y:t.pageY})},onMouseUp:function(e){(G(e)&&be(!1),de)||v.src&&(null===S||void 0===S?void 0:S.canvas)&&(xe||_e&&(Qe||n.runInpaintingManually?Ye(!1):rt()))},children:[Object(p.jsx)(V.b,{ref:function(e){e&&(Fe.current=e)},panning:{disabled:!de,velocityDisabled:!0},wheel:{step:.05},centerZoomedOut:!0,alignmentAnimation:{disabled:!0},limitToBounds:!1,doubleClick:{disabled:!0},initialScale:Ee,minScale:Ee,onPanning:function(e){Le||Ne(!0)},onZoom:function(e){Se(e.state.scale)},children:Object(p.jsx)(V.a,{contentClass:xe?"editor-canvas-loading":"",contentStyle:{visibility:Be?"visible":"hidden"},children:Object(p.jsxs)("div",{className:"editor-canvas-container",children:[Object(p.jsx)("canvas",{className:"editor-canvas",style:{cursor:pt(),clipPath:"inset(0 ".concat(nt,"% 0 0)"),transition:"clip-path 350ms ease-in-out"},onContextMenu:function(e){e.preventDefault()},onMouseOver:function(){ft(!0),le(!1)},onFocus:function(){return ft(!0)},onMouseLeave:function(){return ft(!1)},onMouseDown:function(e){if(!de&&(v.src&&(null===S||void 0===S?void 0:S.canvas)&&!xe&&!function(e){return 2===e.nativeEvent.button}(e)))if(G(e))be(!0);else{Ye(!0);var t=[];(Qe||n.runInpaintingManually)&&(t=Object(R.a)(Z)),t.push({size:r,pts:[ce(e)]}),P(t),lt(t)}},onMouseMove:function(e){if(!de&&_e&&0!==Z.length){var t=Object(R.a)(Z);t[t.length-1].pts.push(ce(e)),P(t),lt(t)}},ref:function(e){if(e&&!S){var t=e.getContext("2d");t&&C(t)}}}),Object(p.jsxs)("div",{className:"original-image-container",style:{width:"".concat(v.naturalWidth,"px"),height:"".concat(v.naturalHeight,"px")},children:[pe&&Object(p.jsx)("div",{className:"editor-slider",style:{marginRight:"".concat(nt,"%")}}),Object(p.jsx)("img",{className:"original-image",src:v.src,alt:"original",style:{width:"".concat(v.naturalWidth,"px"),height:"".concat(v.naturalHeight,"px")}})]})]})})}),ne&&!xe&&!de&&Object(p.jsx)("div",{className:"brush-shape",style:vt(_,Y)}),se&&Object(p.jsx)("div",{className:"brush-shape",style:vt(He,Ve)}),Object(p.jsxs)("div",{className:"editor-toolkit-panel",children:[Object(p.jsx)(te,{onChange:function(e){Ze(e)},originalWidth:v.naturalWidth,originalHeight:v.naturalHeight}),Object(p.jsx)(q,{label:"Brush",min:10,max:150,value:r,onChange:function(e){u(e),se||(le(!0),window.setTimeout((function(){le(!1)}),1e4))},onClick:function(){return le(!1)}}),Object(p.jsxs)("div",{className:"editor-toolkit-btns",children:[Object(p.jsx)(Q,{toolTip:"Reset Zoom & Pan",tooltipPosition:"top",icon:Object(p.jsx)(h.b,{}),disabled:ke===Ee&&!1===Le,onClick:jt}),Object(p.jsx)(Q,{toolTip:"Undo",tooltipPosition:"top",icon:Object(p.jsx)("svg",{width:"19",height:"9",viewBox:"0 0 19 9",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:Object(p.jsx)("path",{d:"M2 1C2 0.447715 1.55228 0 1 0C0.447715 0 0 0.447715 0 1H2ZM1 8H0V9H1V8ZM8 9C8.55228 9 9 8.55229 9 8C9 7.44771 8.55228 7 8 7V9ZM16.5963 7.42809C16.8327 7.92721 17.429 8.14016 17.9281 7.90374C18.4272 7.66731 18.6402 7.07103 18.4037 6.57191L16.5963 7.42809ZM16.9468 5.83205L17.8505 5.40396L16.9468 5.83205ZM0 1V8H2V1H0ZM1 9H8V7H1V9ZM1.66896 8.74329L6.66896 4.24329L5.33104 2.75671L0.331035 7.25671L1.66896 8.74329ZM16.043 6.26014L16.5963 7.42809L18.4037 6.57191L17.8505 5.40396L16.043 6.26014ZM6.65079 4.25926C9.67554 1.66661 14.3376 2.65979 16.043 6.26014L17.8505 5.40396C15.5805 0.61182 9.37523 -0.710131 5.34921 2.74074L6.65079 4.25926Z",fill:"currentColor"})}),onClick:ht,disabled:function(){if(m.length>0)return!1;if(n.runInpaintingManually){if(0===Z.length)return!0}else if(0===m.length)return!0;return!1}()}),Object(p.jsx)(Q,{toolTip:"Show Original",tooltipPosition:"top",icon:Object(p.jsx)(h.h,{}),className:pe?"eyeicon-active":"",onDown:function(e){e.preventDefault(),ve((function(){return window.setTimeout((function(){at(100)}),10),!0}))},onUp:function(){at(0),window.setTimeout((function(){ve(!1)}),350)},disabled:0===m.length}),Object(p.jsx)(Q,{toolTip:"Save Image",tooltipPosition:"top",icon:Object(p.jsx)(h.f,{}),disabled:!m.length,onClick:function(){var e=t.name.replace(/(\.[\w\d_-]+)$/i,"_cleanup$1");!function(e,t){var n=document.createElement("a");n.href=e,n.download=t,n.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window})),setTimeout((function(){n.remove()}),100)}(m[m.length-1].currentSrc,e)}}),n.runInpaintingManually&&Object(p.jsx)(Q,{toolTip:"Run Inpainting",tooltipPosition:"top",icon:Object(p.jsx)("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:Object(p.jsx)("path",{d:"M2 13L1.34921 12.2407C1.16773 12.3963 1.04797 12.6117 1.01163 12.8479L2 13ZM22.5 4L23.49 4.14142C23.5309 3.85444 23.4454 3.5638 23.2555 3.3448C23.0655 3.1258 22.7899 3 22.5 3V4ZM12.5 4V3C12.2613 3 12.0305 3.08539 11.8492 3.24074L12.5 4ZM1 19.5L0.0116283 19.3479C-0.0327373 19.6363 0.051055 19.9297 0.241035 20.1511C0.431014 20.3726 0.708231 20.5 1 20.5V19.5ZM11.5 19.5V20.5C11.7373 20.5 11.9668 20.4156 12.1476 20.2619L11.5 19.5ZM21.5 11L22.1476 11.7619C22.3337 11.6038 22.4554 11.3831 22.49 11.1414L21.5 11ZM2 14H12.5V12H2V14ZM13.169 13.7433L23.169 4.74329L21.831 3.25671L11.831 12.2567L13.169 13.7433ZM22.5 3H12.5V5H22.5V3ZM11.8492 3.24074L1.34921 12.2407L2.65079 13.7593L13.1508 4.75926L11.8492 3.24074ZM1.01163 12.8479L0.0116283 19.3479L1.98837 19.6521L2.98837 13.1521L1.01163 12.8479ZM1 20.5H11.5V18.5H1V20.5ZM12.4884 19.6521L13.4884 13.1521L11.5116 12.8479L10.5116 19.3479L12.4884 19.6521ZM21.51 3.85858L20.51 10.8586L22.49 11.1414L23.49 4.14142L21.51 3.85858ZM20.8524 10.2381L10.8524 18.7381L12.1476 20.2619L22.1476 11.7619L20.8524 10.2381Z",fill:"currentColor"})}),disabled:!ot()||xe,onClick:function(){!xe&&ot()&&rt()}})]})]})]})}var re=n(25),oe=c.a.forwardRef((function(e,t){var n=e.show,a=e.children,c=e.onClose,i=e.className,r=e.title;return Object(p.jsx)(re.d,{open:n,onOpenChange:function(e){e||null===c||void 0===c||c()},children:Object(p.jsxs)(re.c,{children:[Object(p.jsx)(re.b,{className:"modal-mask"}),Object(p.jsxs)(re.a,{ref:t,className:"modal ".concat(i),children:[Object(p.jsxs)("div",{className:"modal-header",children:[Object(p.jsx)(re.e,{children:r}),Object(p.jsx)(Q,{icon:Object(p.jsx)(h.k,{}),onClick:c})]}),a]})]})})}));function se(e){var t=e.content,n=e.keys;return Object(p.jsxs)("div",{className:"shortcut-option",children:[Object(p.jsx)("div",{className:"shortcut-description",children:t}),Object(p.jsx)("div",{style:{display:"flex",justifySelf:"end",gap:"8px"},children:n.map((function(e,t){return Object(p.jsx)("div",{className:"shortcut-key",children:e},e)}))})]})}var le=/macintosh|mac os x/i.test(navigator.userAgent),ue=(/windows|win32/i.test(navigator.userAgent),le?"Cmd":"Ctrl");function je(){var e=Object(o.c)(I),t=Object(s.a)(e,2),n=t[0],a=t[1];return Object(p.jsx)(oe,{onClose:function(){a(!1)},title:"Hotkeys",className:"modal-shortcuts",show:n,children:Object(p.jsxs)("div",{className:"shortcut-options",children:[Object(p.jsx)(se,{content:"Enable Multi-Stroke Mask Drawing",keys:["Hold ".concat(ue)]}),Object(p.jsx)(se,{content:"Undo Inpainting",keys:[ue,"Z"]}),Object(p.jsx)(se,{content:"Pan",keys:["Space & Drag"]}),Object(p.jsx)(se,{content:"View Original Image",keys:["Hold Tag"]}),Object(p.jsx)(se,{content:"Reset Zoom/Pan",keys:["Esc"]}),Object(p.jsx)(se,{content:"Cancel Mask Drawing",keys:["Esc"]}),Object(p.jsx)(se,{content:"Run Inpainting Manually",keys:["Shift","R"]}),Object(p.jsx)(se,{content:"Decrease Brush Size",keys:["["]}),Object(p.jsx)(se,{content:"Increase Brush Size",keys:["]"]}),Object(p.jsx)(se,{content:"Toggle Dark Mode",keys:["Shift","D"]}),Object(p.jsx)(se,{content:"Toggle Hotkeys Panel",keys:["H"]})]})})}var de=n(39),be=["className"],he=["className"],fe=c.a.forwardRef((function(e,t){var n=e.className,a=Object(g.a)(e,be);return Object(p.jsx)(de.a,Object(b.a)(Object(b.a)({},a),{},{ref:t,className:"switch-root ".concat(n)}))})),pe=c.a.forwardRef((function(e,t){var n=e.className,a=Object(g.a)(e,he);return Object(p.jsx)(de.b,Object(b.a)(Object(b.a)({},a),{},{ref:t,className:"switch-thumb ".concat(n)}))})),ve=function(){var e=Object(o.c)(D),t=Object(s.a)(e,2),n=t[0],a=t[1];return Object(p.jsx)(w,{title:"Manual Inpainting Mode",input:Object(p.jsx)(fe,{checked:n.runInpaintingManually,onCheckedChange:function(e){a((function(t){return Object(b.a)(Object(b.a)({},t),{},{runInpaintingManually:e})}))},children:Object(p.jsx)(pe,{})})})};function Oe(e){var t=e.onClose,n=Object(o.c)(D),a=Object(s.a)(n,2),c=a[0],i=a[1];return Object(p.jsxs)(oe,{onClose:function(){i((function(e){return Object(b.a)(Object(b.a)({},e),{},{show:!1})})),t()},title:"Settings",className:"modal-setting",show:c.show,children:[Object(p.jsx)(ve,{}),Object(p.jsx)(L,{}),Object(p.jsx)(C,{})]})}var ge=n(28),xe=["state","desc"],me=function(){return Object(p.jsx)("span",{className:"loading-icon",children:Object(p.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[Object(p.jsx)("line",{x1:"12",y1:"2",x2:"12",y2:"6"}),Object(p.jsx)("line",{x1:"12",y1:"18",x2:"12",y2:"22"}),Object(p.jsx)("line",{x1:"4.93",y1:"4.93",x2:"7.76",y2:"7.76"}),Object(p.jsx)("line",{x1:"16.24",y1:"16.24",x2:"19.07",y2:"19.07"}),Object(p.jsx)("line",{x1:"2",y1:"12",x2:"6",y2:"12"}),Object(p.jsx)("line",{x1:"18",y1:"12",x2:"22",y2:"12"}),Object(p.jsx)("line",{x1:"4.93",y1:"19.07",x2:"7.76",y2:"16.24"}),Object(p.jsx)("line",{x1:"16.24",y1:"7.76",x2:"19.07",y2:"4.93"})]})})},we=a.forwardRef((function(e,t){var n=e.state,a=e.desc,c=Object(g.a)(e,xe);return Object(p.jsxs)(ge.b,{children:[Object(p.jsxs)(ge.c,Object(b.a)(Object(b.a)({},c),{},{ref:t,className:"toast-root ".concat(n),children:[Object(p.jsx)("div",{className:"toast-icon",children:function(){switch(n){case"error":return Object(p.jsx)(h.g,{className:"error-icon"});case"success":return Object(p.jsx)(h.c,{className:"success-icon"});case"loading":return Object(p.jsx)(me,{});default:return Object(p.jsx)(p.Fragment,{})}}()}),Object(p.jsx)(ge.a,{className:"toast-desc",children:a})]})),Object(p.jsx)(ge.d,{className:"toast-viewpoint"})]})}));we.defaultProps={desc:"",state:"loading"};var ye=we,ke=function(e){var t=e.file,n=Object(o.c)(D),c=Object(s.a)(n,2),i=c[0],r=c[1],l=Object(o.c)(z),u=Object(s.a)(l,2),h=u[0],f=u[1],v=function(){var e=Object(d.a)(j.a.mark((function e(){var t,n,a,c,o;return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,X().then((function(e){return e.text()}));case 2:if((t=e.sent)!==i.model){e.next=5;break}return e.abrupt("return");case 5:return e.next=7,(s=i.model,fetch("".concat(J,"/model_downloaded/").concat(s),{method:"GET"})).then((function(e){return e.text()}));case 7:n=e.sent,a=i.model,c="Switching to ".concat(a," model"),o=3e3,"False"===n&&(c="Downloading ".concat(a," model, this may take a while"),o=9999999999),f({open:!0,desc:c,state:"loading",duration:o}),Y(a).then((function(e){if(!e.ok)throw new Error("Server error");f({open:!0,desc:"Switch to ".concat(a," model success"),state:"success",duration:3e3})})).catch((function(){f({open:!0,desc:"Switch to ".concat(a," model failed"),state:"error",duration:3e3}),r((function(e){return Object(b.a)(Object(b.a)({},e),{},{model:t})}))}));case 14:case"end":return e.stop()}var s}),e)})));return function(){return e.apply(this,arguments)}}();return Object(a.useEffect)((function(){X().then((function(e){return e.text()})).then((function(e){r((function(t){return Object(b.a)(Object(b.a)({},t),{},{model:e})}))}))}),[r]),Object(p.jsxs)(p.Fragment,{children:[Object(p.jsx)(ie,{file:t}),Object(p.jsx)(Oe,{onClose:v}),Object(p.jsx)(je,{}),Object(p.jsx)(ye,Object(b.a)(Object(b.a)({},h),{},{onOpenChange:function(e){f((function(t){return Object(b.a)(Object(b.a)({},t),{},{open:e})}))}}))]})},Se=function(){var e=Object(o.c)(I),t=Object(s.a)(e,2),n=t[0],a=t[1],c=function(){a((function(e){return!e}))};return Object(l.a)("h",(function(e){null===e||void 0===e||e.preventDefault(),c()})),Object(p.jsx)("div",{className:"shortcuts",children:Object(p.jsx)(Q,{onClick:c,toolTip:"Hotkeys",tooltipPosition:"bottom",disabled:n,style:{border:0},icon:Object(p.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",width:"28",height:"28",preserveAspectRatio:"xMidYMid meet",viewBox:"0 0 16 16",children:[Object(p.jsx)("rect",{x:"0",y:"0",width:"16",height:"16",fill:"none",stroke:"none"}),Object(p.jsxs)("g",{fill:"currentColor",children:[Object(p.jsx)("path",{d:"M14 5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h12zM2 4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H2z"}),Object(p.jsx)("path",{d:"M13 10.25a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm0-2a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-5 0A.25.25 0 0 1 8.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 8 8.75v-.5zm2 0a.25.25 0 0 1 .25-.25h1.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-1.5a.25.25 0 0 1-.25-.25v-.5zm1 2a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-5-2A.25.25 0 0 1 6.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 6 8.75v-.5zm-2 0A.25.25 0 0 1 4.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 4 8.75v-.5zm-2 0A.25.25 0 0 1 2.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 2 8.75v-.5zm11-2a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-2 0a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-2 0A.25.25 0 0 1 9.25 6h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 9 6.75v-.5zm-2 0A.25.25 0 0 1 7.25 6h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 7 6.75v-.5zm-2 0A.25.25 0 0 1 5.25 6h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 5 6.75v-.5zm-3 0A.25.25 0 0 1 2.25 6h1.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-1.5A.25.25 0 0 1 2 6.75v-.5zm0 4a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm2 0a.25.25 0 0 1 .25-.25h5.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-5.5a.25.25 0 0 1-.25-.25v-.5z"})]})]})})})},Ce=function(){var e=Object(o.c)(D),t=Object(s.a)(e,2),n=t[0],a=t[1];return Object(p.jsx)("div",{children:Object(p.jsx)(Q,{onClick:function(){a(Object(b.a)(Object(b.a)({},n),{},{show:!n.show}))},toolTip:"Settings",tooltipPosition:"bottom",style:{border:0},icon:Object(p.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",role:"img",width:"28",height:"28",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"2",children:[Object(p.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"}),Object(p.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})]})})})},Me=function(){var e=Object(o.c)(N),t=Object(s.a)(e,2),n=t[0],a=t[1],c=T();return Object(p.jsxs)("header",{children:[Object(p.jsx)("div",{style:{visibility:n?"visible":"hidden"},children:Object(p.jsx)(Q,{icon:Object(p.jsx)(h.a,{}),onClick:function(){a(void 0)},style:{border:0},children:"desktop"===c?"Start New":void 0})}),Object(p.jsxs)("div",{className:"header-icons-wrapper",children:[Object(p.jsx)(H,{}),n&&Object(p.jsxs)("div",{className:"header-icons",children:[Object(p.jsx)(Se,{}),Object(p.jsx)(Ce,{})]})]})]})};!function(){function e(){return e=Object(d.a)(j.a.mark((function e(){var t,n,a=arguments;return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=a.length>0&&void 0!==a[0]?a[0]:"",e.next=3,fetch(t,{method:"GET",cache:"no-cache"});case 3:return n=e.sent,e.abrupt("return",n.json());case 5:case"end":return e.stop()}}),e)}))),e.apply(this,arguments)}var t=function(){(function(){return e.apply(this,arguments)})(document.location+"/flaskwebgui-keep-server-alive").then((function(e){return e}))};document.addEventListener("DOMContentLoaded",(function(){t(),setInterval(t,3e3)}))}();var Le=function(){var e=Object(o.c)(N),t=Object(s.a)(e,2),n=t[0],c=t[1],i=Object(o.c)(P),r=Object(s.a)(i,2),u=r[0],b=r[1],h=function(){var e=Object(a.useState)(),t=Object(s.a)(e,2),n=t[0],c=t[1],i=Object(a.useCallback)((function(){var e=new Headers;e.append("pragma","no-cache"),e.append("cache-control","no-cache"),fetch("/inputimage",{headers:e}).then(function(){var e=Object(d.a)(j.a.mark((function e(t){var n,a,i,r;return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=null===(n=t.headers.get("content-disposition"))||void 0===n?void 0:n.split("filename=")[1].split(";")[0],e.next=3,t.blob();case 3:(i=e.sent)&&i.type.startsWith("image")&&(r=new File([i],void 0!==a?a:"inputImage"),c(r));case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())}),[c]);return Object(a.useEffect)((function(){i()}),[i]),n}();return Object(a.useEffect)((function(){c(h)}),[h,c]),Object(l.a)("D",(function(e){null===e||void 0===e||e.preventDefault(),b("light"===u?"dark":"light")})),Object(a.useEffect)((function(){document.body.setAttribute("data-theme",u)}),[u]),Object(p.jsxs)("div",{className:"lama-cleaner",children:[Object(p.jsx)(Me,{}),n?Object(p.jsx)(ke,{file:n}):Object(p.jsx)(Z,{})]})};r.a.render(Object(p.jsx)(c.a.StrictMode,{children:Object(p.jsx)(o.a,{children:Object(p.jsx)(Le,{})})}),document.getElementById("root"))}},[[51,1,2]]]); \ No newline at end of file diff --git a/lama_cleaner/app/build/static/js/main.9f4ed6dc.chunk.js b/lama_cleaner/app/build/static/js/main.9f4ed6dc.chunk.js new file mode 100644 index 0000000..7863418 --- /dev/null +++ b/lama_cleaner/app/build/static/js/main.9f4ed6dc.chunk.js @@ -0,0 +1 @@ +(this["webpackJsonplama-cleaner"]=this["webpackJsonplama-cleaner"]||[]).push([[0],{48:function(e,t,n){},51:function(e,t,n){"use strict";n.r(t);var a=n(0),c=n.n(a),i=n(15),r=n.n(i),o=(n(48),n(10)),s=n(2),l=n(55),u=n(8),d=n.n(u),j=n(14);var b=n(3),h=n(16),f=n(21),p=n(1),v=function(e){var t=e.width,n=e.value,c=e.chevronDirection,i=e.options,r=e.autoFocusAfterClose,o=e.onChange,s=Object(a.useRef)(null);return Object(p.jsxs)(f.f,{value:n,onValueChange:o,onOpenChange:function(e){e||r||window.setTimeout((function(){var e;null===s||void 0===s||null===(e=s.current)||void 0===e||e.blur()}),100)},children:[Object(p.jsxs)(f.g,{className:"select-trigger",style:{width:t},ref:s,children:[Object(p.jsx)(f.h,{}),Object(p.jsx)(f.b,{children:"up"===c?Object(p.jsx)(h.e,{}):Object(p.jsx)(h.d,{})})]}),Object(p.jsx)(f.a,{className:"select-content",children:Object(p.jsx)(f.i,{className:"select-viewport",children:i.map((function(e){return Object(p.jsxs)(f.c,{value:e,className:"select-item",children:[Object(p.jsx)(f.e,{children:e}),Object(p.jsx)(f.d,{className:"select-item-indicator",children:Object(p.jsx)(h.c,{})})]},e)}))})})]})};v.defaultProps={chevronDirection:"down",autoFocusAfterClose:!0};var O=v,g=n(4),m=["value","onValue"],x=c.a.forwardRef((function(e,t){var n=e.value,a=e.onValue,c=Object(g.a)(e,m);return Object(p.jsx)("input",Object(b.a)(Object(b.a)({value:n,onInput:function(e){var t=e.target.value.replace(/\D/g,"");null===a||void 0===a||a(t)},className:"number-input"},c),{},{ref:t,type:"text"}))}));var w=function(e){var t=e.title,n=e.desc,a=e.input,c=e.optionDesc,i=e.className;return Object(p.jsxs)("div",{className:"setting-block ".concat(i),children:[Object(p.jsxs)("div",{className:"setting-block-content",children:[Object(p.jsxs)("div",{className:"setting-block-content-title",children:[Object(p.jsx)("span",{children:t}),n&&Object(p.jsx)("span",{className:"setting-block-desc",children:n})]}),a]}),c&&Object(p.jsx)("div",{className:"option-desc",children:c})]})};var y,k,S=function(e){var t=e.title,n=e.value,a=e.suffix,c=e.onValue;return Object(p.jsx)(w,{className:"sub-setting-block",title:t,input:Object(p.jsxs)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",gap:"8px"},children:[Object(p.jsx)(x,{style:{width:"80px"},value:"".concat(n),onValue:c}),a&&Object(p.jsx)("span",{children:a})]})})};!function(e){e.ORIGINAL="Original",e.RESIZE="Resize",e.CROP="Crop"}(y||(y={})),function(e){e.ddim="ddim",e.plms="plms"}(k||(k={}));var C,M=function(){var e=Object(o.c)(R),t=Object(s.a)(e,2),n=t[0],a=t[1],c=function(e){a((function(t){return Object(b.a)(Object(b.a)({},t),{},{hdStrategy:e})}))},i=function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{hdStrategyResizeLimit:t})}))},r=function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{hdStrategyCropTrigerSize:t})}))},l=function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{hdStrategyCropMargin:t})}))},u=function(){return Object(p.jsxs)("div",{children:["Use the original resolution of the picture, suitable for picture size below 2K. Try"," ",Object(p.jsx)("div",{tabIndex:0,role:"button",className:"inline-tip",onClick:function(){return c(y.RESIZE)},children:"Resize Strategy"})," ","if you do not get good results on high resolution images."]})};return Object(p.jsx)(w,{className:"hd-setting-block",title:"High Resolution Strategy",input:Object(p.jsx)(O,{width:80,value:n.hdStrategy,options:Object.values(y),onChange:function(e){return c(e)}}),optionDesc:function(){switch(n.hdStrategy){case y.ORIGINAL:return u();case y.CROP:return Object(p.jsxs)("div",{children:[Object(p.jsx)("div",{children:"Crop masking area from the original image to do inpainting, and paste the result back. Mainly for performance and memory reasons on high resolution image."}),Object(p.jsx)(S,{title:"Trigger size",value:"".concat(n.hdStrategyCropTrigerSize),suffix:"pixel",onValue:r}),Object(p.jsx)(S,{title:"Crop margin",value:"".concat(n.hdStrategyCropMargin),suffix:"pixel",onValue:l})]});case y.RESIZE:return Object(p.jsxs)("div",{children:[Object(p.jsx)("div",{children:"Resize the longer side of the image to a specific size(keep ratio), then do inpainting on the resized image."}),Object(p.jsx)(S,{title:"Size limit",value:"".concat(n.hdStrategyResizeLimit),suffix:"pixel",onValue:i})]});default:return u()}}()})};!function(e){e.LAMA="lama",e.LDM="ldm"}(C||(C={}));var L,N=function(){var e=Object(o.c)(R),t=Object(s.a)(e,2),n=t[0],a=t[1],c=function(e,t,n){return Object(p.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"4px"},children:[Object(p.jsx)("a",{className:"model-desc-link",href:t,target:"_blank",rel:"noreferrer noopener",children:e}),Object(p.jsx)("a",{className:"model-desc-link",href:n,target:"_blank",rel:"noreferrer noopener",children:n})]})},i=function(){return Object(p.jsxs)("div",{children:[c("High-Resolution Image Synthesis with Latent Diffusion Models","https://arxiv.org/abs/2112.10752","https://github.com/CompVis/latent-diffusion"),Object(p.jsx)(S,{title:"Steps",value:"".concat(n.ldmSteps),onValue:function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{ldmSteps:t})}))}}),Object(p.jsx)(w,{className:"sub-setting-block",title:"Sampler",input:Object(p.jsx)(O,{width:80,value:n.ldmSampler,options:Object.values(k),onChange:function(e){return t=e,void a((function(e){return Object(b.a)(Object(b.a)({},e),{},{ldmSampler:t})}));var t}})})]})};return Object(p.jsx)(w,{className:"model-setting-block",title:"Inpainting Model",input:Object(p.jsx)(O,{width:80,value:n.model,options:Object.values(C),onChange:function(e){return t=e,void a((function(e){return Object(b.a)(Object(b.a)({},e),{},{model:t})}));var t}}),optionDesc:function(){switch(n.model){case C.LAMA:return c("Resolution-robust Large Mask Inpainting with Fourier Convolutions","https://arxiv.org/abs/2109.07161","https://github.com/saic-mdal/lama");case C.LDM:return i();default:return Object(p.jsx)(p.Fragment,{})}}()})},z=Object(o.b)({key:"fileState",default:void 0}),E=Object(o.b)({key:"toastState",default:{open:!1,desc:"",state:"default",duration:3e3}}),I=Object(o.b)({key:"shortcutsState",default:!1}),D={show:!1,runInpaintingManually:!1,model:C.LAMA,ldmSteps:50,ldmSampler:k.plms,hdStrategy:y.RESIZE,hdStrategyResizeLimit:2048,hdStrategyCropTrigerSize:2048,hdStrategyCropMargin:128},R=Object(o.b)({key:"settingsState",default:D,effects:[(L="settingsState",function(e){var t=e.setSelf,n=e.onSet,a=localStorage.getItem(L);if(null!=a){var c=JSON.parse(a);c.show=!1,t(c)}n((function(e,t,n){return n?localStorage.removeItem(L):localStorage.setItem(L,JSON.stringify(e))}))})]}),T=n(9),A=function(){var e=Object(a.useState)(window.innerWidth),t=Object(s.a)(e,2),n=t[0],c=t[1],i=Object(a.useCallback)((function(){c(window.innerWidth)}),[]);return Object(a.useEffect)((function(){return window.addEventListener("resize",i),function(){window.removeEventListener("resize",i)}})),n<768?"mobile":n>=768&&n<1224?"tablet":n>=1224?"desktop":void 0};function Z(e){var t=e.onSelection,n=Object(a.useState)(!1),c=Object(s.a)(n,2),i=c[0],r=c[1],o=Object(a.useState)("file-upload-".concat(Math.random().toString())),l=Object(s.a)(o,1)[0],u=A();function b(e){if(e&&e.type.match("image.*"))try{if(e.size>20971520)throw new Error("file too large");t(e)}catch(n){alert("error: ".concat(n.message))}}function h(e){return f.apply(this,arguments)}function f(){return(f=Object(j.a)(d.a.mark((function e(t){return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e){t.file((function(t){return e(t)}))})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function v(e){return O.apply(this,arguments)}function O(){return(O=Object(j.a)(d.a.mark((function e(t){var n,a,c,i,r;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(n=[],a=[],c=0;c0)){e.next=23;break}if(!(null===(i=a.shift())||void 0===i?void 0:i.isFile)){e.next=12;break}return e.next=8,h(i);case 8:r=e.sent,n.push(r),e.next=21;break;case 12:if(!(null===i||void 0===i?void 0:i.isDirectory)){e.next=21;break}return e.t0=a.push,e.t1=a,e.t2=T.a,e.next=18,g(i.createReader());case 18:e.t3=e.sent,e.t4=(0,e.t2)(e.t3),e.t0.apply.call(e.t0,e.t1,e.t4);case 21:e.next=3;break;case 23:return e.abrupt("return",n);case 24:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function g(e){return m.apply(this,arguments)}function m(){return(m=Object(j.a)(d.a.mark((function e(t){var n,a;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=[],e.next=3,x(t);case 3:a=e.sent;case 4:if(!(a.length>0)){e.next=11;break}return n.push.apply(n,Object(T.a)(a)),e.next=8,x(t);case 8:a=e.sent,e.next=4;break;case 11:return e.abrupt("return",n);case 12:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function x(e){return w.apply(this,arguments)}function w(){return(w=Object(j.a)(d.a.mark((function e(t){return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e,n){t.readEntries(e,n)})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function y(){return(y=Object(j.a)(d.a.mark((function e(t){var n;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.preventDefault(),e.next=3,v(t.dataTransfer.items);case 3:n=e.sent,r(!1),b(n[0]);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(p.jsx)("label",{htmlFor:l,className:"file-select-label",children:Object(p.jsxs)("div",{className:["file-select-container",i?"file-select-label-hover":""].join(" "),onDrop:function(e){return y.apply(this,arguments)},onDragOver:function(e){e.stopPropagation(),e.preventDefault(),r(!0)},onDragLeave:function(){return r(!1)},children:[Object(p.jsx)("input",{id:l,name:l,type:"file",onChange:function(e){var t,n=null===(t=e.currentTarget.files)||void 0===t?void 0:t[0];n&&b(n)},accept:"image/png, image/jpeg"}),Object(p.jsx)("p",{className:"file-select-message",children:"desktop"===u?"Click here or drag an image file":"Tap here to load your picture"})]})})}var P=function(){var e=Object(o.e)(z);return Object(p.jsxs)("div",{className:"landing-page",children:[Object(p.jsxs)("h1",{children:["Image inpainting powered by \ud83e\udd99",Object(p.jsx)("a",{href:"https://github.com/saic-mdal/lama",children:"LaMa"})]}),Object(p.jsx)("div",{className:"landing-file-selector",children:Object(p.jsx)(Z,{onSelection:function(){var t=Object(j.a)(d.a.mark((function t(n){return d.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e(n);case 1:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}()})})]})},H=Object(o.b)({key:"themeState",default:"light"}),V=function(){var e=Object(o.c)(H),t=Object(s.a)(e,2),n=t[0],c=t[1];Object(a.useEffect)((function(){window.matchMedia("(prefers-color-scheme: dark)").matches?c("dark"):c("light")}),[c]);return Object(p.jsx)("div",{className:"theme-toggle-ui",children:Object(p.jsx)("div",{className:"theme-btn",onClick:function(){c("light"===n?"dark":"light")},role:"button",tabIndex:0,"aria-hidden":"true",children:"light"===n?Object(p.jsx)(h.i,{}):Object(p.jsx)(h.j,{style:{color:"#ffcc00"}})})})},F=n(38),W=n(54),U=n(40);function B(e){for(var t=e.split(",")[0].split(":")[1].split(";")[0],n=atob(e.split(",")[1]),a=[],c=0;ct){var c=Math.ceil(t*a);return"".concat(e,"x").concat(c)}var i=Math.ceil(n*a);return"".concat(i,"x").concat(e)}),[n,t,u]),j=Object(a.useCallback)((function(){for(var e=[],t=0;tt?(l(a[0]),c(parseInt(a[0],10))):(l(a[1]),c(parseInt(a[1],10)))},chevronDirection:"up"})}var ae="#ffcc00bb";function ce(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:ae;e.strokeStyle=n,e.lineCap="round",e.lineJoin="round",t.forEach((function(t){(null===t||void 0===t?void 0:t.pts.length)&&t.size&&(e.lineWidth=t.size,e.beginPath(),e.moveTo(t.pts[0].x,t.pts[0].y),t.pts.forEach((function(t){return e.lineTo(t.x,t.y)})),e.stroke())}))}function ie(e){var t=e.nativeEvent;return{x:t.offsetX,y:t.offsetY}}function re(e){var t=e.file,n=Object(o.d)(R),c=Object(o.c)(E),i=Object(s.a)(c,2),r=(i[0],i[1]),u=Object(a.useState)(40),b=Object(s.a)(u,2),f=b[0],v=b[1],O=function(e){var t=Object(a.useState)(new Image),n=Object(s.a)(t,1)[0],c=Object(a.useState)(!1),i=Object(s.a)(c,2),r=i[0],o=i[1];return Object(a.useEffect)((function(){return n.onload=function(){o(!0)},o(!1),n.src=URL.createObjectURL(e),function(){n.onload=null}}),[e,n]),[n,r]}(t),g=Object(s.a)(O,2),m=g[0],x=g[1],w=Object(a.useState)([]),y=Object(s.a)(w,2),k=y[0],S=y[1],C=Object(a.useState)(),M=Object(s.a)(C,2),L=M[0],N=M[1],z=Object(a.useState)((function(){return document.createElement("canvas")})),I=Object(s.a)(z,1)[0],D=Object(a.useState)([]),A=Object(s.a)(D,2),Z=A[0],P=A[1],H=Object(a.useState)([]),V=Object(s.a)(H,2),B=V[0],K=V[1],Y=Object(a.useState)({x:-1,y:-1}),X=Object(s.a)(Y,2),$=X[0],Q=$.x,te=$.y,ae=X[1],re=Object(a.useState)(!1),oe=Object(s.a)(re,2),se=oe[0],le=oe[1],ue=Object(a.useState)(!1),de=Object(s.a)(ue,2),je=de[0],be=de[1],he=Object(a.useState)(!1),fe=Object(s.a)(he,2),pe=fe[0],ve=fe[1],Oe=Object(a.useState)(!1),ge=Object(s.a)(Oe,2),me=ge[0],xe=ge[1],we=Object(a.useState)(!1),ye=Object(s.a)(we,2),ke=ye[0],Se=ye[1],Ce=Object(a.useState)(1),Me=Object(s.a)(Ce,2),Le=Me[0],Ne=Me[1],ze=Object(a.useState)(!1),Ee=Object(s.a)(ze,2),Ie=Ee[0],De=Ee[1],Re=Object(a.useState)(1),Te=Object(s.a)(Re,2),Ae=Te[0],Ze=Te[1],Pe=Object(a.useState)(1080),He=Object(s.a)(Pe,2),Ve=He[0],Fe=He[1],We=Object(W.a)(),Ue=We.width/2,Be=We.height/2,Ge=Object(a.useRef)(),Je=Object(a.useState)(!1),Ke=Object(s.a)(Je,2),_e=Ke[0],Ye=Ke[1],Xe=Object(a.useState)(!1),$e=Object(s.a)(Xe,2),Qe=$e[0],qe=$e[1],et=Object(a.useState)(!1),tt=Object(s.a)(et,2),nt=tt[0],at=tt[1],ct=Object(a.useState)(0),it=Object(s.a)(ct,2),rt=it[0],ot=it[1],st=Object(a.useCallback)((function(e,t){L&&(L.clearRect(0,0,L.canvas.width,L.canvas.height),L.drawImage(e,0,0,m.naturalWidth,m.naturalHeight),ce(L,t))}),[L,m]),lt=function(e){if(!(null===L||void 0===L?void 0:L.canvas.width)||!(null===L||void 0===L?void 0:L.canvas.height))throw new Error("canvas has invalid size");I.width=null===L||void 0===L?void 0:L.canvas.width,I.height=null===L||void 0===L?void 0:L.canvas.height;var t=I.getContext("2d");if(!t)throw new Error("could not retrieve mask canvas");e.forEach((function(e){ce(t,e,"white")}))},ut=function(){var e=Object(j.a)(d.a.mark((function e(){var a,c,i,o;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(dt()){e.next=2;break}return e.abrupt("return");case 2:return a=[].concat(Object(T.a)(Z),[B]),K([]),qe(!1),Se(!0),lt(a),e.prev=7,e.next=10,_(t,I.toDataURL(),n,Ve.toString());case 10:if(c=e.sent){e.next=13;break}throw new Error("empty response");case 13:return i=new Image,e.next=16,G(i,c);case 16:o=[].concat(Object(T.a)(k),[i]),S(o),st(i,[]),P(a),e.next=26;break;case 22:e.prev=22,e.t0=e.catch(7),r({open:!0,desc:e.t0.message?e.t0.message:e.t0.toString(),state:"error",duration:2e3}),bt([]);case 26:Se(!1);case 27:case"end":return e.stop()}}),e,null,[[7,22]])})));return function(){return e.apply(this,arguments)}}(),dt=function(){return 0!==B.length},jt=function(){return 0!==k.length},bt=Object(a.useCallback)((function(e){0===k.length?st(m,e):st(k[k.length-1],e)}),[m,k,st]),ht=function(e){return"Control"===e.key||"Meta"===e.key};Object(U.a)(ht,(function(){nt&&(ke||(at(!1),n.runInpaintingManually||ut()))}),{event:"keyup"},[ke,nt,dt]),Object(U.a)(ht,(function(){ke||at(!0)}),{event:"keydown"},[ke]),Object(a.useEffect)((function(){if(x){var e=We.width/m.naturalWidth,t=(We.height-200)/m.naturalHeight,n=1;if((e<1||t<1)&&(n=Math.min(e,t)),Ze(n),Ne(n),(null===L||void 0===L?void 0:L.canvas)&&(L.canvas.width=m.naturalWidth,L.canvas.height=m.naturalHeight,bt([])),!_e){var a;null===(a=Ge.current)||void 0===a||a.centerView(n,1),Ye(!0);var c=Math.max(m.width,m.height);Fe(c)}}}),[null===L||void 0===L?void 0:L.canvas,Ge,m,x,We,_e,bt]);var ft=Object(a.useCallback)((function(){if(Ae&&m&&We){var e=Ge.current;if(!e)throw new Error("no viewport");var t=(We.width-m.width*Ae)/2,n=(We.height-m.height*Ae)/2;e.setTransform(t,n,Ae,200,"easeOutQuad"),e.state.scale=Ae,Ne(Ae),De(!1)}}),[Ge,Ae,m,We]);Object(a.useEffect)((function(){return window.addEventListener("resize",(function(){ft()})),function(){window.removeEventListener("resize",(function(){ft()}))}}),[We,ft]);Object(U.a)("Escape",(function(){ke||(Qe||nt?(qe(!1),K([]),bt([])):ft())}),{event:"keydown"},[Qe,ke,nt,ft,bt]);var pt=Object(a.useCallback)((function(){if(0!==B.length){var e=B.slice(0,B.length-1);K(e),bt(e)}}),[B,bt]),vt=Object(a.useCallback)((function(){if(k.length){var e=Z.slice(0,Z.length-1);P(e),K([]),qe(!1);var t=k.slice(0,k.length-1);S(t),0===t.length?st(m,[]):st(t[t.length-1],[])}}),[st,k,Z,m]),Ot=function(){n.runInpaintingManually&&0!==B.length?pt():vt()};Object(U.a)((function(e){var t=(e.metaKey||e.ctrlKey)&&"z"===e.key;return"Tab"===e.key&&e.preventDefault(),!!t&&(e.preventDefault(),!0)}),Ot,void 0,[pt,vt]);Object(l.a)("Tab",(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),jt()&&xe((function(){return window.setTimeout((function(){ot(100)}),10),!0}))}),(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),jt()&&(ot(0),window.setTimeout((function(){xe(!1)}),350))}));var gt=function(e){e===se||pe||le(e)},mt=Object(a.useCallback)((function(){return pe?"grab":se?"none":void 0}),[se,pe]);Object(l.a)("[",(function(){v((function(e){return e>10?e-10:e<=10&&e>0?e-5:e}))})),Object(l.a)("]",(function(){v((function(e){return e+10}))})),Object(l.a)("R",(function(){n.runInpaintingManually&&dt()&&ut()})),Object(l.a)(" ",(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),le(!1),ve(!0)}),(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),le(!0),ve(!1)}));var xt=function(e,t){var n=function(){var e,t,n=Ae;return void 0!==(null===(e=Ge.current)||void 0===e?void 0:e.state.scale)&&(n=null===(t=Ge.current)||void 0===t?void 0:t.state.scale),n}();return{width:"".concat(f*n,"px"),height:"".concat(f*n,"px"),left:"".concat(e,"px"),top:"".concat(t,"px"),transform:"translate(-50%, -50%)"}};return Object(p.jsxs)("div",{className:"editor-container","aria-hidden":"true",onMouseMove:function(e){var t=e.nativeEvent;ae({x:t.pageX,y:t.pageY})},onMouseUp:function(e){(J(e)&&ve(!1),pe)||m.src&&(null===L||void 0===L?void 0:L.canvas)&&(ke||Qe&&(nt||n.runInpaintingManually?qe(!1):ut()))},children:[Object(p.jsx)(F.b,{ref:function(e){e&&(Ge.current=e)},panning:{disabled:!pe,velocityDisabled:!0},wheel:{step:.05},centerZoomedOut:!0,alignmentAnimation:{disabled:!0},limitToBounds:!1,doubleClick:{disabled:!0},initialScale:Ae,minScale:Ae,onPanning:function(e){Ie||De(!0)},onZoom:function(e){Ne(e.state.scale)},children:Object(p.jsx)(F.a,{contentClass:ke?"editor-canvas-loading":"",contentStyle:{visibility:_e?"visible":"hidden"},children:Object(p.jsxs)("div",{className:"editor-canvas-container",children:[Object(p.jsx)("canvas",{className:"editor-canvas",style:{cursor:mt(),clipPath:"inset(0 ".concat(rt,"% 0 0)"),transition:"clip-path 350ms ease-in-out"},onContextMenu:function(e){e.preventDefault()},onMouseOver:function(){gt(!0),be(!1)},onFocus:function(){return gt(!0)},onMouseLeave:function(){return gt(!1)},onMouseDown:function(e){if(!pe&&(m.src&&(null===L||void 0===L?void 0:L.canvas)&&!ke&&!function(e){return 2===e.nativeEvent.button}(e)))if(J(e))ve(!0);else{qe(!0);var t=[];(nt||n.runInpaintingManually)&&(t=Object(T.a)(B)),t.push({size:f,pts:[ie(e)]}),K(t),bt(t)}},onMouseMove:function(e){if(!pe&&Qe&&0!==B.length){var t=Object(T.a)(B);t[t.length-1].pts.push(ie(e)),K(t),bt(t)}},ref:function(e){if(e&&!L){var t=e.getContext("2d");t&&N(t)}}}),Object(p.jsxs)("div",{className:"original-image-container",style:{width:"".concat(m.naturalWidth,"px"),height:"".concat(m.naturalHeight,"px")},children:[me&&Object(p.jsx)("div",{className:"editor-slider",style:{marginRight:"".concat(rt,"%")}}),Object(p.jsx)("img",{className:"original-image",src:m.src,alt:"original",style:{width:"".concat(m.naturalWidth,"px"),height:"".concat(m.naturalHeight,"px")}})]})]})})}),se&&!ke&&!pe&&Object(p.jsx)("div",{className:"brush-shape",style:xt(Q,te)}),je&&Object(p.jsx)("div",{className:"brush-shape",style:xt(Ue,Be)}),Object(p.jsxs)("div",{className:"editor-toolkit-panel",children:[Object(p.jsx)(ne,{onChange:function(e){Fe(e)},originalWidth:m.naturalWidth,originalHeight:m.naturalHeight}),Object(p.jsx)(ee,{label:"Brush",min:10,max:150,value:f,onChange:function(e){v(e),je||(be(!0),window.setTimeout((function(){be(!1)}),1e4))},onClick:function(){return be(!1)}}),Object(p.jsxs)("div",{className:"editor-toolkit-btns",children:[Object(p.jsx)(q,{toolTip:"Reset Zoom & Pan",tooltipPosition:"top",icon:Object(p.jsx)(h.b,{}),disabled:Le===Ae&&!1===Ie,onClick:ft}),Object(p.jsx)(q,{toolTip:"Undo",tooltipPosition:"top",icon:Object(p.jsx)("svg",{width:"19",height:"9",viewBox:"0 0 19 9",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:Object(p.jsx)("path",{d:"M2 1C2 0.447715 1.55228 0 1 0C0.447715 0 0 0.447715 0 1H2ZM1 8H0V9H1V8ZM8 9C8.55228 9 9 8.55229 9 8C9 7.44771 8.55228 7 8 7V9ZM16.5963 7.42809C16.8327 7.92721 17.429 8.14016 17.9281 7.90374C18.4272 7.66731 18.6402 7.07103 18.4037 6.57191L16.5963 7.42809ZM16.9468 5.83205L17.8505 5.40396L16.9468 5.83205ZM0 1V8H2V1H0ZM1 9H8V7H1V9ZM1.66896 8.74329L6.66896 4.24329L5.33104 2.75671L0.331035 7.25671L1.66896 8.74329ZM16.043 6.26014L16.5963 7.42809L18.4037 6.57191L17.8505 5.40396L16.043 6.26014ZM6.65079 4.25926C9.67554 1.66661 14.3376 2.65979 16.043 6.26014L17.8505 5.40396C15.5805 0.61182 9.37523 -0.710131 5.34921 2.74074L6.65079 4.25926Z",fill:"currentColor"})}),onClick:Ot,disabled:function(){if(k.length>0)return!1;if(n.runInpaintingManually){if(0===B.length)return!0}else if(0===k.length)return!0;return!1}()}),Object(p.jsx)(q,{toolTip:"Show Original",tooltipPosition:"top",icon:Object(p.jsx)(h.h,{}),className:me?"eyeicon-active":"",onDown:function(e){e.preventDefault(),xe((function(){return window.setTimeout((function(){ot(100)}),10),!0}))},onUp:function(){ot(0),window.setTimeout((function(){xe(!1)}),350)},disabled:0===k.length}),Object(p.jsx)(q,{toolTip:"Save Image",tooltipPosition:"top",icon:Object(p.jsx)(h.f,{}),disabled:!k.length,onClick:function(){var e=t.name.replace(/(\.[\w\d_-]+)$/i,"_cleanup$1");!function(e,t){var n=document.createElement("a");n.href=e,n.download=t,n.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window})),setTimeout((function(){n.remove()}),100)}(k[k.length-1].currentSrc,e)}}),n.runInpaintingManually&&Object(p.jsx)(q,{toolTip:"Run Inpainting",tooltipPosition:"top",icon:Object(p.jsx)("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:Object(p.jsx)("path",{d:"M2 13L1.34921 12.2407C1.16773 12.3963 1.04797 12.6117 1.01163 12.8479L2 13ZM22.5 4L23.49 4.14142C23.5309 3.85444 23.4454 3.5638 23.2555 3.3448C23.0655 3.1258 22.7899 3 22.5 3V4ZM12.5 4V3C12.2613 3 12.0305 3.08539 11.8492 3.24074L12.5 4ZM1 19.5L0.0116283 19.3479C-0.0327373 19.6363 0.051055 19.9297 0.241035 20.1511C0.431014 20.3726 0.708231 20.5 1 20.5V19.5ZM11.5 19.5V20.5C11.7373 20.5 11.9668 20.4156 12.1476 20.2619L11.5 19.5ZM21.5 11L22.1476 11.7619C22.3337 11.6038 22.4554 11.3831 22.49 11.1414L21.5 11ZM2 14H12.5V12H2V14ZM13.169 13.7433L23.169 4.74329L21.831 3.25671L11.831 12.2567L13.169 13.7433ZM22.5 3H12.5V5H22.5V3ZM11.8492 3.24074L1.34921 12.2407L2.65079 13.7593L13.1508 4.75926L11.8492 3.24074ZM1.01163 12.8479L0.0116283 19.3479L1.98837 19.6521L2.98837 13.1521L1.01163 12.8479ZM1 20.5H11.5V18.5H1V20.5ZM12.4884 19.6521L13.4884 13.1521L11.5116 12.8479L10.5116 19.3479L12.4884 19.6521ZM21.51 3.85858L20.51 10.8586L22.49 11.1414L23.49 4.14142L21.51 3.85858ZM20.8524 10.2381L10.8524 18.7381L12.1476 20.2619L22.1476 11.7619L20.8524 10.2381Z",fill:"currentColor"})}),disabled:!dt()||ke,onClick:function(){!ke&&dt()&&ut()}})]})]})]})}var oe=n(25),se=c.a.forwardRef((function(e,t){var n=e.show,a=e.children,c=e.onClose,i=e.className,r=e.title;return Object(p.jsx)(oe.d,{open:n,onOpenChange:function(e){e||null===c||void 0===c||c()},children:Object(p.jsxs)(oe.c,{children:[Object(p.jsx)(oe.b,{className:"modal-mask"}),Object(p.jsxs)(oe.a,{ref:t,className:"modal ".concat(i),children:[Object(p.jsxs)("div",{className:"modal-header",children:[Object(p.jsx)(oe.e,{children:r}),Object(p.jsx)(q,{icon:Object(p.jsx)(h.k,{}),onClick:c})]}),a]})]})})}));function le(e){var t=e.content,n=e.keys;return Object(p.jsxs)("div",{className:"shortcut-option",children:[Object(p.jsx)("div",{className:"shortcut-description",children:t}),Object(p.jsx)("div",{style:{display:"flex",justifySelf:"end",gap:"8px"},children:n.map((function(e,t){return Object(p.jsx)("div",{className:"shortcut-key",children:e},e)}))})]})}var ue=/macintosh|mac os x/i.test(navigator.userAgent),de=(/windows|win32/i.test(navigator.userAgent),ue?"Cmd":"Ctrl");function je(){var e=Object(o.c)(I),t=Object(s.a)(e,2),n=t[0],a=t[1];return Object(p.jsx)(se,{onClose:function(){a(!1)},title:"Hotkeys",className:"modal-shortcuts",show:n,children:Object(p.jsxs)("div",{className:"shortcut-options",children:[Object(p.jsx)(le,{content:"Enable Multi-Stroke Mask Drawing",keys:["Hold ".concat(de)]}),Object(p.jsx)(le,{content:"Undo Inpainting",keys:[de,"Z"]}),Object(p.jsx)(le,{content:"Pan",keys:["Space & Drag"]}),Object(p.jsx)(le,{content:"View Original Image",keys:["Hold Tab"]}),Object(p.jsx)(le,{content:"Reset Zoom/Pan",keys:["Esc"]}),Object(p.jsx)(le,{content:"Cancel Mask Drawing",keys:["Esc"]}),Object(p.jsx)(le,{content:"Run Inpainting Manually",keys:["Shift","R"]}),Object(p.jsx)(le,{content:"Decrease Brush Size",keys:["["]}),Object(p.jsx)(le,{content:"Increase Brush Size",keys:["]"]}),Object(p.jsx)(le,{content:"Toggle Dark Mode",keys:["Shift","D"]}),Object(p.jsx)(le,{content:"Toggle Hotkeys Panel",keys:["H"]})]})})}var be=n(39),he=["className"],fe=["className"],pe=c.a.forwardRef((function(e,t){var n=e.className,a=Object(g.a)(e,he);return Object(p.jsx)(be.a,Object(b.a)(Object(b.a)({},a),{},{ref:t,className:"switch-root ".concat(n)}))})),ve=c.a.forwardRef((function(e,t){var n=e.className,a=Object(g.a)(e,fe);return Object(p.jsx)(be.b,Object(b.a)(Object(b.a)({},a),{},{ref:t,className:"switch-thumb ".concat(n)}))})),Oe=function(){var e=Object(o.c)(R),t=Object(s.a)(e,2),n=t[0],a=t[1];return Object(p.jsx)(w,{title:"Manual Inpainting Mode",input:Object(p.jsx)(pe,{checked:n.runInpaintingManually,onCheckedChange:function(e){a((function(t){return Object(b.a)(Object(b.a)({},t),{},{runInpaintingManually:e})}))},children:Object(p.jsx)(ve,{})})})};function ge(e){var t=e.onClose,n=Object(o.c)(R),a=Object(s.a)(n,2),c=a[0],i=a[1];return Object(p.jsxs)(se,{onClose:function(){i((function(e){return Object(b.a)(Object(b.a)({},e),{},{show:!1})})),t()},title:"Settings",className:"modal-setting",show:c.show,children:[Object(p.jsx)(Oe,{}),Object(p.jsx)(N,{}),Object(p.jsx)(M,{})]})}var me=n(28),xe=["state","desc"],we=function(){return Object(p.jsx)("span",{className:"loading-icon",children:Object(p.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[Object(p.jsx)("line",{x1:"12",y1:"2",x2:"12",y2:"6"}),Object(p.jsx)("line",{x1:"12",y1:"18",x2:"12",y2:"22"}),Object(p.jsx)("line",{x1:"4.93",y1:"4.93",x2:"7.76",y2:"7.76"}),Object(p.jsx)("line",{x1:"16.24",y1:"16.24",x2:"19.07",y2:"19.07"}),Object(p.jsx)("line",{x1:"2",y1:"12",x2:"6",y2:"12"}),Object(p.jsx)("line",{x1:"18",y1:"12",x2:"22",y2:"12"}),Object(p.jsx)("line",{x1:"4.93",y1:"19.07",x2:"7.76",y2:"16.24"}),Object(p.jsx)("line",{x1:"16.24",y1:"7.76",x2:"19.07",y2:"4.93"})]})})},ye=a.forwardRef((function(e,t){var n=e.state,a=e.desc,c=Object(g.a)(e,xe);return Object(p.jsxs)(me.b,{children:[Object(p.jsxs)(me.c,Object(b.a)(Object(b.a)({},c),{},{ref:t,className:"toast-root ".concat(n),children:[Object(p.jsx)("div",{className:"toast-icon",children:function(){switch(n){case"error":return Object(p.jsx)(h.g,{className:"error-icon"});case"success":return Object(p.jsx)(h.c,{className:"success-icon"});case"loading":return Object(p.jsx)(we,{});default:return Object(p.jsx)(p.Fragment,{})}}()}),Object(p.jsx)(me.a,{className:"toast-desc",children:a})]})),Object(p.jsx)(me.d,{className:"toast-viewpoint"})]})}));ye.defaultProps={desc:"",state:"loading"};var ke=ye,Se=function(e){var t=e.file,n=Object(o.c)(R),c=Object(s.a)(n,2),i=c[0],r=c[1],l=Object(o.c)(E),u=Object(s.a)(l,2),h=u[0],f=u[1],v=function(){var e=Object(j.a)(d.a.mark((function e(){var t,n,a,c,o;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,$().then((function(e){return e.text()}));case 2:if((t=e.sent)!==i.model){e.next=5;break}return e.abrupt("return");case 5:return e.next=7,(s=i.model,fetch("".concat(K,"/model_downloaded/").concat(s),{method:"GET"})).then((function(e){return e.text()}));case 7:n=e.sent,a=i.model,c="Switching to ".concat(a," model"),o=3e3,"False"===n&&(c="Downloading ".concat(a," model, this may take a while"),o=9999999999),f({open:!0,desc:c,state:"loading",duration:o}),X(a).then((function(e){if(!e.ok)throw new Error("Server error");f({open:!0,desc:"Switch to ".concat(a," model success"),state:"success",duration:3e3})})).catch((function(){f({open:!0,desc:"Switch to ".concat(a," model failed"),state:"error",duration:3e3}),r((function(e){return Object(b.a)(Object(b.a)({},e),{},{model:t})}))}));case 14:case"end":return e.stop()}var s}),e)})));return function(){return e.apply(this,arguments)}}();return Object(a.useEffect)((function(){$().then((function(e){return e.text()})).then((function(e){r((function(t){return Object(b.a)(Object(b.a)({},t),{},{model:e})}))}))}),[r]),Object(p.jsxs)(p.Fragment,{children:[Object(p.jsx)(re,{file:t}),Object(p.jsx)(ge,{onClose:v}),Object(p.jsx)(je,{}),Object(p.jsx)(ke,Object(b.a)(Object(b.a)({},h),{},{onOpenChange:function(e){f((function(t){return Object(b.a)(Object(b.a)({},t),{},{open:e})}))}}))]})},Ce=function(){var e=Object(o.c)(I),t=Object(s.a)(e,2),n=t[0],a=t[1],c=function(){a((function(e){return!e}))};return Object(l.a)("h",(function(e){null===e||void 0===e||e.preventDefault(),c()})),Object(p.jsx)("div",{className:"shortcuts",children:Object(p.jsx)(q,{onClick:c,toolTip:"Hotkeys",tooltipPosition:"bottom",disabled:n,style:{border:0},icon:Object(p.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",width:"28",height:"28",preserveAspectRatio:"xMidYMid meet",viewBox:"0 0 16 16",children:[Object(p.jsx)("rect",{x:"0",y:"0",width:"16",height:"16",fill:"none",stroke:"none"}),Object(p.jsxs)("g",{fill:"currentColor",children:[Object(p.jsx)("path",{d:"M14 5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h12zM2 4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H2z"}),Object(p.jsx)("path",{d:"M13 10.25a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm0-2a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-5 0A.25.25 0 0 1 8.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 8 8.75v-.5zm2 0a.25.25 0 0 1 .25-.25h1.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-1.5a.25.25 0 0 1-.25-.25v-.5zm1 2a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-5-2A.25.25 0 0 1 6.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 6 8.75v-.5zm-2 0A.25.25 0 0 1 4.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 4 8.75v-.5zm-2 0A.25.25 0 0 1 2.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 2 8.75v-.5zm11-2a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-2 0a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-2 0A.25.25 0 0 1 9.25 6h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 9 6.75v-.5zm-2 0A.25.25 0 0 1 7.25 6h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 7 6.75v-.5zm-2 0A.25.25 0 0 1 5.25 6h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 5 6.75v-.5zm-3 0A.25.25 0 0 1 2.25 6h1.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-1.5A.25.25 0 0 1 2 6.75v-.5zm0 4a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm2 0a.25.25 0 0 1 .25-.25h5.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-5.5a.25.25 0 0 1-.25-.25v-.5z"})]})]})})})},Me=function(){var e=Object(o.c)(R),t=Object(s.a)(e,2),n=t[0],a=t[1];return Object(p.jsx)("div",{children:Object(p.jsx)(q,{onClick:function(){a(Object(b.a)(Object(b.a)({},n),{},{show:!n.show}))},toolTip:"Settings",tooltipPosition:"bottom",style:{border:0},icon:Object(p.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",role:"img",width:"28",height:"28",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"2",children:[Object(p.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"}),Object(p.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})]})})})},Le=function(){var e=Object(o.c)(z),t=Object(s.a)(e,2),n=t[0],a=t[1],c=A();return Object(p.jsxs)("header",{children:[Object(p.jsx)("div",{style:{visibility:n?"visible":"hidden"},children:Object(p.jsx)(q,{icon:Object(p.jsx)(h.a,{}),onClick:function(){a(void 0)},style:{border:0},children:"desktop"===c?"Start New":void 0})}),Object(p.jsxs)("div",{className:"header-icons-wrapper",children:[Object(p.jsx)(V,{}),n&&Object(p.jsxs)("div",{className:"header-icons",children:[Object(p.jsx)(Ce,{}),Object(p.jsx)(Me,{})]})]})]})};!function(){function e(){return e=Object(j.a)(d.a.mark((function e(){var t,n,a=arguments;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=a.length>0&&void 0!==a[0]?a[0]:"",e.next=3,fetch(t,{method:"GET",cache:"no-cache"});case 3:return n=e.sent,e.abrupt("return",n.json());case 5:case"end":return e.stop()}}),e)}))),e.apply(this,arguments)}var t=function(){(function(){return e.apply(this,arguments)})(document.location+"/flaskwebgui-keep-server-alive").then((function(e){return e}))};document.addEventListener("DOMContentLoaded",(function(){t(),setInterval(t,3e3)}))}();var Ne=function(){var e=Object(o.c)(z),t=Object(s.a)(e,2),n=t[0],c=t[1],i=Object(o.c)(H),r=Object(s.a)(i,2),u=r[0],b=r[1],h=function(){var e=Object(a.useState)(),t=Object(s.a)(e,2),n=t[0],c=t[1],i=Object(a.useCallback)((function(){var e=new Headers;e.append("pragma","no-cache"),e.append("cache-control","no-cache"),fetch("/inputimage",{headers:e}).then(function(){var e=Object(j.a)(d.a.mark((function e(t){var n,a,i,r;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=null===(n=t.headers.get("content-disposition"))||void 0===n?void 0:n.split("filename=")[1].split(";")[0],e.next=3,t.blob();case 3:(i=e.sent)&&i.type.startsWith("image")&&(r=new File([i],void 0!==a?a:"inputImage"),c(r));case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())}),[c]);return Object(a.useEffect)((function(){i()}),[i]),n}();return Object(a.useEffect)((function(){c(h)}),[h,c]),Object(l.a)("D",(function(e){null===e||void 0===e||e.preventDefault(),b("light"===u?"dark":"light")})),Object(a.useEffect)((function(){document.body.setAttribute("data-theme",u)}),[u]),Object(p.jsxs)("div",{className:"lama-cleaner",children:[Object(p.jsx)(Le,{}),n?Object(p.jsx)(Se,{file:n}):Object(p.jsx)(P,{})]})};r.a.render(Object(p.jsx)(c.a.StrictMode,{children:Object(p.jsx)(o.a,{children:Object(p.jsx)(Ne,{})})}),document.getElementById("root"))}},[[51,1,2]]]); \ No newline at end of file From e5d057ce70acf82bf480298ced5cb1f22138272b Mon Sep 17 00:00:00 2001 From: Qing Date: Sun, 12 Jun 2022 22:13:41 +0800 Subject: [PATCH 6/6] 0.13.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 0d6c2fc..fcb3830 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ def load_requirements(): # https://setuptools.readthedocs.io/en/latest/setuptools.html#including-data-files setuptools.setup( name="lama-cleaner", - version="0.12.0", + version="0.13.0", author="PanicByte", author_email="cwq1913@gmail.com", description="Image inpainting tool powered by SOTA AI Model",