From b7c473d1abda165e1ff6f90dfacc6f589c3d1c38 Mon Sep 17 00:00:00 2001 From: Janek Mann Date: Mon, 17 Jun 2024 12:55:06 +0100 Subject: [PATCH 001/123] Fix lora keys for SimpleTuner (#3759) --- comfy/lora.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/comfy/lora.py b/comfy/lora.py index 37254b03f..082a8b3cb 100644 --- a/comfy/lora.py +++ b/comfy/lora.py @@ -30,6 +30,7 @@ def load_lora(lora, to_load): regular_lora = "{}.lora_up.weight".format(x) diffusers_lora = "{}_lora.up.weight".format(x) diffusers2_lora = "{}.lora_B.weight".format(x) + diffusers3_lora = "{}.lora.up.weight".format(x) transformers_lora = "{}.lora_linear_layer.up.weight".format(x) A_name = None @@ -45,6 +46,10 @@ def load_lora(lora, to_load): A_name = diffusers2_lora B_name = "{}.lora_A.weight".format(x) mid_name = None + elif diffusers3_lora in lora.keys(): + A_name = diffusers3_lora + B_name = "{}.lora.down.weight".format(x) + mid_name = None elif transformers_lora in lora.keys(): A_name = transformers_lora B_name ="{}.lora_linear_layer.down.weight".format(x) From 379ff92e9e872a588ad2ceeabdd08b909590b25b Mon Sep 17 00:00:00 2001 From: Juanjuan <472185568@qq.com> Date: Mon, 17 Jun 2024 19:56:53 +0800 Subject: [PATCH 002/123] fix app.js no graph defined (#3754) * local test * fix "graph" not found * fix --------- Co-authored-by: Xiujuan Li --- web/scripts/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/scripts/app.js b/web/scripts/app.js index f96d197a8..58fb765c4 100644 --- a/web/scripts/app.js +++ b/web/scripts/app.js @@ -2239,7 +2239,7 @@ export class ComfyApp { const node = LiteGraph.createNode(data.class_type); node.id = isNaN(+id) ? id : +id; node.title = data._meta?.title ?? node.title - graph.add(node); + app.graph.add(node); } for (const id of ids) { From a45df695706e8b80a66ff6815789582d88571326 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Mon, 17 Jun 2024 22:48:23 -0400 Subject: [PATCH 003/123] Basic tiled decoding for audio VAE. --- comfy/sd.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/comfy/sd.py b/comfy/sd.py index 58a858aa0..cfbf8fa4d 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -298,6 +298,17 @@ class VAE: / 3.0) return output + def decode_tiled_1d(self, samples, tile_x=128, overlap=64): + output = torch.empty((samples.shape[0], self.output_channels) + tuple(map(lambda a: a * self.upscale_ratio, samples.shape[2:])), device=self.output_device) + + for j in range(samples.shape[0]): + for i in range(0, samples.shape[-1], tile_x - overlap): + f = i + t = i + tile_x + output[j:j+1,:,f * self.upscale_ratio:t * self.upscale_ratio] = self.first_stage_model.decode(samples[j:j+1,:,f:t].to(self.vae_dtype).to(self.device)).float() + + return output + def encode_tiled_(self, pixel_samples, tile_x=512, tile_y=512, overlap = 64): steps = pixel_samples.shape[0] * comfy.utils.get_tiled_scale_steps(pixel_samples.shape[3], pixel_samples.shape[2], tile_x, tile_y, overlap) steps += pixel_samples.shape[0] * comfy.utils.get_tiled_scale_steps(pixel_samples.shape[3], pixel_samples.shape[2], tile_x // 2, tile_y * 2, overlap) @@ -325,7 +336,10 @@ class VAE: pixel_samples[x:x+batch_number] = self.process_output(self.first_stage_model.decode(samples).to(self.output_device).float()) except model_management.OOM_EXCEPTION as e: logging.warning("Warning: Ran out of memory when regular VAE decoding, retrying with tiled VAE decoding.") - pixel_samples = self.decode_tiled_(samples_in) + if len(samples_in.shape) == 3: + pixel_samples = self.decode_tiled_1d(samples_in) + else: + pixel_samples = self.decode_tiled_(samples_in) pixel_samples = pixel_samples.to(self.output_device).movedim(1,-1) return pixel_samples From 55f0dc124ed4352ac52b884c13f41ff9a9736102 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 18 Jun 2024 09:57:40 -0400 Subject: [PATCH 004/123] Add soundfile dependency so that windows can save audio. --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 85e1dc9b0..108958d2f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,3 +15,4 @@ psutil #non essential dependencies: kornia>=0.7.1 spandrel +soundfile From 3914d5a2ae5c755556c9f15e70d2b4104984da87 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 19 Jun 2024 10:01:43 -0400 Subject: [PATCH 005/123] Support full SD3 loras. --- comfy/lora.py | 19 +++++++------- comfy/utils.py | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 10 deletions(-) diff --git a/comfy/lora.py b/comfy/lora.py index 082a8b3cb..9e3e7a8bb 100644 --- a/comfy/lora.py +++ b/comfy/lora.py @@ -252,15 +252,14 @@ def model_lora_keys_unet(model, key_map={}): key_map[diffusers_lora_key] = unet_key if isinstance(model, comfy.model_base.SD3): #Diffusers lora SD3 - for i in range(model.model_config.unet_config.get("depth", 0)): - k = "transformer.transformer_blocks.{}.attn.".format(i) - qkv = "diffusion_model.joint_blocks.{}.x_block.attn.qkv.weight".format(i) - proj = "diffusion_model.joint_blocks.{}.x_block.attn.proj.weight".format(i) - if qkv in sd: - offset = sd[qkv].shape[0] // 3 - key_map["{}to_q".format(k)] = (qkv, (0, 0, offset)) - key_map["{}to_k".format(k)] = (qkv, (0, offset, offset)) - key_map["{}to_v".format(k)] = (qkv, (0, offset * 2, offset)) - key_map["{}to_out.0".format(k)] = proj + diffusers_keys = comfy.utils.mmdit_to_diffusers(model.model_config.unet_config, output_prefix="diffusion_model.") + for k in diffusers_keys: + if k.endswith(".weight"): + to = diffusers_keys[k] + key_lora = "transformer.{}".format(k[:-len(".weight")]) #regular diffusers sd3 lora format + key_map[key_lora] = to + + key_lora = "base_model.model.{}".format(k[:-len(".weight")]) #format for flash-sd3 lora and others? + key_map[key_lora] = to return key_map diff --git a/comfy/utils.py b/comfy/utils.py index 884404cce..0d24fe730 100644 --- a/comfy/utils.py +++ b/comfy/utils.py @@ -249,6 +249,76 @@ def unet_to_diffusers(unet_config): return diffusers_unet_map +MMDIT_MAP_BASIC = { + ("context_embedder.bias", "context_embedder.bias"), + ("context_embedder.weight", "context_embedder.weight"), + ("t_embedder.mlp.0.bias", "time_text_embed.timestep_embedder.linear_1.bias"), + ("t_embedder.mlp.0.weight", "time_text_embed.timestep_embedder.linear_1.weight"), + ("t_embedder.mlp.2.bias", "time_text_embed.timestep_embedder.linear_2.bias"), + ("t_embedder.mlp.2.weight", "time_text_embed.timestep_embedder.linear_2.weight"), + ("x_embedder.proj.bias", "pos_embed.proj.bias"), + ("x_embedder.proj.weight", "pos_embed.proj.weight"), + ("y_embedder.mlp.0.bias", "time_text_embed.text_embedder.linear_1.bias"), + ("y_embedder.mlp.0.weight", "time_text_embed.text_embedder.linear_1.weight"), + ("y_embedder.mlp.2.bias", "time_text_embed.text_embedder.linear_2.bias"), + ("y_embedder.mlp.2.weight", "time_text_embed.text_embedder.linear_2.weight"), + ("pos_embed", "pos_embed.pos_embed"), + ("final_layer.adaLN_modulation.1.bias", "norm_out.linear.bias"), + ("final_layer.adaLN_modulation.1.weight", "norm_out.linear.weight"), + ("final_layer.linear.bias", "proj_out.bias"), + ("final_layer.linear.weight", "proj_out.weight"), +} + +MMDIT_MAP_BLOCK = { + ("context_block.adaLN_modulation.1.bias", "norm1_context.linear.bias"), + ("context_block.adaLN_modulation.1.weight", "norm1_context.linear.weight"), + ("context_block.attn.proj.bias", "attn.to_add_out.bias"), + ("context_block.attn.proj.weight", "attn.to_add_out.weight"), + ("context_block.mlp.fc1.bias", "ff_context.net.0.proj.bias"), + ("context_block.mlp.fc1.weight", "ff_context.net.0.proj.weight"), + ("context_block.mlp.fc2.bias", "ff_context.net.2.bias"), + ("context_block.mlp.fc2.weight", "ff_context.net.2.weight"), + ("x_block.adaLN_modulation.1.bias", "norm1.linear.bias"), + ("x_block.adaLN_modulation.1.weight", "norm1.linear.weight"), + ("x_block.attn.proj.bias", "attn.to_out.0.bias"), + ("x_block.attn.proj.weight", "attn.to_out.0.weight"), + ("x_block.mlp.fc1.bias", "ff.net.0.proj.bias"), + ("x_block.mlp.fc1.weight", "ff.net.0.proj.weight"), + ("x_block.mlp.fc2.bias", "ff.net.2.bias"), + ("x_block.mlp.fc2.weight", "ff.net.2.weight"), + ("", ""), +} + +def mmdit_to_diffusers(mmdit_config, output_prefix=""): + key_map = {} + + depth = mmdit_config.get("depth", 0) + for i in range(depth): + block_from = "transformer_blocks.{}".format(i) + block_to = "{}joint_blocks.{}".format(output_prefix, i) + + offset = depth * 64 + + for end in ("weight", "bias"): + k = "{}.attn.".format(block_from) + qkv = "{}.x_block.attn.qkv.{}".format(block_to, end) + key_map["{}to_q.{}".format(k, end)] = (qkv, (0, 0, offset)) + key_map["{}to_k.{}".format(k, end)] = (qkv, (0, offset, offset)) + key_map["{}to_v.{}".format(k, end)] = (qkv, (0, offset * 2, offset)) + + qkv = "{}.context_block.attn.qkv.{}".format(block_to, end) + key_map["{}add_q_proj.{}".format(k, end)] = (qkv, (0, 0, offset)) + key_map["{}add_k_proj.{}".format(k, end)] = (qkv, (0, offset, offset)) + key_map["{}add_v_proj.{}".format(k, end)] = (qkv, (0, offset * 2, offset)) + + for k in MMDIT_MAP_BLOCK: + key_map["{}.{}".format(block_from, k[1])] = "{}.{}".format(block_to, k[0]) + + for k in MMDIT_MAP_BASIC: + key_map[k[1]] = "{}{}".format(output_prefix, k[0]) + + return key_map + def repeat_to_batch_size(tensor, batch_size, dim=0): if tensor.shape[dim] > batch_size: return tensor.narrow(dim, 0, batch_size) From 97ae6ef46001ed444ef1f2bd085beae98c17c240 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Wed, 19 Jun 2024 10:39:17 -0400 Subject: [PATCH 006/123] Add api/ prefix to api endpoints (#3779) --- server.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/server.py b/server.py index bab3b0600..590902587 100644 --- a/server.py +++ b/server.py @@ -527,9 +527,20 @@ class PromptServer(): self.prompt_queue.delete_history_item(id_to_delete) return web.Response(status=200) - + def add_routes(self): self.user_manager.add_routes(self.routes) + + # Prefix every route with /api for easier matching for delegation. + # This is very useful for frontend dev server, which need to forward + # everything except serving of static files. + # Currently both the old endpoints without prefix and new endpoints with + # prefix are supported. + api_routes = web.RouteTableDef() + for route in self.routes: + assert isinstance(route, web.RouteDef) + api_routes.route(route.method, "/api" + route.path)(route.handler, **route.kwargs) + self.app.add_routes(api_routes) self.app.add_routes(self.routes) for name, dir in nodes.EXTENSION_WEB_DIRS.items(): From e11052afcfd1e8aa3190d47c44f79b72a7a7a78a Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 19 Jun 2024 16:32:30 -0400 Subject: [PATCH 007/123] Add ipndm sampler. --- comfy/k_diffusion/sampling.py | 41 +++++++++++++++++++++++++++++++++++ comfy/samplers.py | 3 ++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/comfy/k_diffusion/sampling.py b/comfy/k_diffusion/sampling.py index 5bb991e76..214199266 100644 --- a/comfy/k_diffusion/sampling.py +++ b/comfy/k_diffusion/sampling.py @@ -841,3 +841,44 @@ def sample_heunpp2(model, x, sigmas, extra_args=None, callback=None, disable=Non d_prime = w1 * d + w2 * d_2 + w3 * d_3 x = x + d_prime * dt return x + + +#From https://github.com/zju-pi/diff-sampler/blob/main/diff-solvers-main/solvers.py +#under Apache 2 license +def sample_ipndm(model, x, sigmas, extra_args=None, callback=None, disable=None, max_order=4): + extra_args = {} if extra_args is None else extra_args + s_in = x.new_ones([x.shape[0]]) + + x_next = x + + buffer_model = [] + for i in trange(len(sigmas) - 1, disable=disable): + t_cur = sigmas[i] + t_next = sigmas[i + 1] + + x_cur = x_next + + denoised = model(x_cur, t_cur * s_in, **extra_args) + if callback is not None: + callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigmas[i], 'denoised': denoised}) + + d_cur = (x_cur - denoised) / t_cur + + order = min(max_order, i+1) + if order == 1: # First Euler step. + x_next = x_cur + (t_next - t_cur) * d_cur + elif order == 2: # Use one history point. + x_next = x_cur + (t_next - t_cur) * (3 * d_cur - buffer_model[-1]) / 2 + elif order == 3: # Use two history points. + x_next = x_cur + (t_next - t_cur) * (23 * d_cur - 16 * buffer_model[-1] + 5 * buffer_model[-2]) / 12 + elif order == 4: # Use three history points. + x_next = x_cur + (t_next - t_cur) * (55 * d_cur - 59 * buffer_model[-1] + 37 * buffer_model[-2] - 9 * buffer_model[-3]) / 24 + + if len(buffer_model) == max_order - 1: + for k in range(max_order - 2): + buffer_model[k] = buffer_model[k+1] + buffer_model[-1] = d_cur + else: + buffer_model.append(d_cur) + + return x_next diff --git a/comfy/samplers.py b/comfy/samplers.py index 656e0a28f..4de377cc0 100644 --- a/comfy/samplers.py +++ b/comfy/samplers.py @@ -539,7 +539,8 @@ class Sampler: KSAMPLER_NAMES = ["euler", "euler_ancestral", "heun", "heunpp2","dpm_2", "dpm_2_ancestral", "lms", "dpm_fast", "dpm_adaptive", "dpmpp_2s_ancestral", "dpmpp_sde", "dpmpp_sde_gpu", - "dpmpp_2m", "dpmpp_2m_sde", "dpmpp_2m_sde_gpu", "dpmpp_3m_sde", "dpmpp_3m_sde_gpu", "ddpm", "lcm"] + "dpmpp_2m", "dpmpp_2m_sde", "dpmpp_2m_sde_gpu", "dpmpp_3m_sde", "dpmpp_3m_sde_gpu", "ddpm", "lcm", + "ipndm"] class KSAMPLER(Sampler): def __init__(self, sampler_function, extra_options={}, inpaint_options={}): From eee815ec99c8ff69d9b31b9eba096442119cb3f8 Mon Sep 17 00:00:00 2001 From: Mario Klingemann Date: Wed, 19 Jun 2024 22:42:41 +0200 Subject: [PATCH 008/123] Update sd1_clip.py (#3684) Made token instance check more flexible so it also works with integers from numpy arrays or long tensors --- comfy/sd1_clip.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/comfy/sd1_clip.py b/comfy/sd1_clip.py index 911af0a7e..78e556b56 100644 --- a/comfy/sd1_clip.py +++ b/comfy/sd1_clip.py @@ -9,6 +9,7 @@ from . import model_management import comfy.clip_model import json import logging +import numbers def gen_empty_tokens(special_tokens, length): start_token = special_tokens.get("start", None) @@ -130,10 +131,10 @@ class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder): for x in tokens: tokens_temp = [] for y in x: - if isinstance(y, int): + if isinstance(y, numbers.Integral): if y == token_dict_size: #EOS token y = -1 - tokens_temp += [y] + tokens_temp += [int(y)] else: if y.shape[0] == current_embeds.weight.shape[1]: embedding_weights += [y] From b08a9dd04b725b46d0fabc4a48b4ddd659677267 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 19 Jun 2024 20:20:35 -0400 Subject: [PATCH 009/123] Remove empty line. --- comfy/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/comfy/utils.py b/comfy/utils.py index 0d24fe730..877f14b01 100644 --- a/comfy/utils.py +++ b/comfy/utils.py @@ -286,7 +286,6 @@ MMDIT_MAP_BLOCK = { ("x_block.mlp.fc1.weight", "ff.net.0.proj.weight"), ("x_block.mlp.fc2.bias", "ff.net.2.bias"), ("x_block.mlp.fc2.weight", "ff.net.2.weight"), - ("", ""), } def mmdit_to_diffusers(mmdit_config, output_prefix=""): From 0d6a57938e4fdb5b22b473dfe5a71af8150009e6 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 19 Jun 2024 21:46:37 -0400 Subject: [PATCH 010/123] Support loading diffusers SD3 model format with UNETLoader node. --- comfy/model_detection.py | 37 +++++++++++++++++++ comfy/sd.py | 9 ++++- comfy/utils.py | 20 ++++++++-- .../nodes_model_merging_model_specific.py | 23 ++++++++++++ 4 files changed, 84 insertions(+), 5 deletions(-) diff --git a/comfy/model_detection.py b/comfy/model_detection.py index 4843e6a4a..e09dd381a 100644 --- a/comfy/model_detection.py +++ b/comfy/model_detection.py @@ -1,7 +1,9 @@ import comfy.supported_models import comfy.supported_models_base +import comfy.utils import math import logging +import torch def count_blocks(state_dict_keys, prefix_string): count = 0 @@ -431,3 +433,38 @@ def model_config_from_diffusers_unet(state_dict): if unet_config is not None: return model_config_from_unet_config(unet_config) return None + +def convert_diffusers_mmdit(state_dict, output_prefix=""): + depth = count_blocks(state_dict, 'transformer_blocks.{}.') + if depth > 0: + out_sd = {} + sd_map = comfy.utils.mmdit_to_diffusers({"depth": depth}, output_prefix=output_prefix) + for k in sd_map: + weight = state_dict.get(k, None) + if weight is not None: + t = sd_map[k] + + if not isinstance(t, str): + if len(t) > 2: + fun = t[2] + else: + fun = lambda a: a + offset = t[1] + if offset is not None: + old_weight = out_sd.get(t[0], None) + if old_weight is None: + old_weight = torch.empty_like(weight) + old_weight = old_weight.repeat([3] + [1] * (len(old_weight.shape) - 1)) + + w = old_weight.narrow(offset[0], offset[1], offset[2]) + else: + old_weight = weight + w = weight + w[:] = fun(weight) + t = t[0] + out_sd[t] = old_weight + else: + out_sd[t] = weight + state_dict.pop(k) + + return out_sd diff --git a/comfy/sd.py b/comfy/sd.py index cfbf8fa4d..178f52e8b 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -568,7 +568,14 @@ def load_unet_state_dict(sd): #load unet in diffusers format unet_dtype = model_management.unet_dtype(model_params=parameters) load_device = model_management.get_torch_device() - if "input_blocks.0.0.weight" in sd or 'clf.1.weight' in sd: #ldm or stable cascade + if 'transformer_blocks.0.attn.add_q_proj.weight' in sd: #MMDIT SD3 + new_sd = model_detection.convert_diffusers_mmdit(sd, "") + if new_sd is None: + return None + model_config = model_detection.model_config_from_unet(new_sd, "") + if model_config is None: + return None + elif "input_blocks.0.0.weight" in sd or 'clf.1.weight' in sd: #ldm or stable cascade model_config = model_detection.model_config_from_unet(sd, "") if model_config is None: return None diff --git a/comfy/utils.py b/comfy/utils.py index 877f14b01..f0d675004 100644 --- a/comfy/utils.py +++ b/comfy/utils.py @@ -249,6 +249,11 @@ def unet_to_diffusers(unet_config): return diffusers_unet_map +def swap_scale_shift(weight): + shift, scale = weight.chunk(2, dim=0) + new_weight = torch.cat([scale, shift], dim=0) + return new_weight + MMDIT_MAP_BASIC = { ("context_embedder.bias", "context_embedder.bias"), ("context_embedder.weight", "context_embedder.weight"), @@ -263,8 +268,8 @@ MMDIT_MAP_BASIC = { ("y_embedder.mlp.2.bias", "time_text_embed.text_embedder.linear_2.bias"), ("y_embedder.mlp.2.weight", "time_text_embed.text_embedder.linear_2.weight"), ("pos_embed", "pos_embed.pos_embed"), - ("final_layer.adaLN_modulation.1.bias", "norm_out.linear.bias"), - ("final_layer.adaLN_modulation.1.weight", "norm_out.linear.weight"), + ("final_layer.adaLN_modulation.1.bias", "norm_out.linear.bias", swap_scale_shift), + ("final_layer.adaLN_modulation.1.weight", "norm_out.linear.weight", swap_scale_shift), ("final_layer.linear.bias", "proj_out.bias"), ("final_layer.linear.weight", "proj_out.weight"), } @@ -313,8 +318,15 @@ def mmdit_to_diffusers(mmdit_config, output_prefix=""): for k in MMDIT_MAP_BLOCK: key_map["{}.{}".format(block_from, k[1])] = "{}.{}".format(block_to, k[0]) - for k in MMDIT_MAP_BASIC: - key_map[k[1]] = "{}{}".format(output_prefix, k[0]) + map_basic = MMDIT_MAP_BASIC.copy() + map_basic.add(("joint_blocks.{}.context_block.adaLN_modulation.1.bias".format(depth - 1), "transformer_blocks.{}.norm1_context.linear.bias".format(depth - 1), swap_scale_shift)) + map_basic.add(("joint_blocks.{}.context_block.adaLN_modulation.1.weight".format(depth - 1), "transformer_blocks.{}.norm1_context.linear.weight".format(depth - 1), swap_scale_shift)) + + for k in map_basic: + if len(k) > 2: + key_map[k[1]] = ("{}{}".format(output_prefix, k[0]), None, k[2]) + else: + key_map[k[1]] = "{}{}".format(output_prefix, k[0]) return key_map diff --git a/comfy_extras/nodes_model_merging_model_specific.py b/comfy_extras/nodes_model_merging_model_specific.py index f2d008d8b..74ab6814c 100644 --- a/comfy_extras/nodes_model_merging_model_specific.py +++ b/comfy_extras/nodes_model_merging_model_specific.py @@ -52,9 +52,32 @@ class ModelMergeSDXL(comfy_extras.nodes_model_merging.ModelMergeBlocks): return {"required": arg_dict} +class ModelMergeSD3(comfy_extras.nodes_model_merging.ModelMergeBlocks): + CATEGORY = "advanced/model_merging/model_specific" + + @classmethod + def INPUT_TYPES(s): + arg_dict = { "model1": ("MODEL",), + "model2": ("MODEL",)} + + argument = ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}) + + arg_dict["pos_embed."] = argument + arg_dict["x_embedder."] = argument + arg_dict["context_embedder."] = argument + arg_dict["y_embedder."] = argument + arg_dict["t_embedder."] = argument + + for i in range(38): + arg_dict["joint_blocks.{}.".format(i)] = argument + + arg_dict["final_layer."] = argument + + return {"required": arg_dict} NODE_CLASS_MAPPINGS = { "ModelMergeSD1": ModelMergeSD1, "ModelMergeSD2": ModelMergeSD1, #SD1 and SD2 have the same blocks "ModelMergeSDXL": ModelMergeSDXL, + "ModelMergeSD3": ModelMergeSD3, } From 028a583befa6dab7d60a10d780474f58e945bc05 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 19 Jun 2024 22:32:04 -0400 Subject: [PATCH 011/123] Fix issue with full diffusers SD3 loras. --- comfy/model_patcher.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/comfy/model_patcher.py b/comfy/model_patcher.py index 44b82795f..bf8787768 100644 --- a/comfy/model_patcher.py +++ b/comfy/model_patcher.py @@ -210,16 +210,19 @@ class ModelPatcher: model_sd = self.model.state_dict() for k in patches: offset = None + function = None if isinstance(k, str): key = k else: offset = k[1] key = k[0] + if len(k) > 2: + function = k[2] if key in model_sd: p.add(k) current_patches = self.patches.get(key, []) - current_patches.append((strength_patch, patches[k], strength_model, offset)) + current_patches.append((strength_patch, patches[k], strength_model, offset, function)) self.patches[key] = current_patches self.patches_uuid = uuid.uuid4() @@ -347,6 +350,9 @@ class ModelPatcher: v = p[1] strength_model = p[2] offset = p[3] + function = p[4] + if function is None: + function = lambda a: a old_weight = None if offset is not None: @@ -371,7 +377,7 @@ class ModelPatcher: if w1.shape != weight.shape: logging.warning("WARNING SHAPE MISMATCH {} WEIGHT NOT MERGED {} != {}".format(key, w1.shape, weight.shape)) else: - weight += strength * comfy.model_management.cast_to_device(w1, weight.device, weight.dtype) + weight += function(strength * comfy.model_management.cast_to_device(w1, weight.device, weight.dtype)) elif patch_type == "lora": #lora/locon mat1 = comfy.model_management.cast_to_device(v[0], weight.device, torch.float32) mat2 = comfy.model_management.cast_to_device(v[1], weight.device, torch.float32) @@ -389,9 +395,9 @@ class ModelPatcher: try: lora_diff = torch.mm(mat1.flatten(start_dim=1), mat2.flatten(start_dim=1)).reshape(weight.shape) if dora_scale is not None: - weight = weight_decompose(dora_scale, weight, lora_diff, alpha, strength) + weight = function(weight_decompose(dora_scale, weight, lora_diff, alpha, strength)) else: - weight += ((strength * alpha) * lora_diff).type(weight.dtype) + weight += function(((strength * alpha) * lora_diff).type(weight.dtype)) except Exception as e: logging.error("ERROR {} {} {}".format(patch_type, key, e)) elif patch_type == "lokr": @@ -435,9 +441,9 @@ class ModelPatcher: try: lora_diff = torch.kron(w1, w2).reshape(weight.shape) if dora_scale is not None: - weight = weight_decompose(dora_scale, weight, lora_diff, alpha, strength) + weight = function(weight_decompose(dora_scale, weight, lora_diff, alpha, strength)) else: - weight += ((strength * alpha) * lora_diff).type(weight.dtype) + weight += function(((strength * alpha) * lora_diff).type(weight.dtype)) except Exception as e: logging.error("ERROR {} {} {}".format(patch_type, key, e)) elif patch_type == "loha": @@ -472,9 +478,9 @@ class ModelPatcher: try: lora_diff = (m1 * m2).reshape(weight.shape) if dora_scale is not None: - weight = weight_decompose(dora_scale, weight, lora_diff, alpha, strength) + weight = function(weight_decompose(dora_scale, weight, lora_diff, alpha, strength)) else: - weight += ((strength * alpha) * lora_diff).type(weight.dtype) + weight += function(((strength * alpha) * lora_diff).type(weight.dtype)) except Exception as e: logging.error("ERROR {} {} {}".format(patch_type, key, e)) elif patch_type == "glora": @@ -493,9 +499,9 @@ class ModelPatcher: try: lora_diff = (torch.mm(b2, b1) + torch.mm(torch.mm(weight.flatten(start_dim=1), a2), a1)).reshape(weight.shape) if dora_scale is not None: - weight = weight_decompose(dora_scale, weight, lora_diff, alpha, strength) + weight = function(weight_decompose(dora_scale, weight, lora_diff, alpha, strength)) else: - weight += ((strength * alpha) * lora_diff).type(weight.dtype) + weight += function(((strength * alpha) * lora_diff).type(weight.dtype)) except Exception as e: logging.error("ERROR {} {} {}".format(patch_type, key, e)) else: From d7f0964266170d1070eac9823bbb340e89371282 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Wed, 19 Jun 2024 22:36:31 -0400 Subject: [PATCH 012/123] Fix routes (#3790) --- server.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server.py b/server.py index 590902587..30ea90c6c 100644 --- a/server.py +++ b/server.py @@ -538,8 +538,10 @@ class PromptServer(): # prefix are supported. api_routes = web.RouteTableDef() for route in self.routes: - assert isinstance(route, web.RouteDef) - api_routes.route(route.method, "/api" + route.path)(route.handler, **route.kwargs) + # Custom nodes might add extra static routes. Only process non-static + # routes to add /api prefix. + if isinstance(route, web.RouteDef): + api_routes.route(route.method, "/api" + route.path)(route.handler, **route.kwargs) self.app.add_routes(api_routes) self.app.add_routes(self.routes) From 45e10cac19de5c819674ef3df39bd22fe1397ef9 Mon Sep 17 00:00:00 2001 From: Zhenyu Zhou <79033747+zhyzhouu@users.noreply.github.com> Date: Thu, 20 Jun 2024 20:12:15 +0800 Subject: [PATCH 013/123] feat: add gits scheduler (#3769) --- comfy_extras/nodes_gits.py | 369 +++++++++++++++++++++++++++++++++++++ nodes.py | 1 + 2 files changed, 370 insertions(+) create mode 100644 comfy_extras/nodes_gits.py diff --git a/comfy_extras/nodes_gits.py b/comfy_extras/nodes_gits.py new file mode 100644 index 000000000..7bfae4ce6 --- /dev/null +++ b/comfy_extras/nodes_gits.py @@ -0,0 +1,369 @@ +# from https://github.com/zju-pi/diff-sampler/tree/main/gits-main +import numpy as np +import torch + +def loglinear_interp(t_steps, num_steps): + """ + Performs log-linear interpolation of a given array of decreasing numbers. + """ + xs = np.linspace(0, 1, len(t_steps)) + ys = np.log(t_steps[::-1]) + + new_xs = np.linspace(0, 1, num_steps) + new_ys = np.interp(new_xs, xs, ys) + + interped_ys = np.exp(new_ys)[::-1].copy() + return interped_ys + +NOISE_LEVELS = { + 0.80: [ + [14.61464119, 7.49001646, 0.02916753], + [14.61464119, 11.54541874, 6.77309084, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 3.07277966, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.85520077, 2.05039096, 0.02916753], + [14.61464119, 12.2308979, 8.75849152, 7.49001646, 5.85520077, 2.05039096, 0.02916753], + [14.61464119, 12.2308979, 8.75849152, 7.49001646, 5.85520077, 3.07277966, 1.56271636, 0.02916753], + [14.61464119, 12.96784878, 11.54541874, 8.75849152, 7.49001646, 5.85520077, 3.07277966, 1.56271636, 0.02916753], + [14.61464119, 13.76078796, 12.2308979, 10.90732002, 8.75849152, 7.49001646, 5.85520077, 3.07277966, 1.56271636, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 10.90732002, 8.75849152, 7.49001646, 5.85520077, 3.07277966, 1.56271636, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 10.90732002, 9.24142551, 8.30717278, 7.49001646, 5.85520077, 3.07277966, 1.56271636, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 10.90732002, 9.24142551, 8.30717278, 7.49001646, 6.14220476, 4.86714602, 3.07277966, 1.56271636, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.31284904, 9.24142551, 8.30717278, 7.49001646, 6.14220476, 4.86714602, 3.07277966, 1.56271636, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.90732002, 10.31284904, 9.24142551, 8.30717278, 7.49001646, 6.14220476, 4.86714602, 3.07277966, 1.56271636, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.90732002, 10.31284904, 9.24142551, 8.75849152, 8.30717278, 7.49001646, 6.14220476, 4.86714602, 3.07277966, 1.56271636, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.90732002, 10.31284904, 9.24142551, 8.75849152, 8.30717278, 7.49001646, 6.14220476, 4.86714602, 3.1956799, 1.98035145, 0.86115354, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.90732002, 10.31284904, 9.75859547, 9.24142551, 8.75849152, 8.30717278, 7.49001646, 6.14220476, 4.86714602, 3.1956799, 1.98035145, 0.86115354, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.90732002, 10.31284904, 9.75859547, 9.24142551, 8.75849152, 8.30717278, 7.49001646, 6.77309084, 5.85520077, 4.65472794, 3.07277966, 1.84880662, 0.83188516, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.90732002, 10.31284904, 9.75859547, 9.24142551, 8.75849152, 8.30717278, 7.88507891, 7.49001646, 6.77309084, 5.85520077, 4.65472794, 3.07277966, 1.84880662, 0.83188516, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.90732002, 10.31284904, 9.75859547, 9.24142551, 8.75849152, 8.30717278, 7.88507891, 7.49001646, 6.77309084, 5.85520077, 4.86714602, 3.75677586, 2.84484982, 1.78698075, 0.803307, 0.02916753], + ], + 0.85: [ + [14.61464119, 7.49001646, 0.02916753], + [14.61464119, 7.49001646, 1.84880662, 0.02916753], + [14.61464119, 11.54541874, 6.77309084, 1.56271636, 0.02916753], + [14.61464119, 11.54541874, 7.11996698, 3.07277966, 1.24153244, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.09240818, 2.84484982, 0.95350921, 0.02916753], + [14.61464119, 12.2308979, 8.75849152, 7.49001646, 5.09240818, 2.84484982, 0.95350921, 0.02916753], + [14.61464119, 12.2308979, 8.75849152, 7.49001646, 5.58536053, 3.1956799, 1.84880662, 0.803307, 0.02916753], + [14.61464119, 12.96784878, 11.54541874, 8.75849152, 7.49001646, 5.58536053, 3.1956799, 1.84880662, 0.803307, 0.02916753], + [14.61464119, 12.96784878, 11.54541874, 8.75849152, 7.49001646, 6.14220476, 4.65472794, 3.07277966, 1.84880662, 0.803307, 0.02916753], + [14.61464119, 13.76078796, 12.2308979, 10.90732002, 8.75849152, 7.49001646, 6.14220476, 4.65472794, 3.07277966, 1.84880662, 0.803307, 0.02916753], + [14.61464119, 13.76078796, 12.2308979, 10.90732002, 9.24142551, 8.30717278, 7.49001646, 6.14220476, 4.65472794, 3.07277966, 1.84880662, 0.803307, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 10.90732002, 9.24142551, 8.30717278, 7.49001646, 6.14220476, 4.65472794, 3.07277966, 1.84880662, 0.803307, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.31284904, 9.24142551, 8.30717278, 7.49001646, 6.14220476, 4.65472794, 3.07277966, 1.84880662, 0.803307, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.31284904, 9.24142551, 8.30717278, 7.49001646, 6.14220476, 4.86714602, 3.60512662, 2.6383388, 1.56271636, 0.72133851, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.31284904, 9.24142551, 8.30717278, 7.49001646, 6.77309084, 5.85520077, 4.65472794, 3.46139455, 2.45070267, 1.56271636, 0.72133851, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.31284904, 9.24142551, 8.75849152, 8.30717278, 7.49001646, 6.77309084, 5.85520077, 4.65472794, 3.46139455, 2.45070267, 1.56271636, 0.72133851, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.90732002, 10.31284904, 9.24142551, 8.75849152, 8.30717278, 7.49001646, 6.77309084, 5.85520077, 4.65472794, 3.46139455, 2.45070267, 1.56271636, 0.72133851, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.90732002, 10.31284904, 9.75859547, 9.24142551, 8.75849152, 8.30717278, 7.49001646, 6.77309084, 5.85520077, 4.65472794, 3.46139455, 2.45070267, 1.56271636, 0.72133851, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.90732002, 10.31284904, 9.75859547, 9.24142551, 8.75849152, 8.30717278, 7.88507891, 7.49001646, 6.77309084, 5.85520077, 4.65472794, 3.46139455, 2.45070267, 1.56271636, 0.72133851, 0.02916753], + ], + 0.90: [ + [14.61464119, 6.77309084, 0.02916753], + [14.61464119, 7.49001646, 1.56271636, 0.02916753], + [14.61464119, 7.49001646, 3.07277966, 0.95350921, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 2.54230714, 0.89115214, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 4.86714602, 2.54230714, 0.89115214, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.09240818, 3.07277966, 1.61558151, 0.69515091, 0.02916753], + [14.61464119, 12.2308979, 8.75849152, 7.11996698, 4.86714602, 3.07277966, 1.61558151, 0.69515091, 0.02916753], + [14.61464119, 12.2308979, 8.75849152, 7.49001646, 5.85520077, 4.45427561, 2.95596409, 1.61558151, 0.69515091, 0.02916753], + [14.61464119, 12.2308979, 8.75849152, 7.49001646, 5.85520077, 4.45427561, 3.1956799, 2.19988537, 1.24153244, 0.57119018, 0.02916753], + [14.61464119, 12.96784878, 10.90732002, 8.75849152, 7.49001646, 5.85520077, 4.45427561, 3.1956799, 2.19988537, 1.24153244, 0.57119018, 0.02916753], + [14.61464119, 12.96784878, 11.54541874, 9.24142551, 8.30717278, 7.49001646, 5.85520077, 4.45427561, 3.1956799, 2.19988537, 1.24153244, 0.57119018, 0.02916753], + [14.61464119, 12.96784878, 11.54541874, 9.24142551, 8.30717278, 7.49001646, 6.14220476, 4.86714602, 3.75677586, 2.84484982, 1.84880662, 1.08895338, 0.52423614, 0.02916753], + [14.61464119, 13.76078796, 12.2308979, 10.90732002, 9.24142551, 8.30717278, 7.49001646, 6.14220476, 4.86714602, 3.75677586, 2.84484982, 1.84880662, 1.08895338, 0.52423614, 0.02916753], + [14.61464119, 13.76078796, 12.2308979, 10.90732002, 9.24142551, 8.30717278, 7.49001646, 6.44769001, 5.58536053, 4.45427561, 3.32507086, 2.45070267, 1.61558151, 0.95350921, 0.45573691, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 10.90732002, 9.24142551, 8.30717278, 7.49001646, 6.44769001, 5.58536053, 4.45427561, 3.32507086, 2.45070267, 1.61558151, 0.95350921, 0.45573691, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 10.90732002, 9.24142551, 8.30717278, 7.49001646, 6.77309084, 5.85520077, 4.86714602, 3.91689563, 3.07277966, 2.27973175, 1.56271636, 0.95350921, 0.45573691, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.31284904, 9.24142551, 8.30717278, 7.49001646, 6.77309084, 5.85520077, 4.86714602, 3.91689563, 3.07277966, 2.27973175, 1.56271636, 0.95350921, 0.45573691, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.31284904, 9.24142551, 8.75849152, 8.30717278, 7.49001646, 6.77309084, 5.85520077, 4.86714602, 3.91689563, 3.07277966, 2.27973175, 1.56271636, 0.95350921, 0.45573691, 0.02916753], + [14.61464119, 13.76078796, 12.96784878, 12.2308979, 11.54541874, 10.31284904, 9.24142551, 8.75849152, 8.30717278, 7.49001646, 6.77309084, 5.85520077, 5.09240818, 4.45427561, 3.60512662, 2.95596409, 2.19988537, 1.51179266, 0.89115214, 0.43325692, 0.02916753], + ], + 0.95: [ + [14.61464119, 6.77309084, 0.02916753], + [14.61464119, 6.77309084, 1.56271636, 0.02916753], + [14.61464119, 7.49001646, 2.84484982, 0.89115214, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 2.36326075, 0.803307, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 2.95596409, 1.56271636, 0.64427125, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 4.86714602, 2.95596409, 1.56271636, 0.64427125, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 4.86714602, 3.07277966, 1.91321158, 1.08895338, 0.50118381, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.85520077, 4.45427561, 3.07277966, 1.91321158, 1.08895338, 0.50118381, 0.02916753], + [14.61464119, 12.2308979, 8.75849152, 7.49001646, 5.85520077, 4.45427561, 3.07277966, 1.91321158, 1.08895338, 0.50118381, 0.02916753], + [14.61464119, 12.2308979, 8.75849152, 7.49001646, 5.85520077, 4.45427561, 3.1956799, 2.19988537, 1.41535246, 0.803307, 0.38853383, 0.02916753], + [14.61464119, 12.2308979, 8.75849152, 7.49001646, 5.85520077, 4.65472794, 3.46139455, 2.6383388, 1.84880662, 1.24153244, 0.72133851, 0.34370604, 0.02916753], + [14.61464119, 12.96784878, 10.90732002, 8.75849152, 7.49001646, 5.85520077, 4.65472794, 3.46139455, 2.6383388, 1.84880662, 1.24153244, 0.72133851, 0.34370604, 0.02916753], + [14.61464119, 12.96784878, 10.90732002, 8.75849152, 7.49001646, 6.14220476, 4.86714602, 3.75677586, 2.95596409, 2.19988537, 1.56271636, 1.05362725, 0.64427125, 0.32104823, 0.02916753], + [14.61464119, 12.96784878, 10.90732002, 8.75849152, 7.49001646, 6.44769001, 5.58536053, 4.65472794, 3.60512662, 2.95596409, 2.19988537, 1.56271636, 1.05362725, 0.64427125, 0.32104823, 0.02916753], + [14.61464119, 12.96784878, 11.54541874, 9.24142551, 8.30717278, 7.49001646, 6.44769001, 5.58536053, 4.65472794, 3.60512662, 2.95596409, 2.19988537, 1.56271636, 1.05362725, 0.64427125, 0.32104823, 0.02916753], + [14.61464119, 12.96784878, 11.54541874, 9.24142551, 8.30717278, 7.49001646, 6.44769001, 5.58536053, 4.65472794, 3.75677586, 3.07277966, 2.45070267, 1.78698075, 1.24153244, 0.83188516, 0.50118381, 0.22545385, 0.02916753], + [14.61464119, 12.96784878, 11.54541874, 9.24142551, 8.30717278, 7.49001646, 6.77309084, 5.85520077, 5.09240818, 4.45427561, 3.60512662, 2.95596409, 2.36326075, 1.72759056, 1.24153244, 0.83188516, 0.50118381, 0.22545385, 0.02916753], + [14.61464119, 13.76078796, 12.2308979, 10.90732002, 9.24142551, 8.30717278, 7.49001646, 6.77309084, 5.85520077, 5.09240818, 4.45427561, 3.60512662, 2.95596409, 2.36326075, 1.72759056, 1.24153244, 0.83188516, 0.50118381, 0.22545385, 0.02916753], + [14.61464119, 13.76078796, 12.2308979, 10.90732002, 9.24142551, 8.30717278, 7.49001646, 6.77309084, 5.85520077, 5.09240818, 4.45427561, 3.75677586, 3.07277966, 2.45070267, 1.91321158, 1.46270394, 1.05362725, 0.72133851, 0.43325692, 0.19894916, 0.02916753], + ], + 1.00: [ + [14.61464119, 1.56271636, 0.02916753], + [14.61464119, 6.77309084, 0.95350921, 0.02916753], + [14.61464119, 6.77309084, 2.36326075, 0.803307, 0.02916753], + [14.61464119, 7.11996698, 3.07277966, 1.56271636, 0.59516323, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 2.84484982, 1.41535246, 0.57119018, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 2.84484982, 1.61558151, 0.86115354, 0.38853383, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 4.86714602, 2.84484982, 1.61558151, 0.86115354, 0.38853383, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 4.86714602, 3.07277966, 1.98035145, 1.24153244, 0.72133851, 0.34370604, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.85520077, 4.45427561, 3.07277966, 1.98035145, 1.24153244, 0.72133851, 0.34370604, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.85520077, 4.45427561, 3.1956799, 2.27973175, 1.51179266, 0.95350921, 0.54755926, 0.25053367, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.85520077, 4.45427561, 3.1956799, 2.36326075, 1.61558151, 1.08895338, 0.72133851, 0.41087446, 0.17026083, 0.02916753], + [14.61464119, 11.54541874, 8.75849152, 7.49001646, 5.85520077, 4.45427561, 3.1956799, 2.36326075, 1.61558151, 1.08895338, 0.72133851, 0.41087446, 0.17026083, 0.02916753], + [14.61464119, 11.54541874, 8.75849152, 7.49001646, 5.85520077, 4.65472794, 3.60512662, 2.84484982, 2.12350607, 1.56271636, 1.08895338, 0.72133851, 0.41087446, 0.17026083, 0.02916753], + [14.61464119, 11.54541874, 8.75849152, 7.49001646, 5.85520077, 4.65472794, 3.60512662, 2.84484982, 2.19988537, 1.61558151, 1.162866, 0.803307, 0.50118381, 0.27464288, 0.09824532, 0.02916753], + [14.61464119, 11.54541874, 8.75849152, 7.49001646, 5.85520077, 4.65472794, 3.75677586, 3.07277966, 2.45070267, 1.84880662, 1.36964464, 1.01931262, 0.72133851, 0.45573691, 0.25053367, 0.09824532, 0.02916753], + [14.61464119, 11.54541874, 8.75849152, 7.49001646, 6.14220476, 5.09240818, 4.26497746, 3.46139455, 2.84484982, 2.19988537, 1.67050016, 1.24153244, 0.92192322, 0.64427125, 0.43325692, 0.25053367, 0.09824532, 0.02916753], + [14.61464119, 11.54541874, 8.75849152, 7.49001646, 6.14220476, 5.09240818, 4.26497746, 3.60512662, 2.95596409, 2.45070267, 1.91321158, 1.51179266, 1.12534678, 0.83188516, 0.59516323, 0.38853383, 0.22545385, 0.09824532, 0.02916753], + [14.61464119, 12.2308979, 9.24142551, 8.30717278, 7.49001646, 6.14220476, 5.09240818, 4.26497746, 3.60512662, 2.95596409, 2.45070267, 1.91321158, 1.51179266, 1.12534678, 0.83188516, 0.59516323, 0.38853383, 0.22545385, 0.09824532, 0.02916753], + [14.61464119, 12.2308979, 9.24142551, 8.30717278, 7.49001646, 6.77309084, 5.85520077, 5.09240818, 4.26497746, 3.60512662, 2.95596409, 2.45070267, 1.91321158, 1.51179266, 1.12534678, 0.83188516, 0.59516323, 0.38853383, 0.22545385, 0.09824532, 0.02916753], + ], + 1.05: [ + [14.61464119, 0.95350921, 0.02916753], + [14.61464119, 6.77309084, 0.89115214, 0.02916753], + [14.61464119, 6.77309084, 2.05039096, 0.72133851, 0.02916753], + [14.61464119, 6.77309084, 2.84484982, 1.28281462, 0.52423614, 0.02916753], + [14.61464119, 6.77309084, 3.07277966, 1.61558151, 0.803307, 0.34370604, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 2.84484982, 1.56271636, 0.803307, 0.34370604, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 2.84484982, 1.61558151, 0.95350921, 0.52423614, 0.22545385, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 3.07277966, 1.98035145, 1.24153244, 0.74807048, 0.41087446, 0.17026083, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 3.1956799, 2.27973175, 1.51179266, 0.95350921, 0.59516323, 0.34370604, 0.13792117, 0.02916753], + [14.61464119, 7.49001646, 5.09240818, 3.46139455, 2.45070267, 1.61558151, 1.08895338, 0.72133851, 0.45573691, 0.25053367, 0.09824532, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.09240818, 3.46139455, 2.45070267, 1.61558151, 1.08895338, 0.72133851, 0.45573691, 0.25053367, 0.09824532, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.85520077, 4.45427561, 3.1956799, 2.36326075, 1.61558151, 1.08895338, 0.72133851, 0.45573691, 0.25053367, 0.09824532, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.85520077, 4.45427561, 3.1956799, 2.45070267, 1.72759056, 1.24153244, 0.86115354, 0.59516323, 0.38853383, 0.22545385, 0.09824532, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.85520077, 4.65472794, 3.60512662, 2.84484982, 2.19988537, 1.61558151, 1.162866, 0.83188516, 0.59516323, 0.38853383, 0.22545385, 0.09824532, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.85520077, 4.65472794, 3.60512662, 2.84484982, 2.19988537, 1.67050016, 1.28281462, 0.95350921, 0.72133851, 0.52423614, 0.34370604, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.85520077, 4.65472794, 3.60512662, 2.95596409, 2.36326075, 1.84880662, 1.41535246, 1.08895338, 0.83188516, 0.61951244, 0.45573691, 0.32104823, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.85520077, 4.65472794, 3.60512662, 2.95596409, 2.45070267, 1.91321158, 1.51179266, 1.20157266, 0.95350921, 0.74807048, 0.57119018, 0.43325692, 0.29807833, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 11.54541874, 8.30717278, 7.11996698, 5.85520077, 4.65472794, 3.60512662, 2.95596409, 2.45070267, 1.91321158, 1.51179266, 1.20157266, 0.95350921, 0.74807048, 0.57119018, 0.43325692, 0.29807833, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 11.54541874, 8.30717278, 7.11996698, 5.85520077, 4.65472794, 3.60512662, 2.95596409, 2.45070267, 1.98035145, 1.61558151, 1.32549286, 1.08895338, 0.86115354, 0.69515091, 0.54755926, 0.41087446, 0.29807833, 0.19894916, 0.09824532, 0.02916753], + ], + 1.10: [ + [14.61464119, 0.89115214, 0.02916753], + [14.61464119, 2.36326075, 0.72133851, 0.02916753], + [14.61464119, 5.85520077, 1.61558151, 0.57119018, 0.02916753], + [14.61464119, 6.77309084, 2.45070267, 1.08895338, 0.45573691, 0.02916753], + [14.61464119, 6.77309084, 2.95596409, 1.56271636, 0.803307, 0.34370604, 0.02916753], + [14.61464119, 6.77309084, 3.07277966, 1.61558151, 0.89115214, 0.4783645, 0.19894916, 0.02916753], + [14.61464119, 6.77309084, 3.07277966, 1.84880662, 1.08895338, 0.64427125, 0.34370604, 0.13792117, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 2.84484982, 1.61558151, 0.95350921, 0.54755926, 0.27464288, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 2.95596409, 1.91321158, 1.24153244, 0.803307, 0.4783645, 0.25053367, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 3.07277966, 2.05039096, 1.41535246, 0.95350921, 0.64427125, 0.41087446, 0.22545385, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 3.1956799, 2.27973175, 1.61558151, 1.12534678, 0.803307, 0.54755926, 0.36617002, 0.22545385, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 3.32507086, 2.45070267, 1.72759056, 1.24153244, 0.89115214, 0.64427125, 0.45573691, 0.32104823, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 5.09240818, 3.60512662, 2.84484982, 2.05039096, 1.51179266, 1.08895338, 0.803307, 0.59516323, 0.43325692, 0.29807833, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 5.09240818, 3.60512662, 2.84484982, 2.12350607, 1.61558151, 1.24153244, 0.95350921, 0.72133851, 0.54755926, 0.41087446, 0.29807833, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 5.85520077, 4.45427561, 3.1956799, 2.45070267, 1.84880662, 1.41535246, 1.08895338, 0.83188516, 0.64427125, 0.50118381, 0.36617002, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 5.85520077, 4.45427561, 3.1956799, 2.45070267, 1.91321158, 1.51179266, 1.20157266, 0.95350921, 0.74807048, 0.59516323, 0.45573691, 0.34370604, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 5.85520077, 4.45427561, 3.46139455, 2.84484982, 2.19988537, 1.72759056, 1.36964464, 1.08895338, 0.86115354, 0.69515091, 0.54755926, 0.43325692, 0.34370604, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.85520077, 4.45427561, 3.46139455, 2.84484982, 2.19988537, 1.72759056, 1.36964464, 1.08895338, 0.86115354, 0.69515091, 0.54755926, 0.43325692, 0.34370604, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 11.54541874, 7.49001646, 5.85520077, 4.45427561, 3.46139455, 2.84484982, 2.19988537, 1.72759056, 1.36964464, 1.08895338, 0.89115214, 0.72133851, 0.59516323, 0.4783645, 0.38853383, 0.29807833, 0.22545385, 0.17026083, 0.09824532, 0.02916753], + ], + 1.15: [ + [14.61464119, 0.83188516, 0.02916753], + [14.61464119, 1.84880662, 0.59516323, 0.02916753], + [14.61464119, 5.85520077, 1.56271636, 0.52423614, 0.02916753], + [14.61464119, 5.85520077, 1.91321158, 0.83188516, 0.34370604, 0.02916753], + [14.61464119, 5.85520077, 2.45070267, 1.24153244, 0.59516323, 0.25053367, 0.02916753], + [14.61464119, 5.85520077, 2.84484982, 1.51179266, 0.803307, 0.41087446, 0.17026083, 0.02916753], + [14.61464119, 5.85520077, 2.84484982, 1.56271636, 0.89115214, 0.50118381, 0.25053367, 0.09824532, 0.02916753], + [14.61464119, 6.77309084, 3.07277966, 1.84880662, 1.12534678, 0.72133851, 0.43325692, 0.22545385, 0.09824532, 0.02916753], + [14.61464119, 6.77309084, 3.07277966, 1.91321158, 1.24153244, 0.803307, 0.52423614, 0.34370604, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 2.95596409, 1.91321158, 1.24153244, 0.803307, 0.52423614, 0.34370604, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 3.07277966, 2.05039096, 1.36964464, 0.95350921, 0.69515091, 0.4783645, 0.32104823, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 3.07277966, 2.12350607, 1.51179266, 1.08895338, 0.803307, 0.59516323, 0.43325692, 0.29807833, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 3.07277966, 2.12350607, 1.51179266, 1.08895338, 0.803307, 0.59516323, 0.45573691, 0.34370604, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 3.07277966, 2.19988537, 1.61558151, 1.24153244, 0.95350921, 0.74807048, 0.59516323, 0.45573691, 0.34370604, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 3.1956799, 2.45070267, 1.78698075, 1.32549286, 1.01931262, 0.803307, 0.64427125, 0.50118381, 0.38853383, 0.29807833, 0.22545385, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 3.1956799, 2.45070267, 1.78698075, 1.32549286, 1.01931262, 0.803307, 0.64427125, 0.52423614, 0.41087446, 0.32104823, 0.25053367, 0.19894916, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 3.1956799, 2.45070267, 1.84880662, 1.41535246, 1.12534678, 0.89115214, 0.72133851, 0.59516323, 0.4783645, 0.38853383, 0.32104823, 0.25053367, 0.19894916, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 3.1956799, 2.45070267, 1.84880662, 1.41535246, 1.12534678, 0.89115214, 0.72133851, 0.59516323, 0.50118381, 0.41087446, 0.34370604, 0.27464288, 0.22545385, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.86714602, 3.1956799, 2.45070267, 1.84880662, 1.41535246, 1.12534678, 0.89115214, 0.72133851, 0.59516323, 0.50118381, 0.41087446, 0.34370604, 0.29807833, 0.25053367, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + ], + 1.20: [ + [14.61464119, 0.803307, 0.02916753], + [14.61464119, 1.56271636, 0.52423614, 0.02916753], + [14.61464119, 2.36326075, 0.92192322, 0.36617002, 0.02916753], + [14.61464119, 2.84484982, 1.24153244, 0.59516323, 0.25053367, 0.02916753], + [14.61464119, 5.85520077, 2.05039096, 0.95350921, 0.45573691, 0.17026083, 0.02916753], + [14.61464119, 5.85520077, 2.45070267, 1.24153244, 0.64427125, 0.29807833, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.45070267, 1.36964464, 0.803307, 0.45573691, 0.25053367, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.84484982, 1.61558151, 0.95350921, 0.59516323, 0.36617002, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.84484982, 1.67050016, 1.08895338, 0.74807048, 0.50118381, 0.32104823, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.95596409, 1.84880662, 1.24153244, 0.83188516, 0.59516323, 0.41087446, 0.27464288, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 3.07277966, 1.98035145, 1.36964464, 0.95350921, 0.69515091, 0.50118381, 0.36617002, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 6.77309084, 3.46139455, 2.36326075, 1.56271636, 1.08895338, 0.803307, 0.59516323, 0.45573691, 0.34370604, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 6.77309084, 3.46139455, 2.45070267, 1.61558151, 1.162866, 0.86115354, 0.64427125, 0.50118381, 0.38853383, 0.29807833, 0.22545385, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.65472794, 3.07277966, 2.12350607, 1.51179266, 1.08895338, 0.83188516, 0.64427125, 0.50118381, 0.38853383, 0.29807833, 0.22545385, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.65472794, 3.07277966, 2.12350607, 1.51179266, 1.08895338, 0.83188516, 0.64427125, 0.50118381, 0.41087446, 0.32104823, 0.25053367, 0.19894916, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.65472794, 3.07277966, 2.12350607, 1.51179266, 1.08895338, 0.83188516, 0.64427125, 0.50118381, 0.41087446, 0.34370604, 0.27464288, 0.22545385, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.65472794, 3.07277966, 2.19988537, 1.61558151, 1.20157266, 0.92192322, 0.72133851, 0.57119018, 0.45573691, 0.36617002, 0.29807833, 0.25053367, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.65472794, 3.07277966, 2.19988537, 1.61558151, 1.24153244, 0.95350921, 0.74807048, 0.59516323, 0.4783645, 0.38853383, 0.32104823, 0.27464288, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 7.49001646, 4.65472794, 3.07277966, 2.19988537, 1.61558151, 1.24153244, 0.95350921, 0.74807048, 0.59516323, 0.50118381, 0.41087446, 0.34370604, 0.29807833, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + ], + 1.25: [ + [14.61464119, 0.72133851, 0.02916753], + [14.61464119, 1.56271636, 0.50118381, 0.02916753], + [14.61464119, 2.05039096, 0.803307, 0.32104823, 0.02916753], + [14.61464119, 2.36326075, 0.95350921, 0.43325692, 0.17026083, 0.02916753], + [14.61464119, 2.84484982, 1.24153244, 0.59516323, 0.27464288, 0.09824532, 0.02916753], + [14.61464119, 3.07277966, 1.51179266, 0.803307, 0.43325692, 0.22545385, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.36326075, 1.24153244, 0.72133851, 0.41087446, 0.22545385, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.45070267, 1.36964464, 0.83188516, 0.52423614, 0.34370604, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.84484982, 1.61558151, 0.98595673, 0.64427125, 0.43325692, 0.27464288, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.84484982, 1.67050016, 1.08895338, 0.74807048, 0.52423614, 0.36617002, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.84484982, 1.72759056, 1.162866, 0.803307, 0.59516323, 0.45573691, 0.34370604, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.95596409, 1.84880662, 1.24153244, 0.86115354, 0.64427125, 0.4783645, 0.36617002, 0.27464288, 0.19894916, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.95596409, 1.84880662, 1.28281462, 0.92192322, 0.69515091, 0.52423614, 0.41087446, 0.32104823, 0.25053367, 0.19894916, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.95596409, 1.91321158, 1.32549286, 0.95350921, 0.72133851, 0.54755926, 0.43325692, 0.34370604, 0.27464288, 0.22545385, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.95596409, 1.91321158, 1.32549286, 0.95350921, 0.72133851, 0.57119018, 0.45573691, 0.36617002, 0.29807833, 0.25053367, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.95596409, 1.91321158, 1.32549286, 0.95350921, 0.74807048, 0.59516323, 0.4783645, 0.38853383, 0.32104823, 0.27464288, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 3.07277966, 2.05039096, 1.41535246, 1.05362725, 0.803307, 0.61951244, 0.50118381, 0.41087446, 0.34370604, 0.29807833, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 3.07277966, 2.05039096, 1.41535246, 1.05362725, 0.803307, 0.64427125, 0.52423614, 0.43325692, 0.36617002, 0.32104823, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 3.07277966, 2.05039096, 1.46270394, 1.08895338, 0.83188516, 0.66947293, 0.54755926, 0.45573691, 0.38853383, 0.34370604, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + ], + 1.30: [ + [14.61464119, 0.72133851, 0.02916753], + [14.61464119, 1.24153244, 0.43325692, 0.02916753], + [14.61464119, 1.56271636, 0.59516323, 0.22545385, 0.02916753], + [14.61464119, 1.84880662, 0.803307, 0.36617002, 0.13792117, 0.02916753], + [14.61464119, 2.36326075, 1.01931262, 0.52423614, 0.25053367, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.36964464, 0.74807048, 0.41087446, 0.22545385, 0.09824532, 0.02916753], + [14.61464119, 3.07277966, 1.56271636, 0.89115214, 0.54755926, 0.34370604, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 3.07277966, 1.61558151, 0.95350921, 0.61951244, 0.41087446, 0.27464288, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.45070267, 1.36964464, 0.83188516, 0.54755926, 0.36617002, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.45070267, 1.41535246, 0.92192322, 0.64427125, 0.45573691, 0.34370604, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.6383388, 1.56271636, 1.01931262, 0.72133851, 0.50118381, 0.36617002, 0.27464288, 0.19894916, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.84484982, 1.61558151, 1.05362725, 0.74807048, 0.54755926, 0.41087446, 0.32104823, 0.25053367, 0.19894916, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.84484982, 1.61558151, 1.08895338, 0.77538133, 0.57119018, 0.43325692, 0.34370604, 0.27464288, 0.22545385, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.84484982, 1.61558151, 1.08895338, 0.803307, 0.59516323, 0.45573691, 0.36617002, 0.29807833, 0.25053367, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.84484982, 1.61558151, 1.08895338, 0.803307, 0.59516323, 0.4783645, 0.38853383, 0.32104823, 0.27464288, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.84484982, 1.72759056, 1.162866, 0.83188516, 0.64427125, 0.50118381, 0.41087446, 0.34370604, 0.29807833, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.84484982, 1.72759056, 1.162866, 0.83188516, 0.64427125, 0.52423614, 0.43325692, 0.36617002, 0.32104823, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.84484982, 1.78698075, 1.24153244, 0.92192322, 0.72133851, 0.57119018, 0.45573691, 0.38853383, 0.34370604, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.84484982, 1.78698075, 1.24153244, 0.92192322, 0.72133851, 0.57119018, 0.4783645, 0.41087446, 0.36617002, 0.32104823, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + ], + 1.35: [ + [14.61464119, 0.69515091, 0.02916753], + [14.61464119, 0.95350921, 0.34370604, 0.02916753], + [14.61464119, 1.56271636, 0.57119018, 0.19894916, 0.02916753], + [14.61464119, 1.61558151, 0.69515091, 0.29807833, 0.09824532, 0.02916753], + [14.61464119, 1.84880662, 0.83188516, 0.43325692, 0.22545385, 0.09824532, 0.02916753], + [14.61464119, 2.45070267, 1.162866, 0.64427125, 0.36617002, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.36964464, 0.803307, 0.50118381, 0.32104823, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.41535246, 0.83188516, 0.54755926, 0.36617002, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.56271636, 0.95350921, 0.64427125, 0.45573691, 0.32104823, 0.22545385, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.56271636, 0.95350921, 0.64427125, 0.45573691, 0.34370604, 0.25053367, 0.19894916, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 3.07277966, 1.61558151, 1.01931262, 0.72133851, 0.52423614, 0.38853383, 0.29807833, 0.22545385, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 3.07277966, 1.61558151, 1.01931262, 0.72133851, 0.52423614, 0.41087446, 0.32104823, 0.25053367, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 3.07277966, 1.61558151, 1.05362725, 0.74807048, 0.54755926, 0.43325692, 0.34370604, 0.27464288, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 3.07277966, 1.72759056, 1.12534678, 0.803307, 0.59516323, 0.45573691, 0.36617002, 0.29807833, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 3.07277966, 1.72759056, 1.12534678, 0.803307, 0.59516323, 0.4783645, 0.38853383, 0.32104823, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.45070267, 1.51179266, 1.01931262, 0.74807048, 0.57119018, 0.45573691, 0.36617002, 0.32104823, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.6383388, 1.61558151, 1.08895338, 0.803307, 0.61951244, 0.50118381, 0.41087446, 0.34370604, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.6383388, 1.61558151, 1.08895338, 0.803307, 0.64427125, 0.52423614, 0.43325692, 0.36617002, 0.32104823, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 5.85520077, 2.6383388, 1.61558151, 1.08895338, 0.803307, 0.64427125, 0.52423614, 0.45573691, 0.38853383, 0.34370604, 0.32104823, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + ], + 1.40: [ + [14.61464119, 0.59516323, 0.02916753], + [14.61464119, 0.95350921, 0.34370604, 0.02916753], + [14.61464119, 1.08895338, 0.43325692, 0.13792117, 0.02916753], + [14.61464119, 1.56271636, 0.64427125, 0.27464288, 0.09824532, 0.02916753], + [14.61464119, 1.61558151, 0.803307, 0.43325692, 0.22545385, 0.09824532, 0.02916753], + [14.61464119, 2.05039096, 0.95350921, 0.54755926, 0.34370604, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 2.45070267, 1.24153244, 0.72133851, 0.43325692, 0.27464288, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 2.45070267, 1.24153244, 0.74807048, 0.50118381, 0.34370604, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 2.45070267, 1.28281462, 0.803307, 0.52423614, 0.36617002, 0.27464288, 0.19894916, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.45070267, 1.28281462, 0.803307, 0.54755926, 0.38853383, 0.29807833, 0.22545385, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.41535246, 0.86115354, 0.59516323, 0.43325692, 0.32104823, 0.25053367, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.51179266, 0.95350921, 0.64427125, 0.45573691, 0.34370604, 0.27464288, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.51179266, 0.95350921, 0.64427125, 0.4783645, 0.36617002, 0.29807833, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.56271636, 0.98595673, 0.69515091, 0.52423614, 0.41087446, 0.34370604, 0.29807833, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.56271636, 1.01931262, 0.72133851, 0.54755926, 0.43325692, 0.36617002, 0.32104823, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.61558151, 1.05362725, 0.74807048, 0.57119018, 0.45573691, 0.38853383, 0.34370604, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.61558151, 1.08895338, 0.803307, 0.61951244, 0.50118381, 0.41087446, 0.36617002, 0.32104823, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.61558151, 1.08895338, 0.803307, 0.61951244, 0.50118381, 0.43325692, 0.38853383, 0.34370604, 0.32104823, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.61558151, 1.08895338, 0.803307, 0.64427125, 0.52423614, 0.45573691, 0.41087446, 0.36617002, 0.34370604, 0.32104823, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + ], + 1.45: [ + [14.61464119, 0.59516323, 0.02916753], + [14.61464119, 0.803307, 0.25053367, 0.02916753], + [14.61464119, 0.95350921, 0.34370604, 0.09824532, 0.02916753], + [14.61464119, 1.24153244, 0.54755926, 0.25053367, 0.09824532, 0.02916753], + [14.61464119, 1.56271636, 0.72133851, 0.36617002, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 1.61558151, 0.803307, 0.45573691, 0.27464288, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 1.91321158, 0.95350921, 0.57119018, 0.36617002, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 2.19988537, 1.08895338, 0.64427125, 0.41087446, 0.27464288, 0.19894916, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.45070267, 1.24153244, 0.74807048, 0.50118381, 0.34370604, 0.25053367, 0.19894916, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.45070267, 1.24153244, 0.74807048, 0.50118381, 0.36617002, 0.27464288, 0.22545385, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.45070267, 1.28281462, 0.803307, 0.54755926, 0.41087446, 0.32104823, 0.25053367, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.45070267, 1.28281462, 0.803307, 0.57119018, 0.43325692, 0.34370604, 0.27464288, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.45070267, 1.28281462, 0.83188516, 0.59516323, 0.45573691, 0.36617002, 0.29807833, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.45070267, 1.28281462, 0.83188516, 0.59516323, 0.45573691, 0.36617002, 0.32104823, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.51179266, 0.95350921, 0.69515091, 0.52423614, 0.41087446, 0.34370604, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.51179266, 0.95350921, 0.69515091, 0.52423614, 0.43325692, 0.36617002, 0.32104823, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.56271636, 0.98595673, 0.72133851, 0.54755926, 0.45573691, 0.38853383, 0.34370604, 0.32104823, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.56271636, 1.01931262, 0.74807048, 0.57119018, 0.4783645, 0.41087446, 0.36617002, 0.34370604, 0.32104823, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.84484982, 1.56271636, 1.01931262, 0.74807048, 0.59516323, 0.50118381, 0.43325692, 0.38853383, 0.36617002, 0.34370604, 0.32104823, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + ], + 1.50: [ + [14.61464119, 0.54755926, 0.02916753], + [14.61464119, 0.803307, 0.25053367, 0.02916753], + [14.61464119, 0.86115354, 0.32104823, 0.09824532, 0.02916753], + [14.61464119, 1.24153244, 0.54755926, 0.25053367, 0.09824532, 0.02916753], + [14.61464119, 1.56271636, 0.72133851, 0.36617002, 0.19894916, 0.09824532, 0.02916753], + [14.61464119, 1.61558151, 0.803307, 0.45573691, 0.27464288, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 1.61558151, 0.83188516, 0.52423614, 0.34370604, 0.25053367, 0.17026083, 0.09824532, 0.02916753], + [14.61464119, 1.84880662, 0.95350921, 0.59516323, 0.38853383, 0.27464288, 0.19894916, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 1.84880662, 0.95350921, 0.59516323, 0.41087446, 0.29807833, 0.22545385, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 1.84880662, 0.95350921, 0.61951244, 0.43325692, 0.32104823, 0.25053367, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.19988537, 1.12534678, 0.72133851, 0.50118381, 0.36617002, 0.27464288, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.19988537, 1.12534678, 0.72133851, 0.50118381, 0.36617002, 0.29807833, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.36326075, 1.24153244, 0.803307, 0.57119018, 0.43325692, 0.34370604, 0.29807833, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.36326075, 1.24153244, 0.803307, 0.57119018, 0.43325692, 0.34370604, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.36326075, 1.24153244, 0.803307, 0.59516323, 0.45573691, 0.36617002, 0.32104823, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.36326075, 1.24153244, 0.803307, 0.59516323, 0.45573691, 0.38853383, 0.34370604, 0.32104823, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.45070267, 1.32549286, 0.86115354, 0.64427125, 0.50118381, 0.41087446, 0.36617002, 0.34370604, 0.32104823, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.45070267, 1.36964464, 0.92192322, 0.69515091, 0.54755926, 0.45573691, 0.41087446, 0.36617002, 0.34370604, 0.32104823, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + [14.61464119, 2.45070267, 1.41535246, 0.95350921, 0.72133851, 0.57119018, 0.4783645, 0.43325692, 0.38853383, 0.36617002, 0.34370604, 0.32104823, 0.29807833, 0.27464288, 0.25053367, 0.22545385, 0.19894916, 0.17026083, 0.13792117, 0.09824532, 0.02916753], + ], +} + +class GITSScheduler: + @classmethod + def INPUT_TYPES(s): + return {"required": + {"coeff": ("FLOAT", {"default": 1.20, "min": 0.80, "max": 1.50, "step": 0.05}), + "steps": ("INT", {"default": 10, "min": 2, "max": 1000}), + "denoise": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}), + } + } + RETURN_TYPES = ("SIGMAS",) + CATEGORY = "sampling/custom_sampling/schedulers" + + FUNCTION = "get_sigmas" + + def get_sigmas(self, coeff, steps, denoise): + total_steps = steps + if denoise < 1.0: + if denoise <= 0.0: + return (torch.FloatTensor([]),) + total_steps = round(steps * denoise) + + if steps <= 20: + sigmas = NOISE_LEVELS[round(coeff, 2)][steps-2][:] + else: + sigmas = NOISE_LEVELS[round(coeff, 2)][-1][:] + sigmas = loglinear_interp(sigmas, steps + 1) + + sigmas = sigmas[-(total_steps + 1):] + sigmas[-1] = 0 + return (torch.FloatTensor(sigmas), ) + +NODE_CLASS_MAPPINGS = { + "GITSScheduler": GITSScheduler, +} diff --git a/nodes.py b/nodes.py index 06ea46216..99645b81c 100644 --- a/nodes.py +++ b/nodes.py @@ -1991,6 +1991,7 @@ def init_custom_nodes(): "nodes_webcam.py", "nodes_audio.py", "nodes_sd3.py", + "nodes_gits.py", ] import_failed = [] From d5efde89b76c40c72668daec052c07c71a737908 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 20 Jun 2024 08:51:49 -0400 Subject: [PATCH 014/123] Add ipndm_v sampler, works best with the exponential scheduler. --- comfy/k_diffusion/sampling.py | 63 +++++++++++++++++++++++++++++++++++ comfy/samplers.py | 2 +- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/comfy/k_diffusion/sampling.py b/comfy/k_diffusion/sampling.py index 214199266..78896b8b5 100644 --- a/comfy/k_diffusion/sampling.py +++ b/comfy/k_diffusion/sampling.py @@ -882,3 +882,66 @@ def sample_ipndm(model, x, sigmas, extra_args=None, callback=None, disable=None, buffer_model.append(d_cur) return x_next + +#From https://github.com/zju-pi/diff-sampler/blob/main/diff-solvers-main/solvers.py +#under Apache 2 license +def sample_ipndm_v(model, x, sigmas, extra_args=None, callback=None, disable=None, max_order=4): + extra_args = {} if extra_args is None else extra_args + s_in = x.new_ones([x.shape[0]]) + + x_next = x + t_steps = sigmas + + buffer_model = [] + for i in trange(len(sigmas) - 1, disable=disable): + t_cur = sigmas[i] + t_next = sigmas[i + 1] + + x_cur = x_next + + denoised = model(x_cur, t_cur * s_in, **extra_args) + if callback is not None: + callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigmas[i], 'denoised': denoised}) + + d_cur = (x_cur - denoised) / t_cur + + order = min(max_order, i+1) + if order == 1: # First Euler step. + x_next = x_cur + (t_next - t_cur) * d_cur + elif order == 2: # Use one history point. + h_n = (t_next - t_cur) + h_n_1 = (t_cur - t_steps[i-1]) + coeff1 = (2 + (h_n / h_n_1)) / 2 + coeff2 = -(h_n / h_n_1) / 2 + x_next = x_cur + (t_next - t_cur) * (coeff1 * d_cur + coeff2 * buffer_model[-1]) + elif order == 3: # Use two history points. + h_n = (t_next - t_cur) + h_n_1 = (t_cur - t_steps[i-1]) + h_n_2 = (t_steps[i-1] - t_steps[i-2]) + temp = (1 - h_n / (3 * (h_n + h_n_1)) * (h_n * (h_n + h_n_1)) / (h_n_1 * (h_n_1 + h_n_2))) / 2 + coeff1 = (2 + (h_n / h_n_1)) / 2 + temp + coeff2 = -(h_n / h_n_1) / 2 - (1 + h_n_1 / h_n_2) * temp + coeff3 = temp * h_n_1 / h_n_2 + x_next = x_cur + (t_next - t_cur) * (coeff1 * d_cur + coeff2 * buffer_model[-1] + coeff3 * buffer_model[-2]) + elif order == 4: # Use three history points. + h_n = (t_next - t_cur) + h_n_1 = (t_cur - t_steps[i-1]) + h_n_2 = (t_steps[i-1] - t_steps[i-2]) + h_n_3 = (t_steps[i-2] - t_steps[i-3]) + temp1 = (1 - h_n / (3 * (h_n + h_n_1)) * (h_n * (h_n + h_n_1)) / (h_n_1 * (h_n_1 + h_n_2))) / 2 + temp2 = ((1 - h_n / (3 * (h_n + h_n_1))) / 2 + (1 - h_n / (2 * (h_n + h_n_1))) * h_n / (6 * (h_n + h_n_1 + h_n_2))) \ + * (h_n * (h_n + h_n_1) * (h_n + h_n_1 + h_n_2)) / (h_n_1 * (h_n_1 + h_n_2) * (h_n_1 + h_n_2 + h_n_3)) + coeff1 = (2 + (h_n / h_n_1)) / 2 + temp1 + temp2 + coeff2 = -(h_n / h_n_1) / 2 - (1 + h_n_1 / h_n_2) * temp1 - (1 + (h_n_1 / h_n_2) + (h_n_1 * (h_n_1 + h_n_2) / (h_n_2 * (h_n_2 + h_n_3)))) * temp2 + coeff3 = temp1 * h_n_1 / h_n_2 + ((h_n_1 / h_n_2) + (h_n_1 * (h_n_1 + h_n_2) / (h_n_2 * (h_n_2 + h_n_3))) * (1 + h_n_2 / h_n_3)) * temp2 + coeff4 = -temp2 * (h_n_1 * (h_n_1 + h_n_2) / (h_n_2 * (h_n_2 + h_n_3))) * h_n_1 / h_n_2 + x_next = x_cur + (t_next - t_cur) * (coeff1 * d_cur + coeff2 * buffer_model[-1] + coeff3 * buffer_model[-2] + coeff4 * buffer_model[-3]) + + if len(buffer_model) == max_order - 1: + for k in range(max_order - 2): + buffer_model[k] = buffer_model[k+1] + buffer_model[-1] = d_cur.detach() + else: + buffer_model.append(d_cur.detach()) + + return x_next diff --git a/comfy/samplers.py b/comfy/samplers.py index 4de377cc0..55b1486b4 100644 --- a/comfy/samplers.py +++ b/comfy/samplers.py @@ -540,7 +540,7 @@ class Sampler: KSAMPLER_NAMES = ["euler", "euler_ancestral", "heun", "heunpp2","dpm_2", "dpm_2_ancestral", "lms", "dpm_fast", "dpm_adaptive", "dpmpp_2s_ancestral", "dpmpp_sde", "dpmpp_sde_gpu", "dpmpp_2m", "dpmpp_2m_sde", "dpmpp_2m_sde_gpu", "dpmpp_3m_sde", "dpmpp_3m_sde_gpu", "ddpm", "lcm", - "ipndm"] + "ipndm", "ipndm_v"] class KSAMPLER(Sampler): def __init__(self, sampler_function, extra_options={}, inpaint_options={}): From 1e2839f4d904b686cea2686b2855279572df8022 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 20 Jun 2024 16:50:31 -0400 Subject: [PATCH 015/123] More proper tiled audio decoding. --- comfy/sd.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/comfy/sd.py b/comfy/sd.py index 178f52e8b..470bd717b 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -299,15 +299,24 @@ class VAE: return output def decode_tiled_1d(self, samples, tile_x=128, overlap=64): - output = torch.empty((samples.shape[0], self.output_channels) + tuple(map(lambda a: a * self.upscale_ratio, samples.shape[2:])), device=self.output_device) + output = torch.zeros((samples.shape[0], self.output_channels) + tuple(map(lambda a: a * self.upscale_ratio, samples.shape[2:])), device=self.output_device) + output_mult = torch.zeros((samples.shape[0], self.output_channels) + tuple(map(lambda a: a * self.upscale_ratio, samples.shape[2:])), device=self.output_device) for j in range(samples.shape[0]): for i in range(0, samples.shape[-1], tile_x - overlap): f = i t = i + tile_x - output[j:j+1,:,f * self.upscale_ratio:t * self.upscale_ratio] = self.first_stage_model.decode(samples[j:j+1,:,f:t].to(self.vae_dtype).to(self.device)).float() + o = output[j:j+1,:,f * self.upscale_ratio:t * self.upscale_ratio] + m = torch.ones_like(o) + l = m.shape[-1] + for x in range(overlap): + c = ((x + 1) / overlap) + m[:,:,x:x+1] *= c + m[:,:,l-x-1:l-x] *= c + o += self.first_stage_model.decode(samples[j:j+1,:,f:t].to(self.vae_dtype).to(self.device)).float().to(self.output_device) * m + output_mult[j:j+1,:,f * self.upscale_ratio:t * self.upscale_ratio] += m - return output + return output / output_mult def encode_tiled_(self, pixel_samples, tile_x=512, tile_y=512, overlap = 64): steps = pixel_samples.shape[0] * comfy.utils.get_tiled_scale_steps(pixel_samples.shape[3], pixel_samples.shape[2], tile_x, tile_y, overlap) From 887a6341ed14c9904230cf55a0eabe95cd0218d3 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Fri, 21 Jun 2024 08:41:31 -0400 Subject: [PATCH 016/123] Proper ModelMergeSD3_2B node. --- comfy_extras/nodes_model_merging_model_specific.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/comfy_extras/nodes_model_merging_model_specific.py b/comfy_extras/nodes_model_merging_model_specific.py index 74ab6814c..df111bd60 100644 --- a/comfy_extras/nodes_model_merging_model_specific.py +++ b/comfy_extras/nodes_model_merging_model_specific.py @@ -52,7 +52,7 @@ class ModelMergeSDXL(comfy_extras.nodes_model_merging.ModelMergeBlocks): return {"required": arg_dict} -class ModelMergeSD3(comfy_extras.nodes_model_merging.ModelMergeBlocks): +class ModelMergeSD3_2B(comfy_extras.nodes_model_merging.ModelMergeBlocks): CATEGORY = "advanced/model_merging/model_specific" @classmethod @@ -68,7 +68,7 @@ class ModelMergeSD3(comfy_extras.nodes_model_merging.ModelMergeBlocks): arg_dict["y_embedder."] = argument arg_dict["t_embedder."] = argument - for i in range(38): + for i in range(24): arg_dict["joint_blocks.{}.".format(i)] = argument arg_dict["final_layer."] = argument @@ -79,5 +79,5 @@ NODE_CLASS_MAPPINGS = { "ModelMergeSD1": ModelMergeSD1, "ModelMergeSD2": ModelMergeSD1, #SD1 and SD2 have the same blocks "ModelMergeSDXL": ModelMergeSDXL, - "ModelMergeSD3": ModelMergeSD3, + "ModelMergeSD3_2B": ModelMergeSD3_2B, } From 4ef1479dcde5bbb51aabe99a5e0c295a453b5bb8 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sat, 22 Jun 2024 11:45:58 -0400 Subject: [PATCH 017/123] Multi dimension tiled scale function and tiled VAE audio encoding fallback. --- comfy/sd.py | 31 +++++++++---------------- comfy/utils.py | 61 +++++++++++++++++++++++++++++++++----------------- 2 files changed, 51 insertions(+), 41 deletions(-) diff --git a/comfy/sd.py b/comfy/sd.py index 470bd717b..ea6e9b663 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -298,25 +298,9 @@ class VAE: / 3.0) return output - def decode_tiled_1d(self, samples, tile_x=128, overlap=64): - output = torch.zeros((samples.shape[0], self.output_channels) + tuple(map(lambda a: a * self.upscale_ratio, samples.shape[2:])), device=self.output_device) - output_mult = torch.zeros((samples.shape[0], self.output_channels) + tuple(map(lambda a: a * self.upscale_ratio, samples.shape[2:])), device=self.output_device) - - for j in range(samples.shape[0]): - for i in range(0, samples.shape[-1], tile_x - overlap): - f = i - t = i + tile_x - o = output[j:j+1,:,f * self.upscale_ratio:t * self.upscale_ratio] - m = torch.ones_like(o) - l = m.shape[-1] - for x in range(overlap): - c = ((x + 1) / overlap) - m[:,:,x:x+1] *= c - m[:,:,l-x-1:l-x] *= c - o += self.first_stage_model.decode(samples[j:j+1,:,f:t].to(self.vae_dtype).to(self.device)).float().to(self.output_device) * m - output_mult[j:j+1,:,f * self.upscale_ratio:t * self.upscale_ratio] += m - - return output / output_mult + def decode_tiled_1d(self, samples, tile_x=128, overlap=32): + decode_fn = lambda a: self.first_stage_model.decode(a.to(self.vae_dtype).to(self.device)).float() + return comfy.utils.tiled_scale_multidim(samples, decode_fn, tile=(tile_x,), overlap=overlap, upscale_amount=self.upscale_ratio, out_channels=self.output_channels, output_device=self.output_device) def encode_tiled_(self, pixel_samples, tile_x=512, tile_y=512, overlap = 64): steps = pixel_samples.shape[0] * comfy.utils.get_tiled_scale_steps(pixel_samples.shape[3], pixel_samples.shape[2], tile_x, tile_y, overlap) @@ -331,6 +315,10 @@ class VAE: samples /= 3.0 return samples + def encode_tiled_1d(self, samples, tile_x=128 * 2048, overlap=32 * 2048): + encode_fn = lambda a: self.first_stage_model.encode((self.process_input(a)).to(self.vae_dtype).to(self.device)).float() + return comfy.utils.tiled_scale_multidim(samples, encode_fn, tile=(tile_x,), overlap=overlap, upscale_amount=(1/self.downscale_ratio), out_channels=self.latent_channels, output_device=self.output_device) + def decode(self, samples_in): try: memory_used = self.memory_used_decode(samples_in.shape, self.vae_dtype) @@ -374,7 +362,10 @@ class VAE: except model_management.OOM_EXCEPTION as e: logging.warning("Warning: Ran out of memory when regular VAE encoding, retrying with tiled VAE encoding.") - samples = self.encode_tiled_(pixel_samples) + if len(pixel_samples.shape) == 3: + samples = self.encode_tiled_1d(pixel_samples) + else: + samples = self.encode_tiled_(pixel_samples) return samples diff --git a/comfy/utils.py b/comfy/utils.py index f0d675004..ed6c58a64 100644 --- a/comfy/utils.py +++ b/comfy/utils.py @@ -6,6 +6,7 @@ import safetensors.torch import numpy as np from PIL import Image import logging +import itertools def load_torch_file(ckpt, safe_load=False, device=None): if device is None: @@ -506,34 +507,52 @@ def get_tiled_scale_steps(width, height, tile_x, tile_y, overlap): return math.ceil((height / (tile_y - overlap))) * math.ceil((width / (tile_x - overlap))) @torch.inference_mode() -def tiled_scale(samples, function, tile_x=64, tile_y=64, overlap = 8, upscale_amount = 4, out_channels = 3, output_device="cpu", pbar = None): - output = torch.empty((samples.shape[0], out_channels, round(samples.shape[2] * upscale_amount), round(samples.shape[3] * upscale_amount)), device=output_device) +def tiled_scale_multidim(samples, function, tile=(64, 64), overlap = 8, upscale_amount = 4, out_channels = 3, output_device="cpu", pbar = None): + dims = len(tile) + output = torch.empty([samples.shape[0], out_channels] + list(map(lambda a: round(a * upscale_amount), samples.shape[2:])), device=output_device) + for b in range(samples.shape[0]): s = samples[b:b+1] - out = torch.zeros((s.shape[0], out_channels, round(s.shape[2] * upscale_amount), round(s.shape[3] * upscale_amount)), device=output_device) - out_div = torch.zeros((s.shape[0], out_channels, round(s.shape[2] * upscale_amount), round(s.shape[3] * upscale_amount)), device=output_device) - for y in range(0, s.shape[2], tile_y - overlap): - for x in range(0, s.shape[3], tile_x - overlap): - x = max(0, min(s.shape[-1] - overlap, x)) - y = max(0, min(s.shape[-2] - overlap, y)) - s_in = s[:,:,y:y+tile_y,x:x+tile_x] + out = torch.zeros([s.shape[0], out_channels] + list(map(lambda a: round(a * upscale_amount), s.shape[2:])), device=output_device) + out_div = torch.zeros([s.shape[0], out_channels] + list(map(lambda a: round(a * upscale_amount), s.shape[2:])), device=output_device) - ps = function(s_in).to(output_device) - mask = torch.ones_like(ps) - feather = round(overlap * upscale_amount) - for t in range(feather): - mask[:,:,t:1+t,:] *= ((1.0/feather) * (t + 1)) - mask[:,:,mask.shape[2] -1 -t: mask.shape[2]-t,:] *= ((1.0/feather) * (t + 1)) - mask[:,:,:,t:1+t] *= ((1.0/feather) * (t + 1)) - mask[:,:,:,mask.shape[3]- 1 - t: mask.shape[3]- t] *= ((1.0/feather) * (t + 1)) - out[:,:,round(y*upscale_amount):round((y+tile_y)*upscale_amount),round(x*upscale_amount):round((x+tile_x)*upscale_amount)] += ps * mask - out_div[:,:,round(y*upscale_amount):round((y+tile_y)*upscale_amount),round(x*upscale_amount):round((x+tile_x)*upscale_amount)] += mask - if pbar is not None: - pbar.update(1) + for it in itertools.product(*map(lambda a: range(0, a[0], a[1] - overlap), zip(s.shape[2:], tile))): + s_in = s + upscaled = [] + + for d in range(dims): + pos = max(0, min(s.shape[d + 2] - overlap, it[d])) + l = min(tile[d], s.shape[d + 2] - pos) + s_in = s_in.narrow(d + 2, pos, l) + upscaled.append(round(pos * upscale_amount)) + ps = function(s_in).to(output_device) + mask = torch.ones_like(ps) + feather = round(overlap * upscale_amount) + for t in range(feather): + for d in range(2, dims + 2): + m = mask.narrow(d, t, 1) + m *= ((1.0/feather) * (t + 1)) + m = mask.narrow(d, mask.shape[d] -1 -t, 1) + m *= ((1.0/feather) * (t + 1)) + + o = out + o_d = out_div + for d in range(dims): + o = o.narrow(d + 2, upscaled[d], mask.shape[d + 2]) + o_d = o_d.narrow(d + 2, upscaled[d], mask.shape[d + 2]) + + o += ps * mask + o_d += mask + + if pbar is not None: + pbar.update(1) output[b:b+1] = out/out_div return output +def tiled_scale(samples, function, tile_x=64, tile_y=64, overlap = 8, upscale_amount = 4, out_channels = 3, output_device="cpu", pbar = None): + return tiled_scale_multidim(samples, function, (tile_y, tile_x), overlap, upscale_amount, out_channels, output_device, pbar) + PROGRESS_BAR_ENABLED = True def set_progress_bar_enabled(enabled): global PROGRESS_BAR_ENABLED From 2f360ae89853bfe40cc281428a3bafde06f114d5 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sat, 22 Jun 2024 13:08:04 -0400 Subject: [PATCH 018/123] Support OneTrainer SD3 lora format. --- comfy/lora.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/comfy/lora.py b/comfy/lora.py index 9e3e7a8bb..037431775 100644 --- a/comfy/lora.py +++ b/comfy/lora.py @@ -218,12 +218,21 @@ def model_lora_keys_clip(model, key_map={}): lora_key = "lora_prior_te_text_model_encoder_layers_{}_{}".format(b, LORA_CLIP_MAP[c]) #cascade lora: TODO put lora key prefix in the model config key_map[lora_key] = k + for k in sdk: #OneTrainer SD3 lora + if k.startswith("t5xxl.transformer.") and k.endswith(".weight"): + l_key = k[len("t5xxl.transformer."):-len(".weight")] + lora_key = "lora_te3_{}".format(l_key.replace(".", "_")) + key_map[lora_key] = k k = "clip_g.transformer.text_projection.weight" if k in sdk: key_map["lora_prior_te_text_projection"] = k #cascade lora? # key_map["text_encoder.text_projection"] = k #TODO: check if other lora have the text_projection too - # key_map["lora_te_text_projection"] = k + key_map["lora_te2_text_projection"] = k #OneTrainer SD3 lora + + k = "clip_l.transformer.text_projection.weight" + if k in sdk: + key_map["lora_te1_text_projection"] = k #OneTrainer SD3 lora, not necessary but omits warning return key_map @@ -262,4 +271,7 @@ def model_lora_keys_unet(model, key_map={}): key_lora = "base_model.model.{}".format(k[:-len(".weight")]) #format for flash-sd3 lora and others? key_map[key_lora] = to + key_lora = "lora_transformer_{}".format(k[:-len(".weight")].replace(".", "_")) #OneTrainer lora + key_map[key_lora] = to + return key_map From 73ca7800192f6bc2e2194966b316b7cc3028e09a Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sun, 23 Jun 2024 13:21:18 -0400 Subject: [PATCH 019/123] Add SamplerEulerCFG++ node. This node should match the DDIM implementation of CFG++ when "regular" is selected. "alternative" is a slightly different take on CFG++ --- comfy/model_patcher.py | 10 +++- comfy_extras/nodes_advanced_samplers.py | 74 +++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 3 deletions(-) diff --git a/comfy/model_patcher.py b/comfy/model_patcher.py index bf8787768..b949031e9 100644 --- a/comfy/model_patcher.py +++ b/comfy/model_patcher.py @@ -51,6 +51,12 @@ def set_model_options_patch_replace(model_options, patch, name, block_name, numb model_options["transformer_options"] = to return model_options +def set_model_options_post_cfg_function(model_options, post_cfg_function, disable_cfg1_optimization=False): + model_options["sampler_post_cfg_function"] = model_options.get("sampler_post_cfg_function", []) + [post_cfg_function] + if disable_cfg1_optimization: + model_options["disable_cfg1_optimization"] = True + return model_options + class ModelPatcher: def __init__(self, model, load_device, offload_device, size=0, current_device=None, weight_inplace_update=False): self.size = size @@ -122,9 +128,7 @@ class ModelPatcher: self.model_options["disable_cfg1_optimization"] = True def set_model_sampler_post_cfg_function(self, post_cfg_function, disable_cfg1_optimization=False): - self.model_options["sampler_post_cfg_function"] = self.model_options.get("sampler_post_cfg_function", []) + [post_cfg_function] - if disable_cfg1_optimization: - self.model_options["disable_cfg1_optimization"] = True + self.model_options = set_model_options_post_cfg_function(self.model_options, post_cfg_function, disable_cfg1_optimization) def set_model_unet_function_wrapper(self, unet_wrapper_function: UnetWrapperFunction): self.model_options["model_function_wrapper"] = unet_wrapper_function diff --git a/comfy_extras/nodes_advanced_samplers.py b/comfy_extras/nodes_advanced_samplers.py index d973def81..7aa89c644 100644 --- a/comfy_extras/nodes_advanced_samplers.py +++ b/comfy_extras/nodes_advanced_samplers.py @@ -56,6 +56,80 @@ class SamplerLCMUpscale: sampler = comfy.samplers.KSAMPLER(sample_lcm_upscale, extra_options={"total_upscale": scale_ratio, "upscale_steps": scale_steps, "upscale_method": upscale_method}) return (sampler, ) +from comfy.k_diffusion.sampling import to_d +import comfy.model_patcher + +@torch.no_grad() +def sample_euler_cfgpp(model, x, sigmas, extra_args=None, callback=None, disable=None): + extra_args = {} if extra_args is None else extra_args + + temp = [0] + def post_cfg_function(args): + temp[0] = args["uncond_denoised"] + return args["denoised"] + + model_options = extra_args.get("model_options", {}).copy() + extra_args["model_options"] = comfy.model_patcher.set_model_options_post_cfg_function(model_options, post_cfg_function, disable_cfg1_optimization=True) + + s_in = x.new_ones([x.shape[0]]) + for i in trange(len(sigmas) - 1, disable=disable): + sigma_hat = sigmas[i] + denoised = model(x, sigma_hat * s_in, **extra_args) + d = to_d(x, sigma_hat, temp[0]) + if callback is not None: + callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigma_hat, 'denoised': denoised}) + dt = sigmas[i + 1] - sigma_hat + x = denoised + sigmas[i + 1] * d + return x + +@torch.no_grad() +def sample_euler_cfgpp_alt(model, x, sigmas, extra_args=None, callback=None, disable=None): + extra_args = {} if extra_args is None else extra_args + + temp = [0] + def post_cfg_function(args): + temp[0] = args["uncond_denoised"] + return args["denoised"] + + model_options = extra_args.get("model_options", {}).copy() + extra_args["model_options"] = comfy.model_patcher.set_model_options_post_cfg_function(model_options, post_cfg_function, disable_cfg1_optimization=True) + + s_in = x.new_ones([x.shape[0]]) + for i in trange(len(sigmas) - 1, disable=disable): + sigma_hat = sigmas[i] + denoised = model(x, sigma_hat * s_in, **extra_args) + d = to_d(x - denoised + temp[0], sigma_hat, denoised) + if callback is not None: + callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigma_hat, 'denoised': denoised}) + dt = sigmas[i + 1] - sigma_hat + # Euler method + x = x + d * dt + return x + +class SamplerEulerCFGpp: + @classmethod + def INPUT_TYPES(s): + return {"required": + {"version": (["regular", "alternative"],),} + } + RETURN_TYPES = ("SAMPLER",) + # CATEGORY = "sampling/custom_sampling/samplers" + CATEGORY = "_for_testing" + + FUNCTION = "get_sampler" + + def get_sampler(self, version): + if version == "regular": + sampler = comfy.samplers.KSAMPLER(sample_euler_cfgpp) + else: + sampler = comfy.samplers.KSAMPLER(sample_euler_cfgpp_alt) + return (sampler, ) + NODE_CLASS_MAPPINGS = { "SamplerLCMUpscale": SamplerLCMUpscale, + "SamplerEulerCFGpp": SamplerEulerCFGpp, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "SamplerEulerCFGpp": "SamplerEulerCFG++", } From 866f54da8d7eed41a0554648aef8cf213551ee59 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Mon, 24 Jun 2024 14:47:28 -0400 Subject: [PATCH 020/123] Add browser test action synced with TS repo (#3852) * Add browser test action * Add npm install task --- .github/workflows/test-browser.yml | 61 ++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 .github/workflows/test-browser.yml diff --git a/.github/workflows/test-browser.yml b/.github/workflows/test-browser.yml new file mode 100644 index 000000000..049b1cde2 --- /dev/null +++ b/.github/workflows/test-browser.yml @@ -0,0 +1,61 @@ +# This is a temporary action during frontend TS migration. +# This file should be removed after TS migration is completed. +# The browser test is here to ensure TS repo is working the same way as the +# current JS code. +# If you are adding UI feature, please sync your changes to the TS repo: +# huchenlei/ComfyUI_frontend and update test expectation files accordingly. +name: Playwright Browser Tests CI + +on: + pull_request: + branches: [ main, master ] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout ComfyUI + uses: actions/checkout@v4 + with: + repository: "comfyanonymous/ComfyUI" + path: "ComfyUI" + - name: Checkout ComfyUI_frontend + uses: actions/checkout@v4 + with: + repository: "huchenlei/ComfyUI_frontend" + path: "ComfyUI_frontend" + ref: "23a4ee83144d9bf22e7218b9c78c71f8544c8b27" + - uses: actions/setup-node@v3 + with: + node-version: lts/* + - uses: actions/setup-python@v4 + with: + python-version: '3.10' + - name: Install requirements + run: | + python -m pip install --upgrade pip + pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu + pip install -r requirements.txt + pip install wait-for-it + working-directory: ComfyUI + - name: Start ComfyUI server + run: | + python main.py --cpu & + wait-for-it --service 127.0.0.1:8188 -t 600 + working-directory: ComfyUI + - name: Install ComfyUI_frontend dependencies + run: | + npm ci + working-directory: ComfyUI_frontend + - name: Install Playwright Browsers + run: npx playwright install --with-deps + working-directory: ComfyUI_frontend + - name: Run Playwright tests + run: npx playwright test + working-directory: ComfyUI_frontend + - uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-report + path: ComfyUI_frontend/playwright-report/ + retention-days: 30 From eab211bb1e79fbda0b8eef00e44249993c040ae0 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Mon, 24 Jun 2024 16:55:20 -0400 Subject: [PATCH 021/123] Resample audio to 44100 when VAE encoding it. --- comfy_extras/nodes_audio.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/comfy_extras/nodes_audio.py b/comfy_extras/nodes_audio.py index 5f4bd3540..57d0a20ab 100644 --- a/comfy_extras/nodes_audio.py +++ b/comfy_extras/nodes_audio.py @@ -31,7 +31,13 @@ class VAEEncodeAudio: CATEGORY = "_for_testing/audio" def encode(self, vae, audio): - t = vae.encode(audio["waveform"].movedim(1, -1)) + sample_rate = audio["sample_rate"] + if 44100 != sample_rate: + waveform = torchaudio.functional.resample(audio["waveform"], sample_rate, 44100) + else: + waveform = audio["waveform"] + + t = vae.encode(waveform.movedim(1, -1)) return ({"samples":t}, ) class VAEDecodeAudio: From 90aebb6c868d713c3e6457d1474c53808cb5f6a2 Mon Sep 17 00:00:00 2001 From: pythongosssss <125205205+pythongosssss@users.noreply.github.com> Date: Tue, 25 Jun 2024 11:49:25 +0100 Subject: [PATCH 022/123] New Menu & Workflow Management (#3112) * menu * wip * wip * wip * wip * wip * workflow saving/loading * Support inserting workflows Move buttosn to top of lists * fix session storage implement renaming * temp * refactor, better workflow instance management * wip * progress on progress * added send to workflow various fixes * Support multiple image loaders * Support dynamic size breakpoints based on content * various fixes add close unsaved warning * Add filtering tree * prevent renaming unsaved * fix zindex on hover * fix top offset * use filename as workflow name * resize on setting change * hide element until it is drawn * remove glow * Fix export name * Fix test, revert accidental changes to groupNode * Fix colors on all themes * show hover items on smaller screen (mobile) * remove debugging code * dialog fix * Dont reorder open workflows Allow elements around canvas * Toggle body display on setting change * Fix menu disappearing on chrome * Increase delay when typing, remove margin on Safari, fix dialog location * Fix overflow issue on iOS * Add reset view button Prevent view changes causing history entries * Bottom menu wip * Various fixes * Fix merge * Fix breaking old menu position * Fix merge adding restore view to loadGraphData --- app/user_manager.py | 91 ++- tests-ui/utils/setup.js | 1 + web/extensions/core/colorPalette.js | 30 +- web/extensions/core/groupNode.js | 2 +- web/extensions/core/undoRedo.js | 177 ----- web/fonts/materialdesignicons-webfont.woff2 | Bin 0 -> 403216 bytes web/index.html | 1 + web/jsconfig.json | 4 +- web/lib/materialdesignicons.min.css | 3 + web/scripts/api.js | 75 +- web/scripts/app.js | 223 ++++-- web/scripts/changeTracker.js | 242 +++++++ web/scripts/domWidget.js | 14 +- web/scripts/ui.js | 34 +- web/scripts/ui/components/asyncDialog.js | 64 ++ web/scripts/ui/components/button.js | 163 +++++ web/scripts/ui/components/buttonGroup.js | 45 ++ web/scripts/ui/components/popup.js | 128 ++++ web/scripts/ui/components/splitButton.js | 43 ++ web/scripts/ui/dialog.js | 28 +- web/scripts/ui/menu/index.js | 302 ++++++++ web/scripts/ui/menu/interruptButton.js | 23 + web/scripts/ui/menu/menu.css | 701 ++++++++++++++++++ web/scripts/ui/menu/queueButton.js | 93 +++ web/scripts/ui/menu/queueOptions.js | 77 ++ web/scripts/ui/menu/viewHistory.js | 27 + web/scripts/ui/menu/viewList.js | 203 ++++++ web/scripts/ui/menu/viewQueue.js | 55 ++ web/scripts/ui/menu/workflows.js | 764 ++++++++++++++++++++ web/scripts/ui/settings.js | 20 +- web/scripts/ui/utils.js | 56 ++ web/scripts/utils.js | 68 ++ web/scripts/workflows.js | 450 ++++++++++++ web/style.css | 75 ++ web/types/comfy.d.ts | 16 +- 35 files changed, 3986 insertions(+), 312 deletions(-) delete mode 100644 web/extensions/core/undoRedo.js create mode 100644 web/fonts/materialdesignicons-webfont.woff2 create mode 100644 web/lib/materialdesignicons.min.css create mode 100644 web/scripts/changeTracker.js create mode 100644 web/scripts/ui/components/asyncDialog.js create mode 100644 web/scripts/ui/components/button.js create mode 100644 web/scripts/ui/components/buttonGroup.js create mode 100644 web/scripts/ui/components/popup.js create mode 100644 web/scripts/ui/components/splitButton.js create mode 100644 web/scripts/ui/menu/index.js create mode 100644 web/scripts/ui/menu/interruptButton.js create mode 100644 web/scripts/ui/menu/menu.css create mode 100644 web/scripts/ui/menu/queueButton.js create mode 100644 web/scripts/ui/menu/queueOptions.js create mode 100644 web/scripts/ui/menu/viewHistory.js create mode 100644 web/scripts/ui/menu/viewList.js create mode 100644 web/scripts/ui/menu/viewQueue.js create mode 100644 web/scripts/ui/menu/workflows.js create mode 100644 web/scripts/ui/utils.js create mode 100644 web/scripts/workflows.js diff --git a/app/user_manager.py b/app/user_manager.py index 209094af1..53dff18b7 100644 --- a/app/user_manager.py +++ b/app/user_manager.py @@ -2,6 +2,8 @@ import json import os import re import uuid +import glob +import shutil from aiohttp import web from comfy.cli_args import args from folder_paths import user_directory @@ -56,16 +58,16 @@ class UserManager(): if os.path.commonpath((root_dir, user_root)) != root_dir: return None - parent = user_root - if file is not None: # prevent leaving /{type}/{user} path = os.path.abspath(os.path.join(user_root, file)) if os.path.commonpath((user_root, path)) != user_root: return None + parent = os.path.split(path)[0] + if create_dir and not os.path.exists(parent): - os.mkdir(parent) + os.makedirs(parent, exist_ok=True) return path @@ -108,33 +110,96 @@ class UserManager(): user_id = self.add_user(username) return web.json_response(user_id) - @routes.get("/userdata/{file}") - async def getuserdata(request): - file = request.match_info.get("file", None) - if not file: + @routes.get("/userdata") + async def listuserdata(request): + directory = request.rel_url.query.get('dir', '') + if not directory: return web.Response(status=400) - path = self.get_request_user_filepath(request, file) + path = self.get_request_user_filepath(request, directory) if not path: return web.Response(status=403) if not os.path.exists(path): return web.Response(status=404) - return web.FileResponse(path) + recurse = request.rel_url.query.get('recurse', '').lower() == "true" + results = glob.glob(os.path.join( + glob.escape(path), '**/*'), recursive=recurse) + results = [os.path.relpath(x, path) for x in results if os.path.isfile(x)] + + split_path = request.rel_url.query.get('split', '').lower() == "true" + if split_path: + results = [[x] + x.split(os.sep) for x in results] - @routes.post("/userdata/{file}") - async def post_userdata(request): - file = request.match_info.get("file", None) + return web.json_response(results) + + def get_user_data_path(request, check_exists = False, param = "file"): + file = request.match_info.get(param, None) if not file: return web.Response(status=400) path = self.get_request_user_filepath(request, file) if not path: return web.Response(status=403) + + if check_exists and not os.path.exists(path): + return web.Response(status=404) + + return path + + @routes.get("/userdata/{file}") + async def getuserdata(request): + path = get_user_data_path(request, check_exists=True) + if not isinstance(path, str): + return path + + return web.FileResponse(path) + + @routes.post("/userdata/{file}") + async def post_userdata(request): + path = get_user_data_path(request) + if not isinstance(path, str): + return path + + overwrite = request.query["overwrite"] != "false" + if not overwrite and os.path.exists(path): + return web.Response(status=409) body = await request.read() + with open(path, "wb") as f: f.write(body) - return web.Response(status=200) + resp = os.path.relpath(path, self.get_request_user_filepath(request, None)) + return web.json_response(resp) + + @routes.delete("/userdata/{file}") + async def delete_userdata(request): + path = get_user_data_path(request, check_exists=True) + if not isinstance(path, str): + return path + + os.remove(path) + + return web.Response(status=204) + + @routes.post("/userdata/{file}/move/{dest}") + async def move_userdata(request): + source = get_user_data_path(request, check_exists=True) + if not isinstance(source, str): + return source + + dest = get_user_data_path(request, check_exists=False, param="dest") + if not isinstance(source, str): + return dest + + overwrite = request.query["overwrite"] != "false" + if not overwrite and os.path.exists(dest): + return web.Response(status=409) + + print(f"moving '{source}' -> '{dest}'") + shutil.move(source, dest) + + resp = os.path.relpath(dest, self.get_request_user_filepath(request, None)) + return web.json_response(resp) diff --git a/tests-ui/utils/setup.js b/tests-ui/utils/setup.js index e46258943..3a6d69b72 100644 --- a/tests-ui/utils/setup.js +++ b/tests-ui/utils/setup.js @@ -72,6 +72,7 @@ export function mockApi(config = {}) { storeUserData: jest.fn((file, data) => { userData[file] = data; }), + listUserData: jest.fn(() => []) }; jest.mock("../../web/scripts/api", () => ({ get api() { diff --git a/web/extensions/core/colorPalette.js b/web/extensions/core/colorPalette.js index 02546782f..245f3b93e 100644 --- a/web/extensions/core/colorPalette.js +++ b/web/extensions/core/colorPalette.js @@ -63,6 +63,10 @@ const colorPalettes = { "border-color": "#4e4e4e", "tr-even-bg-color": "#222", "tr-odd-bg-color": "#353535", + "content-bg": "#4e4e4e", + "content-fg": "#fff", + "content-hover-bg": "#222", + "content-hover-fg": "#fff" } }, }, @@ -120,6 +124,10 @@ const colorPalettes = { "border-color": "#888", "tr-even-bg-color": "#f9f9f9", "tr-odd-bg-color": "#fff", + "content-bg": "#e0e0e0", + "content-fg": "#222", + "content-hover-bg": "#adadad", + "content-hover-fg": "#222" } }, }, @@ -176,6 +184,10 @@ const colorPalettes = { "border-color": "#657b83", // Base00 "tr-even-bg-color": "#002b36", "tr-odd-bg-color": "#073642", + "content-bg": "#657b83", + "content-fg": "#fdf6e3", + "content-hover-bg": "#002b36", + "content-hover-fg": "#fdf6e3" } }, }, @@ -244,7 +256,11 @@ const colorPalettes = { "error-text": "#ff4444", "border-color": "#6e7581", "tr-even-bg-color": "#2b2f38", - "tr-odd-bg-color": "#242730" + "tr-odd-bg-color": "#242730", + "content-bg": "#6e7581", + "content-fg": "#fff", + "content-hover-bg": "#2b2f38", + "content-hover-fg": "#fff" } }, }, @@ -313,7 +329,11 @@ const colorPalettes = { "error-text": "#ff4444", "border-color": "#545d70", "tr-even-bg-color": "#2e3440", - "tr-odd-bg-color": "#161b22" + "tr-odd-bg-color": "#161b22", + "content-bg": "#545d70", + "content-fg": "#e5eaf0", + "content-hover-bg": "#2e3440", + "content-hover-fg": "#e5eaf0" } }, }, @@ -382,7 +402,11 @@ const colorPalettes = { "error-text": "#ff4444", "border-color": "#30363d", "tr-even-bg-color": "#161b22", - "tr-odd-bg-color": "#13171d" + "tr-odd-bg-color": "#13171d", + "content-bg": "#30363d", + "content-fg": "#e5eaf0", + "content-hover-bg": "#161b22", + "content-hover-fg": "#e5eaf0" } }, } diff --git a/web/extensions/core/groupNode.js b/web/extensions/core/groupNode.js index 0b0763d1d..9a2238908 100644 --- a/web/extensions/core/groupNode.js +++ b/web/extensions/core/groupNode.js @@ -1278,4 +1278,4 @@ const ext = { } }; -app.registerExtension(ext); +app.registerExtension(ext); \ No newline at end of file diff --git a/web/extensions/core/undoRedo.js b/web/extensions/core/undoRedo.js deleted file mode 100644 index 900eed2a7..000000000 --- a/web/extensions/core/undoRedo.js +++ /dev/null @@ -1,177 +0,0 @@ -import { app } from "../../scripts/app.js"; -import { api } from "../../scripts/api.js" - -const MAX_HISTORY = 50; - -let undo = []; -let redo = []; -let activeState = null; -let isOurLoad = false; -function checkState() { - const currentState = app.graph.serialize(); - if (!graphEqual(activeState, currentState)) { - undo.push(activeState); - if (undo.length > MAX_HISTORY) { - undo.shift(); - } - activeState = clone(currentState); - redo.length = 0; - api.dispatchEvent(new CustomEvent("graphChanged", { detail: activeState })); - } -} - -const loadGraphData = app.loadGraphData; -app.loadGraphData = async function () { - const v = await loadGraphData.apply(this, arguments); - if (isOurLoad) { - isOurLoad = false; - } else { - checkState(); - } - return v; -}; - -function clone(obj) { - try { - if (typeof structuredClone !== "undefined") { - return structuredClone(obj); - } - } catch (error) { - // structuredClone is stricter than using JSON.parse/stringify so fallback to that - } - - return JSON.parse(JSON.stringify(obj)); -} - -function graphEqual(a, b, root = true) { - if (a === b) return true; - - if (typeof a == "object" && a && typeof b == "object" && b) { - const keys = Object.getOwnPropertyNames(a); - - if (keys.length != Object.getOwnPropertyNames(b).length) { - return false; - } - - for (const key of keys) { - let av = a[key]; - let bv = b[key]; - if (root && key === "nodes") { - // Nodes need to be sorted as the order changes when selecting nodes - av = [...av].sort((a, b) => a.id - b.id); - bv = [...bv].sort((a, b) => a.id - b.id); - } - if (!graphEqual(av, bv, false)) { - return false; - } - } - - return true; - } - - return false; -} - -const undoRedo = async (e) => { - const updateState = async (source, target) => { - const prevState = source.pop(); - if (prevState) { - target.push(activeState); - isOurLoad = true; - await app.loadGraphData(prevState, false); - activeState = prevState; - } - } - if (e.ctrlKey || e.metaKey) { - if (e.key === "y") { - updateState(redo, undo); - return true; - } else if (e.key === "z") { - updateState(undo, redo); - return true; - } - } -}; - -const bindInput = (activeEl) => { - if (activeEl && activeEl.tagName !== "CANVAS" && activeEl.tagName !== "BODY") { - for (const evt of ["change", "input", "blur"]) { - if (`on${evt}` in activeEl) { - const listener = () => { - checkState(); - activeEl.removeEventListener(evt, listener); - }; - activeEl.addEventListener(evt, listener); - return true; - } - } - } -}; - -let keyIgnored = false; -window.addEventListener( - "keydown", - (e) => { - requestAnimationFrame(async () => { - let activeEl; - // If we are auto queue in change mode then we do want to trigger on inputs - if (!app.ui.autoQueueEnabled || app.ui.autoQueueMode === "instant") { - activeEl = document.activeElement; - if (activeEl?.tagName === "INPUT" || activeEl?.type === "textarea") { - // Ignore events on inputs, they have their native history - return; - } - } - - keyIgnored = e.key === "Control" || e.key === "Shift" || e.key === "Alt" || e.key === "Meta"; - if (keyIgnored) return; - - // Check if this is a ctrl+z ctrl+y - if (await undoRedo(e)) return; - - // If our active element is some type of input then handle changes after they're done - if (bindInput(activeEl)) return; - checkState(); - }); - }, - true -); - -window.addEventListener("keyup", (e) => { - if (keyIgnored) { - keyIgnored = false; - checkState(); - } -}); - -// Handle clicking DOM elements (e.g. widgets) -window.addEventListener("mouseup", () => { - checkState(); -}); - -// Handle prompt queue event for dynamic widget changes -api.addEventListener("promptQueued", () => { - checkState(); -}); - -// Handle litegraph clicks -const processMouseUp = LGraphCanvas.prototype.processMouseUp; -LGraphCanvas.prototype.processMouseUp = function (e) { - const v = processMouseUp.apply(this, arguments); - checkState(); - return v; -}; -const processMouseDown = LGraphCanvas.prototype.processMouseDown; -LGraphCanvas.prototype.processMouseDown = function (e) { - const v = processMouseDown.apply(this, arguments); - checkState(); - return v; -}; - -// Handle litegraph context menu for COMBO widgets -const close = LiteGraph.ContextMenu.prototype.close; -LiteGraph.ContextMenu.prototype.close = function(e) { - const v = close.apply(this, arguments); - checkState(); - return v; -} \ No newline at end of file diff --git a/web/fonts/materialdesignicons-webfont.woff2 b/web/fonts/materialdesignicons-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8c69b85f666bf3996d7e3194623bf53e774c44a3 GIT binary patch literal 403216 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

A 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

~kC(4S|_D1W! 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%0A?P6XIbsbH%^bgaA!ca7le#O1f9ZxwdH9s;d7b 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 literal 0 HcmV?d00001 diff --git a/web/index.html b/web/index.html index 094db9d15..5ebf03c01 100644 --- a/web/index.html +++ b/web/index.html @@ -5,6 +5,7 @@ ComfyUI + diff --git a/web/jsconfig.json b/web/jsconfig.json index b65fa2746..cd55a0cc7 100644 --- a/web/jsconfig.json +++ b/web/jsconfig.json @@ -4,7 +4,9 @@ "paths": { "/*": ["./*"] }, - "lib": ["DOM", "ES2022"] + "lib": ["DOM", "ES2022", "DOM.Iterable"], + "target": "ES2015", + "module": "es2020" }, "include": ["."] } diff --git a/web/lib/materialdesignicons.min.css b/web/lib/materialdesignicons.min.css new file mode 100644 index 000000000..459ce9ea8 --- /dev/null +++ b/web/lib/materialdesignicons.min.css @@ -0,0 +1,3 @@ +@font-face{font-family:"Material Design Icons";src:url("../fonts/materialdesignicons-webfont.eot?v=7.4.47");src:url("../fonts/materialdesignicons-webfont.eot?#iefix&v=7.4.47") format("embedded-opentype"),url("../fonts/materialdesignicons-webfont.woff2?v=7.4.47") format("woff2"),url("../fonts/materialdesignicons-webfont.woff?v=7.4.47") format("woff"),url("../fonts/materialdesignicons-webfont.ttf?v=7.4.47") format("truetype");font-weight:normal;font-style:normal}.mdi:before,.mdi-set{display:inline-block;font:normal normal normal 24px/1 "Material Design Icons";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-ab-testing::before{content:"\F01C9"}.mdi-abacus::before{content:"\F16E0"}.mdi-abjad-arabic::before{content:"\F1328"}.mdi-abjad-hebrew::before{content:"\F1329"}.mdi-abugida-devanagari::before{content:"\F132A"}.mdi-abugida-thai::before{content:"\F132B"}.mdi-access-point::before{content:"\F0003"}.mdi-access-point-check::before{content:"\F1538"}.mdi-access-point-minus::before{content:"\F1539"}.mdi-access-point-network::before{content:"\F0002"}.mdi-access-point-network-off::before{content:"\F0BE1"}.mdi-access-point-off::before{content:"\F1511"}.mdi-access-point-plus::before{content:"\F153A"}.mdi-access-point-remove::before{content:"\F153B"}.mdi-account::before{content:"\F0004"}.mdi-account-alert::before{content:"\F0005"}.mdi-account-alert-outline::before{content:"\F0B50"}.mdi-account-arrow-down::before{content:"\F1868"}.mdi-account-arrow-down-outline::before{content:"\F1869"}.mdi-account-arrow-left::before{content:"\F0B51"}.mdi-account-arrow-left-outline::before{content:"\F0B52"}.mdi-account-arrow-right::before{content:"\F0B53"}.mdi-account-arrow-right-outline::before{content:"\F0B54"}.mdi-account-arrow-up::before{content:"\F1867"}.mdi-account-arrow-up-outline::before{content:"\F186A"}.mdi-account-badge::before{content:"\F1B0A"}.mdi-account-badge-outline::before{content:"\F1B0B"}.mdi-account-box::before{content:"\F0006"}.mdi-account-box-edit-outline::before{content:"\F1CC8"}.mdi-account-box-minus-outline::before{content:"\F1CC9"}.mdi-account-box-multiple::before{content:"\F0934"}.mdi-account-box-multiple-outline::before{content:"\F100A"}.mdi-account-box-outline::before{content:"\F0007"}.mdi-account-box-plus-outline::before{content:"\F1CCA"}.mdi-account-cancel::before{content:"\F12DF"}.mdi-account-cancel-outline::before{content:"\F12E0"}.mdi-account-card::before{content:"\F1BA4"}.mdi-account-card-outline::before{content:"\F1BA5"}.mdi-account-cash::before{content:"\F1097"}.mdi-account-cash-outline::before{content:"\F1098"}.mdi-account-check::before{content:"\F0008"}.mdi-account-check-outline::before{content:"\F0BE2"}.mdi-account-child::before{content:"\F0A89"}.mdi-account-child-circle::before{content:"\F0A8A"}.mdi-account-child-outline::before{content:"\F10C8"}.mdi-account-circle::before{content:"\F0009"}.mdi-account-circle-outline::before{content:"\F0B55"}.mdi-account-clock::before{content:"\F0B56"}.mdi-account-clock-outline::before{content:"\F0B57"}.mdi-account-cog::before{content:"\F1370"}.mdi-account-cog-outline::before{content:"\F1371"}.mdi-account-convert::before{content:"\F000A"}.mdi-account-convert-outline::before{content:"\F1301"}.mdi-account-cowboy-hat::before{content:"\F0E9B"}.mdi-account-cowboy-hat-outline::before{content:"\F17F3"}.mdi-account-credit-card::before{content:"\F1BA6"}.mdi-account-credit-card-outline::before{content:"\F1BA7"}.mdi-account-details::before{content:"\F0631"}.mdi-account-details-outline::before{content:"\F1372"}.mdi-account-edit::before{content:"\F06BC"}.mdi-account-edit-outline::before{content:"\F0FFB"}.mdi-account-eye::before{content:"\F0420"}.mdi-account-eye-outline::before{content:"\F127B"}.mdi-account-file::before{content:"\F1CA7"}.mdi-account-file-outline::before{content:"\F1CA8"}.mdi-account-file-text::before{content:"\F1CA9"}.mdi-account-file-text-outline::before{content:"\F1CAA"}.mdi-account-filter::before{content:"\F0936"}.mdi-account-filter-outline::before{content:"\F0F9D"}.mdi-account-group::before{content:"\F0849"}.mdi-account-group-outline::before{content:"\F0B58"}.mdi-account-hard-hat::before{content:"\F05B5"}.mdi-account-hard-hat-outline::before{content:"\F1A1F"}.mdi-account-heart::before{content:"\F0899"}.mdi-account-heart-outline::before{content:"\F0BE3"}.mdi-account-injury::before{content:"\F1815"}.mdi-account-injury-outline::before{content:"\F1816"}.mdi-account-key::before{content:"\F000B"}.mdi-account-key-outline::before{content:"\F0BE4"}.mdi-account-lock::before{content:"\F115E"}.mdi-account-lock-open::before{content:"\F1960"}.mdi-account-lock-open-outline::before{content:"\F1961"}.mdi-account-lock-outline::before{content:"\F115F"}.mdi-account-minus::before{content:"\F000D"}.mdi-account-minus-outline::before{content:"\F0AEC"}.mdi-account-multiple::before{content:"\F000E"}.mdi-account-multiple-check::before{content:"\F08C5"}.mdi-account-multiple-check-outline::before{content:"\F11FE"}.mdi-account-multiple-minus::before{content:"\F05D3"}.mdi-account-multiple-minus-outline::before{content:"\F0BE5"}.mdi-account-multiple-outline::before{content:"\F000F"}.mdi-account-multiple-plus::before{content:"\F0010"}.mdi-account-multiple-plus-outline::before{content:"\F0800"}.mdi-account-multiple-remove::before{content:"\F120A"}.mdi-account-multiple-remove-outline::before{content:"\F120B"}.mdi-account-music::before{content:"\F0803"}.mdi-account-music-outline::before{content:"\F0CE9"}.mdi-account-network::before{content:"\F0011"}.mdi-account-network-off::before{content:"\F1AF1"}.mdi-account-network-off-outline::before{content:"\F1AF2"}.mdi-account-network-outline::before{content:"\F0BE6"}.mdi-account-off::before{content:"\F0012"}.mdi-account-off-outline::before{content:"\F0BE7"}.mdi-account-outline::before{content:"\F0013"}.mdi-account-plus::before{content:"\F0014"}.mdi-account-plus-outline::before{content:"\F0801"}.mdi-account-question::before{content:"\F0B59"}.mdi-account-question-outline::before{content:"\F0B5A"}.mdi-account-reactivate::before{content:"\F152B"}.mdi-account-reactivate-outline::before{content:"\F152C"}.mdi-account-remove::before{content:"\F0015"}.mdi-account-remove-outline::before{content:"\F0AED"}.mdi-account-school::before{content:"\F1A20"}.mdi-account-school-outline::before{content:"\F1A21"}.mdi-account-search::before{content:"\F0016"}.mdi-account-search-outline::before{content:"\F0935"}.mdi-account-settings::before{content:"\F0630"}.mdi-account-settings-outline::before{content:"\F10C9"}.mdi-account-star::before{content:"\F0017"}.mdi-account-star-outline::before{content:"\F0BE8"}.mdi-account-supervisor::before{content:"\F0A8B"}.mdi-account-supervisor-circle::before{content:"\F0A8C"}.mdi-account-supervisor-circle-outline::before{content:"\F14EC"}.mdi-account-supervisor-outline::before{content:"\F112D"}.mdi-account-switch::before{content:"\F0019"}.mdi-account-switch-outline::before{content:"\F04CB"}.mdi-account-sync::before{content:"\F191B"}.mdi-account-sync-outline::before{content:"\F191C"}.mdi-account-tag::before{content:"\F1C1B"}.mdi-account-tag-outline::before{content:"\F1C1C"}.mdi-account-tie::before{content:"\F0CE3"}.mdi-account-tie-hat::before{content:"\F1898"}.mdi-account-tie-hat-outline::before{content:"\F1899"}.mdi-account-tie-outline::before{content:"\F10CA"}.mdi-account-tie-voice::before{content:"\F1308"}.mdi-account-tie-voice-off::before{content:"\F130A"}.mdi-account-tie-voice-off-outline::before{content:"\F130B"}.mdi-account-tie-voice-outline::before{content:"\F1309"}.mdi-account-tie-woman::before{content:"\F1A8C"}.mdi-account-voice::before{content:"\F05CB"}.mdi-account-voice-off::before{content:"\F0ED4"}.mdi-account-wrench::before{content:"\F189A"}.mdi-account-wrench-outline::before{content:"\F189B"}.mdi-adjust::before{content:"\F001A"}.mdi-advertisements::before{content:"\F192A"}.mdi-advertisements-off::before{content:"\F192B"}.mdi-air-conditioner::before{content:"\F001B"}.mdi-air-filter::before{content:"\F0D43"}.mdi-air-horn::before{content:"\F0DAC"}.mdi-air-humidifier::before{content:"\F1099"}.mdi-air-humidifier-off::before{content:"\F1466"}.mdi-air-purifier::before{content:"\F0D44"}.mdi-air-purifier-off::before{content:"\F1B57"}.mdi-airbag::before{content:"\F0BE9"}.mdi-airballoon::before{content:"\F001C"}.mdi-airballoon-outline::before{content:"\F100B"}.mdi-airplane::before{content:"\F001D"}.mdi-airplane-alert::before{content:"\F187A"}.mdi-airplane-check::before{content:"\F187B"}.mdi-airplane-clock::before{content:"\F187C"}.mdi-airplane-cog::before{content:"\F187D"}.mdi-airplane-edit::before{content:"\F187E"}.mdi-airplane-landing::before{content:"\F05D4"}.mdi-airplane-marker::before{content:"\F187F"}.mdi-airplane-minus::before{content:"\F1880"}.mdi-airplane-off::before{content:"\F001E"}.mdi-airplane-plus::before{content:"\F1881"}.mdi-airplane-remove::before{content:"\F1882"}.mdi-airplane-search::before{content:"\F1883"}.mdi-airplane-settings::before{content:"\F1884"}.mdi-airplane-takeoff::before{content:"\F05D5"}.mdi-airport::before{content:"\F084B"}.mdi-alarm::before{content:"\F0020"}.mdi-alarm-bell::before{content:"\F078E"}.mdi-alarm-check::before{content:"\F0021"}.mdi-alarm-light::before{content:"\F078F"}.mdi-alarm-light-off::before{content:"\F171E"}.mdi-alarm-light-off-outline::before{content:"\F171F"}.mdi-alarm-light-outline::before{content:"\F0BEA"}.mdi-alarm-multiple::before{content:"\F0022"}.mdi-alarm-note::before{content:"\F0E71"}.mdi-alarm-note-off::before{content:"\F0E72"}.mdi-alarm-off::before{content:"\F0023"}.mdi-alarm-panel::before{content:"\F15C4"}.mdi-alarm-panel-outline::before{content:"\F15C5"}.mdi-alarm-plus::before{content:"\F0024"}.mdi-alarm-snooze::before{content:"\F068E"}.mdi-album::before{content:"\F0025"}.mdi-alert::before{content:"\F0026"}.mdi-alert-box::before{content:"\F0027"}.mdi-alert-box-outline::before{content:"\F0CE4"}.mdi-alert-circle::before{content:"\F0028"}.mdi-alert-circle-check::before{content:"\F11ED"}.mdi-alert-circle-check-outline::before{content:"\F11EE"}.mdi-alert-circle-outline::before{content:"\F05D6"}.mdi-alert-decagram::before{content:"\F06BD"}.mdi-alert-decagram-outline::before{content:"\F0CE5"}.mdi-alert-minus::before{content:"\F14BB"}.mdi-alert-minus-outline::before{content:"\F14BE"}.mdi-alert-octagon::before{content:"\F0029"}.mdi-alert-octagon-outline::before{content:"\F0CE6"}.mdi-alert-octagram::before{content:"\F0767"}.mdi-alert-octagram-outline::before{content:"\F0CE7"}.mdi-alert-outline::before{content:"\F002A"}.mdi-alert-plus::before{content:"\F14BA"}.mdi-alert-plus-outline::before{content:"\F14BD"}.mdi-alert-remove::before{content:"\F14BC"}.mdi-alert-remove-outline::before{content:"\F14BF"}.mdi-alert-rhombus::before{content:"\F11CE"}.mdi-alert-rhombus-outline::before{content:"\F11CF"}.mdi-alien::before{content:"\F089A"}.mdi-alien-outline::before{content:"\F10CB"}.mdi-align-horizontal-center::before{content:"\F11C3"}.mdi-align-horizontal-distribute::before{content:"\F1962"}.mdi-align-horizontal-left::before{content:"\F11C2"}.mdi-align-horizontal-right::before{content:"\F11C4"}.mdi-align-vertical-bottom::before{content:"\F11C5"}.mdi-align-vertical-center::before{content:"\F11C6"}.mdi-align-vertical-distribute::before{content:"\F1963"}.mdi-align-vertical-top::before{content:"\F11C7"}.mdi-all-inclusive::before{content:"\F06BE"}.mdi-all-inclusive-box::before{content:"\F188D"}.mdi-all-inclusive-box-outline::before{content:"\F188E"}.mdi-allergy::before{content:"\F1258"}.mdi-alpha::before{content:"\F002B"}.mdi-alpha-a::before{content:"\F0AEE"}.mdi-alpha-a-box::before{content:"\F0B08"}.mdi-alpha-a-box-outline::before{content:"\F0BEB"}.mdi-alpha-a-circle::before{content:"\F0BEC"}.mdi-alpha-a-circle-outline::before{content:"\F0BED"}.mdi-alpha-b::before{content:"\F0AEF"}.mdi-alpha-b-box::before{content:"\F0B09"}.mdi-alpha-b-box-outline::before{content:"\F0BEE"}.mdi-alpha-b-circle::before{content:"\F0BEF"}.mdi-alpha-b-circle-outline::before{content:"\F0BF0"}.mdi-alpha-c::before{content:"\F0AF0"}.mdi-alpha-c-box::before{content:"\F0B0A"}.mdi-alpha-c-box-outline::before{content:"\F0BF1"}.mdi-alpha-c-circle::before{content:"\F0BF2"}.mdi-alpha-c-circle-outline::before{content:"\F0BF3"}.mdi-alpha-d::before{content:"\F0AF1"}.mdi-alpha-d-box::before{content:"\F0B0B"}.mdi-alpha-d-box-outline::before{content:"\F0BF4"}.mdi-alpha-d-circle::before{content:"\F0BF5"}.mdi-alpha-d-circle-outline::before{content:"\F0BF6"}.mdi-alpha-e::before{content:"\F0AF2"}.mdi-alpha-e-box::before{content:"\F0B0C"}.mdi-alpha-e-box-outline::before{content:"\F0BF7"}.mdi-alpha-e-circle::before{content:"\F0BF8"}.mdi-alpha-e-circle-outline::before{content:"\F0BF9"}.mdi-alpha-f::before{content:"\F0AF3"}.mdi-alpha-f-box::before{content:"\F0B0D"}.mdi-alpha-f-box-outline::before{content:"\F0BFA"}.mdi-alpha-f-circle::before{content:"\F0BFB"}.mdi-alpha-f-circle-outline::before{content:"\F0BFC"}.mdi-alpha-g::before{content:"\F0AF4"}.mdi-alpha-g-box::before{content:"\F0B0E"}.mdi-alpha-g-box-outline::before{content:"\F0BFD"}.mdi-alpha-g-circle::before{content:"\F0BFE"}.mdi-alpha-g-circle-outline::before{content:"\F0BFF"}.mdi-alpha-h::before{content:"\F0AF5"}.mdi-alpha-h-box::before{content:"\F0B0F"}.mdi-alpha-h-box-outline::before{content:"\F0C00"}.mdi-alpha-h-circle::before{content:"\F0C01"}.mdi-alpha-h-circle-outline::before{content:"\F0C02"}.mdi-alpha-i::before{content:"\F0AF6"}.mdi-alpha-i-box::before{content:"\F0B10"}.mdi-alpha-i-box-outline::before{content:"\F0C03"}.mdi-alpha-i-circle::before{content:"\F0C04"}.mdi-alpha-i-circle-outline::before{content:"\F0C05"}.mdi-alpha-j::before{content:"\F0AF7"}.mdi-alpha-j-box::before{content:"\F0B11"}.mdi-alpha-j-box-outline::before{content:"\F0C06"}.mdi-alpha-j-circle::before{content:"\F0C07"}.mdi-alpha-j-circle-outline::before{content:"\F0C08"}.mdi-alpha-k::before{content:"\F0AF8"}.mdi-alpha-k-box::before{content:"\F0B12"}.mdi-alpha-k-box-outline::before{content:"\F0C09"}.mdi-alpha-k-circle::before{content:"\F0C0A"}.mdi-alpha-k-circle-outline::before{content:"\F0C0B"}.mdi-alpha-l::before{content:"\F0AF9"}.mdi-alpha-l-box::before{content:"\F0B13"}.mdi-alpha-l-box-outline::before{content:"\F0C0C"}.mdi-alpha-l-circle::before{content:"\F0C0D"}.mdi-alpha-l-circle-outline::before{content:"\F0C0E"}.mdi-alpha-m::before{content:"\F0AFA"}.mdi-alpha-m-box::before{content:"\F0B14"}.mdi-alpha-m-box-outline::before{content:"\F0C0F"}.mdi-alpha-m-circle::before{content:"\F0C10"}.mdi-alpha-m-circle-outline::before{content:"\F0C11"}.mdi-alpha-n::before{content:"\F0AFB"}.mdi-alpha-n-box::before{content:"\F0B15"}.mdi-alpha-n-box-outline::before{content:"\F0C12"}.mdi-alpha-n-circle::before{content:"\F0C13"}.mdi-alpha-n-circle-outline::before{content:"\F0C14"}.mdi-alpha-o::before{content:"\F0AFC"}.mdi-alpha-o-box::before{content:"\F0B16"}.mdi-alpha-o-box-outline::before{content:"\F0C15"}.mdi-alpha-o-circle::before{content:"\F0C16"}.mdi-alpha-o-circle-outline::before{content:"\F0C17"}.mdi-alpha-p::before{content:"\F0AFD"}.mdi-alpha-p-box::before{content:"\F0B17"}.mdi-alpha-p-box-outline::before{content:"\F0C18"}.mdi-alpha-p-circle::before{content:"\F0C19"}.mdi-alpha-p-circle-outline::before{content:"\F0C1A"}.mdi-alpha-q::before{content:"\F0AFE"}.mdi-alpha-q-box::before{content:"\F0B18"}.mdi-alpha-q-box-outline::before{content:"\F0C1B"}.mdi-alpha-q-circle::before{content:"\F0C1C"}.mdi-alpha-q-circle-outline::before{content:"\F0C1D"}.mdi-alpha-r::before{content:"\F0AFF"}.mdi-alpha-r-box::before{content:"\F0B19"}.mdi-alpha-r-box-outline::before{content:"\F0C1E"}.mdi-alpha-r-circle::before{content:"\F0C1F"}.mdi-alpha-r-circle-outline::before{content:"\F0C20"}.mdi-alpha-s::before{content:"\F0B00"}.mdi-alpha-s-box::before{content:"\F0B1A"}.mdi-alpha-s-box-outline::before{content:"\F0C21"}.mdi-alpha-s-circle::before{content:"\F0C22"}.mdi-alpha-s-circle-outline::before{content:"\F0C23"}.mdi-alpha-t::before{content:"\F0B01"}.mdi-alpha-t-box::before{content:"\F0B1B"}.mdi-alpha-t-box-outline::before{content:"\F0C24"}.mdi-alpha-t-circle::before{content:"\F0C25"}.mdi-alpha-t-circle-outline::before{content:"\F0C26"}.mdi-alpha-u::before{content:"\F0B02"}.mdi-alpha-u-box::before{content:"\F0B1C"}.mdi-alpha-u-box-outline::before{content:"\F0C27"}.mdi-alpha-u-circle::before{content:"\F0C28"}.mdi-alpha-u-circle-outline::before{content:"\F0C29"}.mdi-alpha-v::before{content:"\F0B03"}.mdi-alpha-v-box::before{content:"\F0B1D"}.mdi-alpha-v-box-outline::before{content:"\F0C2A"}.mdi-alpha-v-circle::before{content:"\F0C2B"}.mdi-alpha-v-circle-outline::before{content:"\F0C2C"}.mdi-alpha-w::before{content:"\F0B04"}.mdi-alpha-w-box::before{content:"\F0B1E"}.mdi-alpha-w-box-outline::before{content:"\F0C2D"}.mdi-alpha-w-circle::before{content:"\F0C2E"}.mdi-alpha-w-circle-outline::before{content:"\F0C2F"}.mdi-alpha-x::before{content:"\F0B05"}.mdi-alpha-x-box::before{content:"\F0B1F"}.mdi-alpha-x-box-outline::before{content:"\F0C30"}.mdi-alpha-x-circle::before{content:"\F0C31"}.mdi-alpha-x-circle-outline::before{content:"\F0C32"}.mdi-alpha-y::before{content:"\F0B06"}.mdi-alpha-y-box::before{content:"\F0B20"}.mdi-alpha-y-box-outline::before{content:"\F0C33"}.mdi-alpha-y-circle::before{content:"\F0C34"}.mdi-alpha-y-circle-outline::before{content:"\F0C35"}.mdi-alpha-z::before{content:"\F0B07"}.mdi-alpha-z-box::before{content:"\F0B21"}.mdi-alpha-z-box-outline::before{content:"\F0C36"}.mdi-alpha-z-circle::before{content:"\F0C37"}.mdi-alpha-z-circle-outline::before{content:"\F0C38"}.mdi-alphabet-aurebesh::before{content:"\F132C"}.mdi-alphabet-cyrillic::before{content:"\F132D"}.mdi-alphabet-greek::before{content:"\F132E"}.mdi-alphabet-latin::before{content:"\F132F"}.mdi-alphabet-piqad::before{content:"\F1330"}.mdi-alphabet-tengwar::before{content:"\F1337"}.mdi-alphabetical::before{content:"\F002C"}.mdi-alphabetical-off::before{content:"\F100C"}.mdi-alphabetical-variant::before{content:"\F100D"}.mdi-alphabetical-variant-off::before{content:"\F100E"}.mdi-altimeter::before{content:"\F05D7"}.mdi-ambulance::before{content:"\F002F"}.mdi-ammunition::before{content:"\F0CE8"}.mdi-ampersand::before{content:"\F0A8D"}.mdi-amplifier::before{content:"\F0030"}.mdi-amplifier-off::before{content:"\F11B5"}.mdi-anchor::before{content:"\F0031"}.mdi-android::before{content:"\F0032"}.mdi-android-studio::before{content:"\F0034"}.mdi-angle-acute::before{content:"\F0937"}.mdi-angle-obtuse::before{content:"\F0938"}.mdi-angle-right::before{content:"\F0939"}.mdi-angular::before{content:"\F06B2"}.mdi-angularjs::before{content:"\F06BF"}.mdi-animation::before{content:"\F05D8"}.mdi-animation-outline::before{content:"\F0A8F"}.mdi-animation-play::before{content:"\F093A"}.mdi-animation-play-outline::before{content:"\F0A90"}.mdi-ansible::before{content:"\F109A"}.mdi-antenna::before{content:"\F1119"}.mdi-anvil::before{content:"\F089B"}.mdi-apache-kafka::before{content:"\F100F"}.mdi-api::before{content:"\F109B"}.mdi-api-off::before{content:"\F1257"}.mdi-apple::before{content:"\F0035"}.mdi-apple-finder::before{content:"\F0036"}.mdi-apple-icloud::before{content:"\F0038"}.mdi-apple-ios::before{content:"\F0037"}.mdi-apple-keyboard-caps::before{content:"\F0632"}.mdi-apple-keyboard-command::before{content:"\F0633"}.mdi-apple-keyboard-control::before{content:"\F0634"}.mdi-apple-keyboard-option::before{content:"\F0635"}.mdi-apple-keyboard-shift::before{content:"\F0636"}.mdi-apple-safari::before{content:"\F0039"}.mdi-application::before{content:"\F08C6"}.mdi-application-array::before{content:"\F10F5"}.mdi-application-array-outline::before{content:"\F10F6"}.mdi-application-braces::before{content:"\F10F7"}.mdi-application-braces-outline::before{content:"\F10F8"}.mdi-application-brackets::before{content:"\F0C8B"}.mdi-application-brackets-outline::before{content:"\F0C8C"}.mdi-application-cog::before{content:"\F0675"}.mdi-application-cog-outline::before{content:"\F1577"}.mdi-application-edit::before{content:"\F00AE"}.mdi-application-edit-outline::before{content:"\F0619"}.mdi-application-export::before{content:"\F0DAD"}.mdi-application-import::before{content:"\F0DAE"}.mdi-application-outline::before{content:"\F0614"}.mdi-application-parentheses::before{content:"\F10F9"}.mdi-application-parentheses-outline::before{content:"\F10FA"}.mdi-application-settings::before{content:"\F0B60"}.mdi-application-settings-outline::before{content:"\F1555"}.mdi-application-variable::before{content:"\F10FB"}.mdi-application-variable-outline::before{content:"\F10FC"}.mdi-approximately-equal::before{content:"\F0F9E"}.mdi-approximately-equal-box::before{content:"\F0F9F"}.mdi-apps::before{content:"\F003B"}.mdi-apps-box::before{content:"\F0D46"}.mdi-arch::before{content:"\F08C7"}.mdi-archive::before{content:"\F003C"}.mdi-archive-alert::before{content:"\F14FD"}.mdi-archive-alert-outline::before{content:"\F14FE"}.mdi-archive-arrow-down::before{content:"\F1259"}.mdi-archive-arrow-down-outline::before{content:"\F125A"}.mdi-archive-arrow-up::before{content:"\F125B"}.mdi-archive-arrow-up-outline::before{content:"\F125C"}.mdi-archive-cancel::before{content:"\F174B"}.mdi-archive-cancel-outline::before{content:"\F174C"}.mdi-archive-check::before{content:"\F174D"}.mdi-archive-check-outline::before{content:"\F174E"}.mdi-archive-clock::before{content:"\F174F"}.mdi-archive-clock-outline::before{content:"\F1750"}.mdi-archive-cog::before{content:"\F1751"}.mdi-archive-cog-outline::before{content:"\F1752"}.mdi-archive-edit::before{content:"\F1753"}.mdi-archive-edit-outline::before{content:"\F1754"}.mdi-archive-eye::before{content:"\F1755"}.mdi-archive-eye-outline::before{content:"\F1756"}.mdi-archive-lock::before{content:"\F1757"}.mdi-archive-lock-open::before{content:"\F1758"}.mdi-archive-lock-open-outline::before{content:"\F1759"}.mdi-archive-lock-outline::before{content:"\F175A"}.mdi-archive-marker::before{content:"\F175B"}.mdi-archive-marker-outline::before{content:"\F175C"}.mdi-archive-minus::before{content:"\F175D"}.mdi-archive-minus-outline::before{content:"\F175E"}.mdi-archive-music::before{content:"\F175F"}.mdi-archive-music-outline::before{content:"\F1760"}.mdi-archive-off::before{content:"\F1761"}.mdi-archive-off-outline::before{content:"\F1762"}.mdi-archive-outline::before{content:"\F120E"}.mdi-archive-plus::before{content:"\F1763"}.mdi-archive-plus-outline::before{content:"\F1764"}.mdi-archive-refresh::before{content:"\F1765"}.mdi-archive-refresh-outline::before{content:"\F1766"}.mdi-archive-remove::before{content:"\F1767"}.mdi-archive-remove-outline::before{content:"\F1768"}.mdi-archive-search::before{content:"\F1769"}.mdi-archive-search-outline::before{content:"\F176A"}.mdi-archive-settings::before{content:"\F176B"}.mdi-archive-settings-outline::before{content:"\F176C"}.mdi-archive-star::before{content:"\F176D"}.mdi-archive-star-outline::before{content:"\F176E"}.mdi-archive-sync::before{content:"\F176F"}.mdi-archive-sync-outline::before{content:"\F1770"}.mdi-arm-flex::before{content:"\F0FD7"}.mdi-arm-flex-outline::before{content:"\F0FD6"}.mdi-arrange-bring-forward::before{content:"\F003D"}.mdi-arrange-bring-to-front::before{content:"\F003E"}.mdi-arrange-send-backward::before{content:"\F003F"}.mdi-arrange-send-to-back::before{content:"\F0040"}.mdi-arrow-all::before{content:"\F0041"}.mdi-arrow-bottom-left::before{content:"\F0042"}.mdi-arrow-bottom-left-bold-box::before{content:"\F1964"}.mdi-arrow-bottom-left-bold-box-outline::before{content:"\F1965"}.mdi-arrow-bottom-left-bold-outline::before{content:"\F09B7"}.mdi-arrow-bottom-left-thick::before{content:"\F09B8"}.mdi-arrow-bottom-left-thin::before{content:"\F19B6"}.mdi-arrow-bottom-left-thin-circle-outline::before{content:"\F1596"}.mdi-arrow-bottom-right::before{content:"\F0043"}.mdi-arrow-bottom-right-bold-box::before{content:"\F1966"}.mdi-arrow-bottom-right-bold-box-outline::before{content:"\F1967"}.mdi-arrow-bottom-right-bold-outline::before{content:"\F09B9"}.mdi-arrow-bottom-right-thick::before{content:"\F09BA"}.mdi-arrow-bottom-right-thin::before{content:"\F19B7"}.mdi-arrow-bottom-right-thin-circle-outline::before{content:"\F1595"}.mdi-arrow-collapse::before{content:"\F0615"}.mdi-arrow-collapse-all::before{content:"\F0044"}.mdi-arrow-collapse-down::before{content:"\F0792"}.mdi-arrow-collapse-horizontal::before{content:"\F084C"}.mdi-arrow-collapse-left::before{content:"\F0793"}.mdi-arrow-collapse-right::before{content:"\F0794"}.mdi-arrow-collapse-up::before{content:"\F0795"}.mdi-arrow-collapse-vertical::before{content:"\F084D"}.mdi-arrow-decision::before{content:"\F09BB"}.mdi-arrow-decision-auto::before{content:"\F09BC"}.mdi-arrow-decision-auto-outline::before{content:"\F09BD"}.mdi-arrow-decision-outline::before{content:"\F09BE"}.mdi-arrow-down::before{content:"\F0045"}.mdi-arrow-down-bold::before{content:"\F072E"}.mdi-arrow-down-bold-box::before{content:"\F072F"}.mdi-arrow-down-bold-box-outline::before{content:"\F0730"}.mdi-arrow-down-bold-circle::before{content:"\F0047"}.mdi-arrow-down-bold-circle-outline::before{content:"\F0048"}.mdi-arrow-down-bold-hexagon-outline::before{content:"\F0049"}.mdi-arrow-down-bold-outline::before{content:"\F09BF"}.mdi-arrow-down-box::before{content:"\F06C0"}.mdi-arrow-down-circle::before{content:"\F0CDB"}.mdi-arrow-down-circle-outline::before{content:"\F0CDC"}.mdi-arrow-down-drop-circle::before{content:"\F004A"}.mdi-arrow-down-drop-circle-outline::before{content:"\F004B"}.mdi-arrow-down-left::before{content:"\F17A1"}.mdi-arrow-down-left-bold::before{content:"\F17A2"}.mdi-arrow-down-right::before{content:"\F17A3"}.mdi-arrow-down-right-bold::before{content:"\F17A4"}.mdi-arrow-down-thick::before{content:"\F0046"}.mdi-arrow-down-thin::before{content:"\F19B3"}.mdi-arrow-down-thin-circle-outline::before{content:"\F1599"}.mdi-arrow-expand::before{content:"\F0616"}.mdi-arrow-expand-all::before{content:"\F004C"}.mdi-arrow-expand-down::before{content:"\F0796"}.mdi-arrow-expand-horizontal::before{content:"\F084E"}.mdi-arrow-expand-left::before{content:"\F0797"}.mdi-arrow-expand-right::before{content:"\F0798"}.mdi-arrow-expand-up::before{content:"\F0799"}.mdi-arrow-expand-vertical::before{content:"\F084F"}.mdi-arrow-horizontal-lock::before{content:"\F115B"}.mdi-arrow-left::before{content:"\F004D"}.mdi-arrow-left-bold::before{content:"\F0731"}.mdi-arrow-left-bold-box::before{content:"\F0732"}.mdi-arrow-left-bold-box-outline::before{content:"\F0733"}.mdi-arrow-left-bold-circle::before{content:"\F004F"}.mdi-arrow-left-bold-circle-outline::before{content:"\F0050"}.mdi-arrow-left-bold-hexagon-outline::before{content:"\F0051"}.mdi-arrow-left-bold-outline::before{content:"\F09C0"}.mdi-arrow-left-bottom::before{content:"\F17A5"}.mdi-arrow-left-bottom-bold::before{content:"\F17A6"}.mdi-arrow-left-box::before{content:"\F06C1"}.mdi-arrow-left-circle::before{content:"\F0CDD"}.mdi-arrow-left-circle-outline::before{content:"\F0CDE"}.mdi-arrow-left-drop-circle::before{content:"\F0052"}.mdi-arrow-left-drop-circle-outline::before{content:"\F0053"}.mdi-arrow-left-right::before{content:"\F0E73"}.mdi-arrow-left-right-bold::before{content:"\F0E74"}.mdi-arrow-left-right-bold-outline::before{content:"\F09C1"}.mdi-arrow-left-thick::before{content:"\F004E"}.mdi-arrow-left-thin::before{content:"\F19B1"}.mdi-arrow-left-thin-circle-outline::before{content:"\F159A"}.mdi-arrow-left-top::before{content:"\F17A7"}.mdi-arrow-left-top-bold::before{content:"\F17A8"}.mdi-arrow-oscillating::before{content:"\F1C91"}.mdi-arrow-oscillating-off::before{content:"\F1C92"}.mdi-arrow-projectile::before{content:"\F1840"}.mdi-arrow-projectile-multiple::before{content:"\F183F"}.mdi-arrow-right::before{content:"\F0054"}.mdi-arrow-right-bold::before{content:"\F0734"}.mdi-arrow-right-bold-box::before{content:"\F0735"}.mdi-arrow-right-bold-box-outline::before{content:"\F0736"}.mdi-arrow-right-bold-circle::before{content:"\F0056"}.mdi-arrow-right-bold-circle-outline::before{content:"\F0057"}.mdi-arrow-right-bold-hexagon-outline::before{content:"\F0058"}.mdi-arrow-right-bold-outline::before{content:"\F09C2"}.mdi-arrow-right-bottom::before{content:"\F17A9"}.mdi-arrow-right-bottom-bold::before{content:"\F17AA"}.mdi-arrow-right-box::before{content:"\F06C2"}.mdi-arrow-right-circle::before{content:"\F0CDF"}.mdi-arrow-right-circle-outline::before{content:"\F0CE0"}.mdi-arrow-right-drop-circle::before{content:"\F0059"}.mdi-arrow-right-drop-circle-outline::before{content:"\F005A"}.mdi-arrow-right-thick::before{content:"\F0055"}.mdi-arrow-right-thin::before{content:"\F19B0"}.mdi-arrow-right-thin-circle-outline::before{content:"\F1598"}.mdi-arrow-right-top::before{content:"\F17AB"}.mdi-arrow-right-top-bold::before{content:"\F17AC"}.mdi-arrow-split-horizontal::before{content:"\F093B"}.mdi-arrow-split-vertical::before{content:"\F093C"}.mdi-arrow-top-left::before{content:"\F005B"}.mdi-arrow-top-left-bold-box::before{content:"\F1968"}.mdi-arrow-top-left-bold-box-outline::before{content:"\F1969"}.mdi-arrow-top-left-bold-outline::before{content:"\F09C3"}.mdi-arrow-top-left-bottom-right::before{content:"\F0E75"}.mdi-arrow-top-left-bottom-right-bold::before{content:"\F0E76"}.mdi-arrow-top-left-thick::before{content:"\F09C4"}.mdi-arrow-top-left-thin::before{content:"\F19B5"}.mdi-arrow-top-left-thin-circle-outline::before{content:"\F1593"}.mdi-arrow-top-right::before{content:"\F005C"}.mdi-arrow-top-right-bold-box::before{content:"\F196A"}.mdi-arrow-top-right-bold-box-outline::before{content:"\F196B"}.mdi-arrow-top-right-bold-outline::before{content:"\F09C5"}.mdi-arrow-top-right-bottom-left::before{content:"\F0E77"}.mdi-arrow-top-right-bottom-left-bold::before{content:"\F0E78"}.mdi-arrow-top-right-thick::before{content:"\F09C6"}.mdi-arrow-top-right-thin::before{content:"\F19B4"}.mdi-arrow-top-right-thin-circle-outline::before{content:"\F1594"}.mdi-arrow-u-down-left::before{content:"\F17AD"}.mdi-arrow-u-down-left-bold::before{content:"\F17AE"}.mdi-arrow-u-down-right::before{content:"\F17AF"}.mdi-arrow-u-down-right-bold::before{content:"\F17B0"}.mdi-arrow-u-left-bottom::before{content:"\F17B1"}.mdi-arrow-u-left-bottom-bold::before{content:"\F17B2"}.mdi-arrow-u-left-top::before{content:"\F17B3"}.mdi-arrow-u-left-top-bold::before{content:"\F17B4"}.mdi-arrow-u-right-bottom::before{content:"\F17B5"}.mdi-arrow-u-right-bottom-bold::before{content:"\F17B6"}.mdi-arrow-u-right-top::before{content:"\F17B7"}.mdi-arrow-u-right-top-bold::before{content:"\F17B8"}.mdi-arrow-u-up-left::before{content:"\F17B9"}.mdi-arrow-u-up-left-bold::before{content:"\F17BA"}.mdi-arrow-u-up-right::before{content:"\F17BB"}.mdi-arrow-u-up-right-bold::before{content:"\F17BC"}.mdi-arrow-up::before{content:"\F005D"}.mdi-arrow-up-bold::before{content:"\F0737"}.mdi-arrow-up-bold-box::before{content:"\F0738"}.mdi-arrow-up-bold-box-outline::before{content:"\F0739"}.mdi-arrow-up-bold-circle::before{content:"\F005F"}.mdi-arrow-up-bold-circle-outline::before{content:"\F0060"}.mdi-arrow-up-bold-hexagon-outline::before{content:"\F0061"}.mdi-arrow-up-bold-outline::before{content:"\F09C7"}.mdi-arrow-up-box::before{content:"\F06C3"}.mdi-arrow-up-circle::before{content:"\F0CE1"}.mdi-arrow-up-circle-outline::before{content:"\F0CE2"}.mdi-arrow-up-down::before{content:"\F0E79"}.mdi-arrow-up-down-bold::before{content:"\F0E7A"}.mdi-arrow-up-down-bold-outline::before{content:"\F09C8"}.mdi-arrow-up-drop-circle::before{content:"\F0062"}.mdi-arrow-up-drop-circle-outline::before{content:"\F0063"}.mdi-arrow-up-left::before{content:"\F17BD"}.mdi-arrow-up-left-bold::before{content:"\F17BE"}.mdi-arrow-up-right::before{content:"\F17BF"}.mdi-arrow-up-right-bold::before{content:"\F17C0"}.mdi-arrow-up-thick::before{content:"\F005E"}.mdi-arrow-up-thin::before{content:"\F19B2"}.mdi-arrow-up-thin-circle-outline::before{content:"\F1597"}.mdi-arrow-vertical-lock::before{content:"\F115C"}.mdi-artboard::before{content:"\F1B9A"}.mdi-artstation::before{content:"\F0B5B"}.mdi-aspect-ratio::before{content:"\F0A24"}.mdi-assistant::before{content:"\F0064"}.mdi-asterisk::before{content:"\F06C4"}.mdi-asterisk-circle-outline::before{content:"\F1A27"}.mdi-at::before{content:"\F0065"}.mdi-atlassian::before{content:"\F0804"}.mdi-atm::before{content:"\F0D47"}.mdi-atom::before{content:"\F0768"}.mdi-atom-variant::before{content:"\F0E7B"}.mdi-attachment::before{content:"\F0066"}.mdi-attachment-check::before{content:"\F1AC1"}.mdi-attachment-lock::before{content:"\F19C4"}.mdi-attachment-minus::before{content:"\F1AC2"}.mdi-attachment-off::before{content:"\F1AC3"}.mdi-attachment-plus::before{content:"\F1AC4"}.mdi-attachment-remove::before{content:"\F1AC5"}.mdi-atv::before{content:"\F1B70"}.mdi-audio-input-rca::before{content:"\F186B"}.mdi-audio-input-stereo-minijack::before{content:"\F186C"}.mdi-audio-input-xlr::before{content:"\F186D"}.mdi-audio-video::before{content:"\F093D"}.mdi-audio-video-off::before{content:"\F11B6"}.mdi-augmented-reality::before{content:"\F0850"}.mdi-aurora::before{content:"\F1BB9"}.mdi-auto-download::before{content:"\F137E"}.mdi-auto-fix::before{content:"\F0068"}.mdi-auto-mode::before{content:"\F1C20"}.mdi-auto-upload::before{content:"\F0069"}.mdi-autorenew::before{content:"\F006A"}.mdi-autorenew-off::before{content:"\F19E7"}.mdi-av-timer::before{content:"\F006B"}.mdi-awning::before{content:"\F1B87"}.mdi-awning-outline::before{content:"\F1B88"}.mdi-aws::before{content:"\F0E0F"}.mdi-axe::before{content:"\F08C8"}.mdi-axe-battle::before{content:"\F1842"}.mdi-axis::before{content:"\F0D48"}.mdi-axis-arrow::before{content:"\F0D49"}.mdi-axis-arrow-info::before{content:"\F140E"}.mdi-axis-arrow-lock::before{content:"\F0D4A"}.mdi-axis-lock::before{content:"\F0D4B"}.mdi-axis-x-arrow::before{content:"\F0D4C"}.mdi-axis-x-arrow-lock::before{content:"\F0D4D"}.mdi-axis-x-rotate-clockwise::before{content:"\F0D4E"}.mdi-axis-x-rotate-counterclockwise::before{content:"\F0D4F"}.mdi-axis-x-y-arrow-lock::before{content:"\F0D50"}.mdi-axis-y-arrow::before{content:"\F0D51"}.mdi-axis-y-arrow-lock::before{content:"\F0D52"}.mdi-axis-y-rotate-clockwise::before{content:"\F0D53"}.mdi-axis-y-rotate-counterclockwise::before{content:"\F0D54"}.mdi-axis-z-arrow::before{content:"\F0D55"}.mdi-axis-z-arrow-lock::before{content:"\F0D56"}.mdi-axis-z-rotate-clockwise::before{content:"\F0D57"}.mdi-axis-z-rotate-counterclockwise::before{content:"\F0D58"}.mdi-babel::before{content:"\F0A25"}.mdi-baby::before{content:"\F006C"}.mdi-baby-bottle::before{content:"\F0F39"}.mdi-baby-bottle-outline::before{content:"\F0F3A"}.mdi-baby-buggy::before{content:"\F13E0"}.mdi-baby-buggy-off::before{content:"\F1AF3"}.mdi-baby-carriage::before{content:"\F068F"}.mdi-baby-carriage-off::before{content:"\F0FA0"}.mdi-baby-face::before{content:"\F0E7C"}.mdi-baby-face-outline::before{content:"\F0E7D"}.mdi-backburger::before{content:"\F006D"}.mdi-backspace::before{content:"\F006E"}.mdi-backspace-outline::before{content:"\F0B5C"}.mdi-backspace-reverse::before{content:"\F0E7E"}.mdi-backspace-reverse-outline::before{content:"\F0E7F"}.mdi-backup-restore::before{content:"\F006F"}.mdi-bacteria::before{content:"\F0ED5"}.mdi-bacteria-outline::before{content:"\F0ED6"}.mdi-badge-account::before{content:"\F0DA7"}.mdi-badge-account-alert::before{content:"\F0DA8"}.mdi-badge-account-alert-outline::before{content:"\F0DA9"}.mdi-badge-account-horizontal::before{content:"\F0E0D"}.mdi-badge-account-horizontal-outline::before{content:"\F0E0E"}.mdi-badge-account-outline::before{content:"\F0DAA"}.mdi-badminton::before{content:"\F0851"}.mdi-bag-carry-on::before{content:"\F0F3B"}.mdi-bag-carry-on-check::before{content:"\F0D65"}.mdi-bag-carry-on-off::before{content:"\F0F3C"}.mdi-bag-checked::before{content:"\F0F3D"}.mdi-bag-personal::before{content:"\F0E10"}.mdi-bag-personal-off::before{content:"\F0E11"}.mdi-bag-personal-off-outline::before{content:"\F0E12"}.mdi-bag-personal-outline::before{content:"\F0E13"}.mdi-bag-personal-plus::before{content:"\F1CA4"}.mdi-bag-personal-plus-outline::before{content:"\F1CA5"}.mdi-bag-personal-tag::before{content:"\F1B0C"}.mdi-bag-personal-tag-outline::before{content:"\F1B0D"}.mdi-bag-suitcase::before{content:"\F158B"}.mdi-bag-suitcase-off::before{content:"\F158D"}.mdi-bag-suitcase-off-outline::before{content:"\F158E"}.mdi-bag-suitcase-outline::before{content:"\F158C"}.mdi-baguette::before{content:"\F0F3E"}.mdi-balcony::before{content:"\F1817"}.mdi-balloon::before{content:"\F0A26"}.mdi-ballot::before{content:"\F09C9"}.mdi-ballot-outline::before{content:"\F09CA"}.mdi-ballot-recount::before{content:"\F0C39"}.mdi-ballot-recount-outline::before{content:"\F0C3A"}.mdi-bandage::before{content:"\F0DAF"}.mdi-bank::before{content:"\F0070"}.mdi-bank-check::before{content:"\F1655"}.mdi-bank-circle::before{content:"\F1C03"}.mdi-bank-circle-outline::before{content:"\F1C04"}.mdi-bank-minus::before{content:"\F0DB0"}.mdi-bank-off::before{content:"\F1656"}.mdi-bank-off-outline::before{content:"\F1657"}.mdi-bank-outline::before{content:"\F0E80"}.mdi-bank-plus::before{content:"\F0DB1"}.mdi-bank-remove::before{content:"\F0DB2"}.mdi-bank-transfer::before{content:"\F0A27"}.mdi-bank-transfer-in::before{content:"\F0A28"}.mdi-bank-transfer-out::before{content:"\F0A29"}.mdi-barcode::before{content:"\F0071"}.mdi-barcode-off::before{content:"\F1236"}.mdi-barcode-scan::before{content:"\F0072"}.mdi-barley::before{content:"\F0073"}.mdi-barley-off::before{content:"\F0B5D"}.mdi-barn::before{content:"\F0B5E"}.mdi-barrel::before{content:"\F0074"}.mdi-barrel-outline::before{content:"\F1A28"}.mdi-baseball::before{content:"\F0852"}.mdi-baseball-bat::before{content:"\F0853"}.mdi-baseball-diamond::before{content:"\F15EC"}.mdi-baseball-diamond-outline::before{content:"\F15ED"}.mdi-baseball-outline::before{content:"\F1C5A"}.mdi-bash::before{content:"\F1183"}.mdi-basket::before{content:"\F0076"}.mdi-basket-check::before{content:"\F18E5"}.mdi-basket-check-outline::before{content:"\F18E6"}.mdi-basket-fill::before{content:"\F0077"}.mdi-basket-minus::before{content:"\F1523"}.mdi-basket-minus-outline::before{content:"\F1524"}.mdi-basket-off::before{content:"\F1525"}.mdi-basket-off-outline::before{content:"\F1526"}.mdi-basket-outline::before{content:"\F1181"}.mdi-basket-plus::before{content:"\F1527"}.mdi-basket-plus-outline::before{content:"\F1528"}.mdi-basket-remove::before{content:"\F1529"}.mdi-basket-remove-outline::before{content:"\F152A"}.mdi-basket-unfill::before{content:"\F0078"}.mdi-basketball::before{content:"\F0806"}.mdi-basketball-hoop::before{content:"\F0C3B"}.mdi-basketball-hoop-outline::before{content:"\F0C3C"}.mdi-bat::before{content:"\F0B5F"}.mdi-bathtub::before{content:"\F1818"}.mdi-bathtub-outline::before{content:"\F1819"}.mdi-battery::before{content:"\F0079"}.mdi-battery-10::before{content:"\F007A"}.mdi-battery-10-bluetooth::before{content:"\F093E"}.mdi-battery-20::before{content:"\F007B"}.mdi-battery-20-bluetooth::before{content:"\F093F"}.mdi-battery-30::before{content:"\F007C"}.mdi-battery-30-bluetooth::before{content:"\F0940"}.mdi-battery-40::before{content:"\F007D"}.mdi-battery-40-bluetooth::before{content:"\F0941"}.mdi-battery-50::before{content:"\F007E"}.mdi-battery-50-bluetooth::before{content:"\F0942"}.mdi-battery-60::before{content:"\F007F"}.mdi-battery-60-bluetooth::before{content:"\F0943"}.mdi-battery-70::before{content:"\F0080"}.mdi-battery-70-bluetooth::before{content:"\F0944"}.mdi-battery-80::before{content:"\F0081"}.mdi-battery-80-bluetooth::before{content:"\F0945"}.mdi-battery-90::before{content:"\F0082"}.mdi-battery-90-bluetooth::before{content:"\F0946"}.mdi-battery-alert::before{content:"\F0083"}.mdi-battery-alert-bluetooth::before{content:"\F0947"}.mdi-battery-alert-variant::before{content:"\F10CC"}.mdi-battery-alert-variant-outline::before{content:"\F10CD"}.mdi-battery-arrow-down::before{content:"\F17DE"}.mdi-battery-arrow-down-outline::before{content:"\F17DF"}.mdi-battery-arrow-up::before{content:"\F17E0"}.mdi-battery-arrow-up-outline::before{content:"\F17E1"}.mdi-battery-bluetooth::before{content:"\F0948"}.mdi-battery-bluetooth-variant::before{content:"\F0949"}.mdi-battery-charging::before{content:"\F0084"}.mdi-battery-charging-10::before{content:"\F089C"}.mdi-battery-charging-100::before{content:"\F0085"}.mdi-battery-charging-20::before{content:"\F0086"}.mdi-battery-charging-30::before{content:"\F0087"}.mdi-battery-charging-40::before{content:"\F0088"}.mdi-battery-charging-50::before{content:"\F089D"}.mdi-battery-charging-60::before{content:"\F0089"}.mdi-battery-charging-70::before{content:"\F089E"}.mdi-battery-charging-80::before{content:"\F008A"}.mdi-battery-charging-90::before{content:"\F008B"}.mdi-battery-charging-high::before{content:"\F12A6"}.mdi-battery-charging-low::before{content:"\F12A4"}.mdi-battery-charging-medium::before{content:"\F12A5"}.mdi-battery-charging-outline::before{content:"\F089F"}.mdi-battery-charging-wireless::before{content:"\F0807"}.mdi-battery-charging-wireless-10::before{content:"\F0808"}.mdi-battery-charging-wireless-20::before{content:"\F0809"}.mdi-battery-charging-wireless-30::before{content:"\F080A"}.mdi-battery-charging-wireless-40::before{content:"\F080B"}.mdi-battery-charging-wireless-50::before{content:"\F080C"}.mdi-battery-charging-wireless-60::before{content:"\F080D"}.mdi-battery-charging-wireless-70::before{content:"\F080E"}.mdi-battery-charging-wireless-80::before{content:"\F080F"}.mdi-battery-charging-wireless-90::before{content:"\F0810"}.mdi-battery-charging-wireless-alert::before{content:"\F0811"}.mdi-battery-charging-wireless-outline::before{content:"\F0812"}.mdi-battery-check::before{content:"\F17E2"}.mdi-battery-check-outline::before{content:"\F17E3"}.mdi-battery-clock::before{content:"\F19E5"}.mdi-battery-clock-outline::before{content:"\F19E6"}.mdi-battery-heart::before{content:"\F120F"}.mdi-battery-heart-outline::before{content:"\F1210"}.mdi-battery-heart-variant::before{content:"\F1211"}.mdi-battery-high::before{content:"\F12A3"}.mdi-battery-lock::before{content:"\F179C"}.mdi-battery-lock-open::before{content:"\F179D"}.mdi-battery-low::before{content:"\F12A1"}.mdi-battery-medium::before{content:"\F12A2"}.mdi-battery-minus::before{content:"\F17E4"}.mdi-battery-minus-outline::before{content:"\F17E5"}.mdi-battery-minus-variant::before{content:"\F008C"}.mdi-battery-negative::before{content:"\F008D"}.mdi-battery-off::before{content:"\F125D"}.mdi-battery-off-outline::before{content:"\F125E"}.mdi-battery-outline::before{content:"\F008E"}.mdi-battery-plus::before{content:"\F17E6"}.mdi-battery-plus-outline::before{content:"\F17E7"}.mdi-battery-plus-variant::before{content:"\F008F"}.mdi-battery-positive::before{content:"\F0090"}.mdi-battery-remove::before{content:"\F17E8"}.mdi-battery-remove-outline::before{content:"\F17E9"}.mdi-battery-sync::before{content:"\F1834"}.mdi-battery-sync-outline::before{content:"\F1835"}.mdi-battery-unknown::before{content:"\F0091"}.mdi-battery-unknown-bluetooth::before{content:"\F094A"}.mdi-beach::before{content:"\F0092"}.mdi-beaker::before{content:"\F0CEA"}.mdi-beaker-alert::before{content:"\F1229"}.mdi-beaker-alert-outline::before{content:"\F122A"}.mdi-beaker-check::before{content:"\F122B"}.mdi-beaker-check-outline::before{content:"\F122C"}.mdi-beaker-minus::before{content:"\F122D"}.mdi-beaker-minus-outline::before{content:"\F122E"}.mdi-beaker-outline::before{content:"\F0690"}.mdi-beaker-plus::before{content:"\F122F"}.mdi-beaker-plus-outline::before{content:"\F1230"}.mdi-beaker-question::before{content:"\F1231"}.mdi-beaker-question-outline::before{content:"\F1232"}.mdi-beaker-remove::before{content:"\F1233"}.mdi-beaker-remove-outline::before{content:"\F1234"}.mdi-bed::before{content:"\F02E3"}.mdi-bed-clock::before{content:"\F1B94"}.mdi-bed-double::before{content:"\F0FD4"}.mdi-bed-double-outline::before{content:"\F0FD3"}.mdi-bed-empty::before{content:"\F08A0"}.mdi-bed-king::before{content:"\F0FD2"}.mdi-bed-king-outline::before{content:"\F0FD1"}.mdi-bed-outline::before{content:"\F0099"}.mdi-bed-queen::before{content:"\F0FD0"}.mdi-bed-queen-outline::before{content:"\F0FDB"}.mdi-bed-single::before{content:"\F106D"}.mdi-bed-single-outline::before{content:"\F106E"}.mdi-bee::before{content:"\F0FA1"}.mdi-bee-flower::before{content:"\F0FA2"}.mdi-beehive-off-outline::before{content:"\F13ED"}.mdi-beehive-outline::before{content:"\F10CE"}.mdi-beekeeper::before{content:"\F14E2"}.mdi-beer::before{content:"\F0098"}.mdi-beer-outline::before{content:"\F130C"}.mdi-bell::before{content:"\F009A"}.mdi-bell-alert::before{content:"\F0D59"}.mdi-bell-alert-outline::before{content:"\F0E81"}.mdi-bell-badge::before{content:"\F116B"}.mdi-bell-badge-outline::before{content:"\F0178"}.mdi-bell-cancel::before{content:"\F13E7"}.mdi-bell-cancel-outline::before{content:"\F13E8"}.mdi-bell-check::before{content:"\F11E5"}.mdi-bell-check-outline::before{content:"\F11E6"}.mdi-bell-circle::before{content:"\F0D5A"}.mdi-bell-circle-outline::before{content:"\F0D5B"}.mdi-bell-cog::before{content:"\F1A29"}.mdi-bell-cog-outline::before{content:"\F1A2A"}.mdi-bell-minus::before{content:"\F13E9"}.mdi-bell-minus-outline::before{content:"\F13EA"}.mdi-bell-off::before{content:"\F009B"}.mdi-bell-off-outline::before{content:"\F0A91"}.mdi-bell-outline::before{content:"\F009C"}.mdi-bell-plus::before{content:"\F009D"}.mdi-bell-plus-outline::before{content:"\F0A92"}.mdi-bell-remove::before{content:"\F13EB"}.mdi-bell-remove-outline::before{content:"\F13EC"}.mdi-bell-ring::before{content:"\F009E"}.mdi-bell-ring-outline::before{content:"\F009F"}.mdi-bell-sleep::before{content:"\F00A0"}.mdi-bell-sleep-outline::before{content:"\F0A93"}.mdi-bench::before{content:"\F1C21"}.mdi-bench-back::before{content:"\F1C22"}.mdi-beta::before{content:"\F00A1"}.mdi-betamax::before{content:"\F09CB"}.mdi-biathlon::before{content:"\F0E14"}.mdi-bicycle::before{content:"\F109C"}.mdi-bicycle-basket::before{content:"\F1235"}.mdi-bicycle-cargo::before{content:"\F189C"}.mdi-bicycle-electric::before{content:"\F15B4"}.mdi-bicycle-penny-farthing::before{content:"\F15E9"}.mdi-bike::before{content:"\F00A3"}.mdi-bike-fast::before{content:"\F111F"}.mdi-bike-pedal::before{content:"\F1C23"}.mdi-bike-pedal-clipless::before{content:"\F1C24"}.mdi-bike-pedal-mountain::before{content:"\F1C25"}.mdi-billboard::before{content:"\F1010"}.mdi-billiards::before{content:"\F0B61"}.mdi-billiards-rack::before{content:"\F0B62"}.mdi-binoculars::before{content:"\F00A5"}.mdi-bio::before{content:"\F00A6"}.mdi-biohazard::before{content:"\F00A7"}.mdi-bird::before{content:"\F15C6"}.mdi-bitbucket::before{content:"\F00A8"}.mdi-bitcoin::before{content:"\F0813"}.mdi-black-mesa::before{content:"\F00A9"}.mdi-blender::before{content:"\F0CEB"}.mdi-blender-outline::before{content:"\F181A"}.mdi-blender-software::before{content:"\F00AB"}.mdi-blinds::before{content:"\F00AC"}.mdi-blinds-horizontal::before{content:"\F1A2B"}.mdi-blinds-horizontal-closed::before{content:"\F1A2C"}.mdi-blinds-open::before{content:"\F1011"}.mdi-blinds-vertical::before{content:"\F1A2D"}.mdi-blinds-vertical-closed::before{content:"\F1A2E"}.mdi-block-helper::before{content:"\F00AD"}.mdi-blood-bag::before{content:"\F0CEC"}.mdi-bluetooth::before{content:"\F00AF"}.mdi-bluetooth-audio::before{content:"\F00B0"}.mdi-bluetooth-connect::before{content:"\F00B1"}.mdi-bluetooth-off::before{content:"\F00B2"}.mdi-bluetooth-settings::before{content:"\F00B3"}.mdi-bluetooth-transfer::before{content:"\F00B4"}.mdi-blur::before{content:"\F00B5"}.mdi-blur-linear::before{content:"\F00B6"}.mdi-blur-off::before{content:"\F00B7"}.mdi-blur-radial::before{content:"\F00B8"}.mdi-bolt::before{content:"\F0DB3"}.mdi-bomb::before{content:"\F0691"}.mdi-bomb-off::before{content:"\F06C5"}.mdi-bone::before{content:"\F00B9"}.mdi-bone-off::before{content:"\F19E0"}.mdi-book::before{content:"\F00BA"}.mdi-book-account::before{content:"\F13AD"}.mdi-book-account-outline::before{content:"\F13AE"}.mdi-book-alert::before{content:"\F167C"}.mdi-book-alert-outline::before{content:"\F167D"}.mdi-book-alphabet::before{content:"\F061D"}.mdi-book-arrow-down::before{content:"\F167E"}.mdi-book-arrow-down-outline::before{content:"\F167F"}.mdi-book-arrow-left::before{content:"\F1680"}.mdi-book-arrow-left-outline::before{content:"\F1681"}.mdi-book-arrow-right::before{content:"\F1682"}.mdi-book-arrow-right-outline::before{content:"\F1683"}.mdi-book-arrow-up::before{content:"\F1684"}.mdi-book-arrow-up-outline::before{content:"\F1685"}.mdi-book-cancel::before{content:"\F1686"}.mdi-book-cancel-outline::before{content:"\F1687"}.mdi-book-check::before{content:"\F14F3"}.mdi-book-check-outline::before{content:"\F14F4"}.mdi-book-clock::before{content:"\F1688"}.mdi-book-clock-outline::before{content:"\F1689"}.mdi-book-cog::before{content:"\F168A"}.mdi-book-cog-outline::before{content:"\F168B"}.mdi-book-cross::before{content:"\F00A2"}.mdi-book-edit::before{content:"\F168C"}.mdi-book-edit-outline::before{content:"\F168D"}.mdi-book-education::before{content:"\F16C9"}.mdi-book-education-outline::before{content:"\F16CA"}.mdi-book-heart::before{content:"\F1A1D"}.mdi-book-heart-outline::before{content:"\F1A1E"}.mdi-book-information-variant::before{content:"\F106F"}.mdi-book-lock::before{content:"\F079A"}.mdi-book-lock-open::before{content:"\F079B"}.mdi-book-lock-open-outline::before{content:"\F168E"}.mdi-book-lock-outline::before{content:"\F168F"}.mdi-book-marker::before{content:"\F1690"}.mdi-book-marker-outline::before{content:"\F1691"}.mdi-book-minus::before{content:"\F05D9"}.mdi-book-minus-multiple::before{content:"\F0A94"}.mdi-book-minus-multiple-outline::before{content:"\F090B"}.mdi-book-minus-outline::before{content:"\F1692"}.mdi-book-multiple::before{content:"\F00BB"}.mdi-book-multiple-outline::before{content:"\F0436"}.mdi-book-music::before{content:"\F0067"}.mdi-book-music-outline::before{content:"\F1693"}.mdi-book-off::before{content:"\F1694"}.mdi-book-off-outline::before{content:"\F1695"}.mdi-book-open::before{content:"\F00BD"}.mdi-book-open-blank-variant::before{content:"\F00BE"}.mdi-book-open-blank-variant-outline::before{content:"\F1CCB"}.mdi-book-open-outline::before{content:"\F0B63"}.mdi-book-open-page-variant::before{content:"\F05DA"}.mdi-book-open-page-variant-outline::before{content:"\F15D6"}.mdi-book-open-variant::before{content:"\F14F7"}.mdi-book-open-variant-outline::before{content:"\F1CCC"}.mdi-book-outline::before{content:"\F0B64"}.mdi-book-play::before{content:"\F0E82"}.mdi-book-play-outline::before{content:"\F0E83"}.mdi-book-plus::before{content:"\F05DB"}.mdi-book-plus-multiple::before{content:"\F0A95"}.mdi-book-plus-multiple-outline::before{content:"\F0ADE"}.mdi-book-plus-outline::before{content:"\F1696"}.mdi-book-refresh::before{content:"\F1697"}.mdi-book-refresh-outline::before{content:"\F1698"}.mdi-book-remove::before{content:"\F0A97"}.mdi-book-remove-multiple::before{content:"\F0A96"}.mdi-book-remove-multiple-outline::before{content:"\F04CA"}.mdi-book-remove-outline::before{content:"\F1699"}.mdi-book-search::before{content:"\F0E84"}.mdi-book-search-outline::before{content:"\F0E85"}.mdi-book-settings::before{content:"\F169A"}.mdi-book-settings-outline::before{content:"\F169B"}.mdi-book-sync::before{content:"\F169C"}.mdi-book-sync-outline::before{content:"\F16C8"}.mdi-book-variant::before{content:"\F00BF"}.mdi-bookmark::before{content:"\F00C0"}.mdi-bookmark-box::before{content:"\F1B75"}.mdi-bookmark-box-multiple::before{content:"\F196C"}.mdi-bookmark-box-multiple-outline::before{content:"\F196D"}.mdi-bookmark-box-outline::before{content:"\F1B76"}.mdi-bookmark-check::before{content:"\F00C1"}.mdi-bookmark-check-outline::before{content:"\F137B"}.mdi-bookmark-minus::before{content:"\F09CC"}.mdi-bookmark-minus-outline::before{content:"\F09CD"}.mdi-bookmark-multiple::before{content:"\F0E15"}.mdi-bookmark-multiple-outline::before{content:"\F0E16"}.mdi-bookmark-music::before{content:"\F00C2"}.mdi-bookmark-music-outline::before{content:"\F1379"}.mdi-bookmark-off::before{content:"\F09CE"}.mdi-bookmark-off-outline::before{content:"\F09CF"}.mdi-bookmark-outline::before{content:"\F00C3"}.mdi-bookmark-plus::before{content:"\F00C5"}.mdi-bookmark-plus-outline::before{content:"\F00C4"}.mdi-bookmark-remove::before{content:"\F00C6"}.mdi-bookmark-remove-outline::before{content:"\F137A"}.mdi-bookshelf::before{content:"\F125F"}.mdi-boom-gate::before{content:"\F0E86"}.mdi-boom-gate-alert::before{content:"\F0E87"}.mdi-boom-gate-alert-outline::before{content:"\F0E88"}.mdi-boom-gate-arrow-down::before{content:"\F0E89"}.mdi-boom-gate-arrow-down-outline::before{content:"\F0E8A"}.mdi-boom-gate-arrow-up::before{content:"\F0E8C"}.mdi-boom-gate-arrow-up-outline::before{content:"\F0E8D"}.mdi-boom-gate-outline::before{content:"\F0E8B"}.mdi-boom-gate-up::before{content:"\F17F9"}.mdi-boom-gate-up-outline::before{content:"\F17FA"}.mdi-boombox::before{content:"\F05DC"}.mdi-boomerang::before{content:"\F10CF"}.mdi-bootstrap::before{content:"\F06C6"}.mdi-border-all::before{content:"\F00C7"}.mdi-border-all-variant::before{content:"\F08A1"}.mdi-border-bottom::before{content:"\F00C8"}.mdi-border-bottom-variant::before{content:"\F08A2"}.mdi-border-color::before{content:"\F00C9"}.mdi-border-horizontal::before{content:"\F00CA"}.mdi-border-inside::before{content:"\F00CB"}.mdi-border-left::before{content:"\F00CC"}.mdi-border-left-variant::before{content:"\F08A3"}.mdi-border-none::before{content:"\F00CD"}.mdi-border-none-variant::before{content:"\F08A4"}.mdi-border-outside::before{content:"\F00CE"}.mdi-border-radius::before{content:"\F1AF4"}.mdi-border-right::before{content:"\F00CF"}.mdi-border-right-variant::before{content:"\F08A5"}.mdi-border-style::before{content:"\F00D0"}.mdi-border-top::before{content:"\F00D1"}.mdi-border-top-variant::before{content:"\F08A6"}.mdi-border-vertical::before{content:"\F00D2"}.mdi-bottle-soda::before{content:"\F1070"}.mdi-bottle-soda-classic::before{content:"\F1071"}.mdi-bottle-soda-classic-outline::before{content:"\F1363"}.mdi-bottle-soda-outline::before{content:"\F1072"}.mdi-bottle-tonic::before{content:"\F112E"}.mdi-bottle-tonic-outline::before{content:"\F112F"}.mdi-bottle-tonic-plus::before{content:"\F1130"}.mdi-bottle-tonic-plus-outline::before{content:"\F1131"}.mdi-bottle-tonic-skull::before{content:"\F1132"}.mdi-bottle-tonic-skull-outline::before{content:"\F1133"}.mdi-bottle-wine::before{content:"\F0854"}.mdi-bottle-wine-outline::before{content:"\F1310"}.mdi-bow-arrow::before{content:"\F1841"}.mdi-bow-tie::before{content:"\F0678"}.mdi-bowl::before{content:"\F028E"}.mdi-bowl-mix::before{content:"\F0617"}.mdi-bowl-mix-outline::before{content:"\F02E4"}.mdi-bowl-outline::before{content:"\F02A9"}.mdi-bowling::before{content:"\F00D3"}.mdi-box::before{content:"\F00D4"}.mdi-box-cutter::before{content:"\F00D5"}.mdi-box-cutter-off::before{content:"\F0B4A"}.mdi-box-shadow::before{content:"\F0637"}.mdi-boxing-glove::before{content:"\F0B65"}.mdi-braille::before{content:"\F09D0"}.mdi-brain::before{content:"\F09D1"}.mdi-bread-slice::before{content:"\F0CEE"}.mdi-bread-slice-outline::before{content:"\F0CEF"}.mdi-bridge::before{content:"\F0618"}.mdi-briefcase::before{content:"\F00D6"}.mdi-briefcase-account::before{content:"\F0CF0"}.mdi-briefcase-account-outline::before{content:"\F0CF1"}.mdi-briefcase-arrow-left-right::before{content:"\F1A8D"}.mdi-briefcase-arrow-left-right-outline::before{content:"\F1A8E"}.mdi-briefcase-arrow-up-down::before{content:"\F1A8F"}.mdi-briefcase-arrow-up-down-outline::before{content:"\F1A90"}.mdi-briefcase-check::before{content:"\F00D7"}.mdi-briefcase-check-outline::before{content:"\F131E"}.mdi-briefcase-clock::before{content:"\F10D0"}.mdi-briefcase-clock-outline::before{content:"\F10D1"}.mdi-briefcase-download::before{content:"\F00D8"}.mdi-briefcase-download-outline::before{content:"\F0C3D"}.mdi-briefcase-edit::before{content:"\F0A98"}.mdi-briefcase-edit-outline::before{content:"\F0C3E"}.mdi-briefcase-eye::before{content:"\F17D9"}.mdi-briefcase-eye-outline::before{content:"\F17DA"}.mdi-briefcase-minus::before{content:"\F0A2A"}.mdi-briefcase-minus-outline::before{content:"\F0C3F"}.mdi-briefcase-off::before{content:"\F1658"}.mdi-briefcase-off-outline::before{content:"\F1659"}.mdi-briefcase-outline::before{content:"\F0814"}.mdi-briefcase-plus::before{content:"\F0A2B"}.mdi-briefcase-plus-outline::before{content:"\F0C40"}.mdi-briefcase-remove::before{content:"\F0A2C"}.mdi-briefcase-remove-outline::before{content:"\F0C41"}.mdi-briefcase-search::before{content:"\F0A2D"}.mdi-briefcase-search-outline::before{content:"\F0C42"}.mdi-briefcase-upload::before{content:"\F00D9"}.mdi-briefcase-upload-outline::before{content:"\F0C43"}.mdi-briefcase-variant::before{content:"\F1494"}.mdi-briefcase-variant-off::before{content:"\F165A"}.mdi-briefcase-variant-off-outline::before{content:"\F165B"}.mdi-briefcase-variant-outline::before{content:"\F1495"}.mdi-brightness-1::before{content:"\F00DA"}.mdi-brightness-2::before{content:"\F00DB"}.mdi-brightness-3::before{content:"\F00DC"}.mdi-brightness-4::before{content:"\F00DD"}.mdi-brightness-5::before{content:"\F00DE"}.mdi-brightness-6::before{content:"\F00DF"}.mdi-brightness-7::before{content:"\F00E0"}.mdi-brightness-auto::before{content:"\F00E1"}.mdi-brightness-percent::before{content:"\F0CF2"}.mdi-broadcast::before{content:"\F1720"}.mdi-broadcast-off::before{content:"\F1721"}.mdi-broom::before{content:"\F00E2"}.mdi-brush::before{content:"\F00E3"}.mdi-brush-off::before{content:"\F1771"}.mdi-brush-outline::before{content:"\F1A0D"}.mdi-brush-variant::before{content:"\F1813"}.mdi-bucket::before{content:"\F1415"}.mdi-bucket-outline::before{content:"\F1416"}.mdi-buffet::before{content:"\F0578"}.mdi-bug::before{content:"\F00E4"}.mdi-bug-check::before{content:"\F0A2E"}.mdi-bug-check-outline::before{content:"\F0A2F"}.mdi-bug-outline::before{content:"\F0A30"}.mdi-bug-pause::before{content:"\F1AF5"}.mdi-bug-pause-outline::before{content:"\F1AF6"}.mdi-bug-play::before{content:"\F1AF7"}.mdi-bug-play-outline::before{content:"\F1AF8"}.mdi-bug-stop::before{content:"\F1AF9"}.mdi-bug-stop-outline::before{content:"\F1AFA"}.mdi-bugle::before{content:"\F0DB4"}.mdi-bulkhead-light::before{content:"\F1A2F"}.mdi-bulldozer::before{content:"\F0B22"}.mdi-bullet::before{content:"\F0CF3"}.mdi-bulletin-board::before{content:"\F00E5"}.mdi-bullhorn::before{content:"\F00E6"}.mdi-bullhorn-outline::before{content:"\F0B23"}.mdi-bullhorn-variant::before{content:"\F196E"}.mdi-bullhorn-variant-outline::before{content:"\F196F"}.mdi-bullseye::before{content:"\F05DD"}.mdi-bullseye-arrow::before{content:"\F08C9"}.mdi-bulma::before{content:"\F12E7"}.mdi-bunk-bed::before{content:"\F1302"}.mdi-bunk-bed-outline::before{content:"\F0097"}.mdi-bus::before{content:"\F00E7"}.mdi-bus-alert::before{content:"\F0A99"}.mdi-bus-articulated-end::before{content:"\F079C"}.mdi-bus-articulated-front::before{content:"\F079D"}.mdi-bus-clock::before{content:"\F08CA"}.mdi-bus-double-decker::before{content:"\F079E"}.mdi-bus-electric::before{content:"\F191D"}.mdi-bus-marker::before{content:"\F1212"}.mdi-bus-multiple::before{content:"\F0F3F"}.mdi-bus-school::before{content:"\F079F"}.mdi-bus-side::before{content:"\F07A0"}.mdi-bus-sign::before{content:"\F1CC1"}.mdi-bus-stop::before{content:"\F1012"}.mdi-bus-stop-covered::before{content:"\F1013"}.mdi-bus-stop-uncovered::before{content:"\F1014"}.mdi-bus-wrench::before{content:"\F1CC2"}.mdi-butterfly::before{content:"\F1589"}.mdi-butterfly-outline::before{content:"\F158A"}.mdi-button-cursor::before{content:"\F1B4F"}.mdi-button-pointer::before{content:"\F1B50"}.mdi-cabin-a-frame::before{content:"\F188C"}.mdi-cable-data::before{content:"\F1394"}.mdi-cached::before{content:"\F00E8"}.mdi-cactus::before{content:"\F0DB5"}.mdi-cake::before{content:"\F00E9"}.mdi-cake-layered::before{content:"\F00EA"}.mdi-cake-variant::before{content:"\F00EB"}.mdi-cake-variant-outline::before{content:"\F17F0"}.mdi-calculator::before{content:"\F00EC"}.mdi-calculator-variant::before{content:"\F0A9A"}.mdi-calculator-variant-outline::before{content:"\F15A6"}.mdi-calendar::before{content:"\F00ED"}.mdi-calendar-account::before{content:"\F0ED7"}.mdi-calendar-account-outline::before{content:"\F0ED8"}.mdi-calendar-alert::before{content:"\F0A31"}.mdi-calendar-alert-outline::before{content:"\F1B62"}.mdi-calendar-arrow-left::before{content:"\F1134"}.mdi-calendar-arrow-right::before{content:"\F1135"}.mdi-calendar-badge::before{content:"\F1B9D"}.mdi-calendar-badge-outline::before{content:"\F1B9E"}.mdi-calendar-blank::before{content:"\F00EE"}.mdi-calendar-blank-multiple::before{content:"\F1073"}.mdi-calendar-blank-outline::before{content:"\F0B66"}.mdi-calendar-check::before{content:"\F00EF"}.mdi-calendar-check-outline::before{content:"\F0C44"}.mdi-calendar-clock::before{content:"\F00F0"}.mdi-calendar-clock-outline::before{content:"\F16E1"}.mdi-calendar-collapse-horizontal::before{content:"\F189D"}.mdi-calendar-collapse-horizontal-outline::before{content:"\F1B63"}.mdi-calendar-cursor::before{content:"\F157B"}.mdi-calendar-cursor-outline::before{content:"\F1B64"}.mdi-calendar-edit::before{content:"\F08A7"}.mdi-calendar-edit-outline::before{content:"\F1B65"}.mdi-calendar-end::before{content:"\F166C"}.mdi-calendar-end-outline::before{content:"\F1B66"}.mdi-calendar-expand-horizontal::before{content:"\F189E"}.mdi-calendar-expand-horizontal-outline::before{content:"\F1B67"}.mdi-calendar-export::before{content:"\F0B24"}.mdi-calendar-export-outline::before{content:"\F1B68"}.mdi-calendar-filter::before{content:"\F1A32"}.mdi-calendar-filter-outline::before{content:"\F1A33"}.mdi-calendar-heart::before{content:"\F09D2"}.mdi-calendar-heart-outline::before{content:"\F1B69"}.mdi-calendar-import::before{content:"\F0B25"}.mdi-calendar-import-outline::before{content:"\F1B6A"}.mdi-calendar-lock::before{content:"\F1641"}.mdi-calendar-lock-open::before{content:"\F1B5B"}.mdi-calendar-lock-open-outline::before{content:"\F1B5C"}.mdi-calendar-lock-outline::before{content:"\F1642"}.mdi-calendar-minus::before{content:"\F0D5C"}.mdi-calendar-minus-outline::before{content:"\F1B6B"}.mdi-calendar-month::before{content:"\F0E17"}.mdi-calendar-month-outline::before{content:"\F0E18"}.mdi-calendar-multiple::before{content:"\F00F1"}.mdi-calendar-multiple-check::before{content:"\F00F2"}.mdi-calendar-multiselect::before{content:"\F0A32"}.mdi-calendar-multiselect-outline::before{content:"\F1B55"}.mdi-calendar-outline::before{content:"\F0B67"}.mdi-calendar-plus::before{content:"\F00F3"}.mdi-calendar-plus-outline::before{content:"\F1B6C"}.mdi-calendar-question::before{content:"\F0692"}.mdi-calendar-question-outline::before{content:"\F1B6D"}.mdi-calendar-range::before{content:"\F0679"}.mdi-calendar-range-outline::before{content:"\F0B68"}.mdi-calendar-refresh::before{content:"\F01E1"}.mdi-calendar-refresh-outline::before{content:"\F0203"}.mdi-calendar-remove::before{content:"\F00F4"}.mdi-calendar-remove-outline::before{content:"\F0C45"}.mdi-calendar-search::before{content:"\F094C"}.mdi-calendar-search-outline::before{content:"\F1B6E"}.mdi-calendar-star::before{content:"\F09D3"}.mdi-calendar-star-four-points::before{content:"\F1C1F"}.mdi-calendar-star-outline::before{content:"\F1B53"}.mdi-calendar-start::before{content:"\F166D"}.mdi-calendar-start-outline::before{content:"\F1B6F"}.mdi-calendar-sync::before{content:"\F0E8E"}.mdi-calendar-sync-outline::before{content:"\F0E8F"}.mdi-calendar-text::before{content:"\F00F5"}.mdi-calendar-text-outline::before{content:"\F0C46"}.mdi-calendar-today::before{content:"\F00F6"}.mdi-calendar-today-outline::before{content:"\F1A30"}.mdi-calendar-week::before{content:"\F0A33"}.mdi-calendar-week-begin::before{content:"\F0A34"}.mdi-calendar-week-begin-outline::before{content:"\F1A31"}.mdi-calendar-week-outline::before{content:"\F1A34"}.mdi-calendar-weekend::before{content:"\F0ED9"}.mdi-calendar-weekend-outline::before{content:"\F0EDA"}.mdi-call-made::before{content:"\F00F7"}.mdi-call-merge::before{content:"\F00F8"}.mdi-call-missed::before{content:"\F00F9"}.mdi-call-received::before{content:"\F00FA"}.mdi-call-split::before{content:"\F00FB"}.mdi-camcorder::before{content:"\F00FC"}.mdi-camcorder-off::before{content:"\F00FF"}.mdi-camera::before{content:"\F0100"}.mdi-camera-account::before{content:"\F08CB"}.mdi-camera-burst::before{content:"\F0693"}.mdi-camera-control::before{content:"\F0B69"}.mdi-camera-document::before{content:"\F1871"}.mdi-camera-document-off::before{content:"\F1872"}.mdi-camera-enhance::before{content:"\F0101"}.mdi-camera-enhance-outline::before{content:"\F0B6A"}.mdi-camera-flip::before{content:"\F15D9"}.mdi-camera-flip-outline::before{content:"\F15DA"}.mdi-camera-front::before{content:"\F0102"}.mdi-camera-front-variant::before{content:"\F0103"}.mdi-camera-gopro::before{content:"\F07A1"}.mdi-camera-image::before{content:"\F08CC"}.mdi-camera-iris::before{content:"\F0104"}.mdi-camera-lock::before{content:"\F1A14"}.mdi-camera-lock-open::before{content:"\F1C0D"}.mdi-camera-lock-open-outline::before{content:"\F1C0E"}.mdi-camera-lock-outline::before{content:"\F1A15"}.mdi-camera-marker::before{content:"\F19A7"}.mdi-camera-marker-outline::before{content:"\F19A8"}.mdi-camera-metering-center::before{content:"\F07A2"}.mdi-camera-metering-matrix::before{content:"\F07A3"}.mdi-camera-metering-partial::before{content:"\F07A4"}.mdi-camera-metering-spot::before{content:"\F07A5"}.mdi-camera-off::before{content:"\F05DF"}.mdi-camera-off-outline::before{content:"\F19BF"}.mdi-camera-outline::before{content:"\F0D5D"}.mdi-camera-party-mode::before{content:"\F0105"}.mdi-camera-plus::before{content:"\F0EDB"}.mdi-camera-plus-outline::before{content:"\F0EDC"}.mdi-camera-rear::before{content:"\F0106"}.mdi-camera-rear-variant::before{content:"\F0107"}.mdi-camera-retake::before{content:"\F0E19"}.mdi-camera-retake-outline::before{content:"\F0E1A"}.mdi-camera-switch::before{content:"\F0108"}.mdi-camera-switch-outline::before{content:"\F084A"}.mdi-camera-timer::before{content:"\F0109"}.mdi-camera-wireless::before{content:"\F0DB6"}.mdi-camera-wireless-outline::before{content:"\F0DB7"}.mdi-campfire::before{content:"\F0EDD"}.mdi-cancel::before{content:"\F073A"}.mdi-candelabra::before{content:"\F17D2"}.mdi-candelabra-fire::before{content:"\F17D3"}.mdi-candle::before{content:"\F05E2"}.mdi-candy::before{content:"\F1970"}.mdi-candy-off::before{content:"\F1971"}.mdi-candy-off-outline::before{content:"\F1972"}.mdi-candy-outline::before{content:"\F1973"}.mdi-candycane::before{content:"\F010A"}.mdi-cannabis::before{content:"\F07A6"}.mdi-cannabis-off::before{content:"\F166E"}.mdi-caps-lock::before{content:"\F0A9B"}.mdi-car::before{content:"\F010B"}.mdi-car-2-plus::before{content:"\F1015"}.mdi-car-3-plus::before{content:"\F1016"}.mdi-car-arrow-left::before{content:"\F13B2"}.mdi-car-arrow-right::before{content:"\F13B3"}.mdi-car-back::before{content:"\F0E1B"}.mdi-car-battery::before{content:"\F010C"}.mdi-car-brake-abs::before{content:"\F0C47"}.mdi-car-brake-alert::before{content:"\F0C48"}.mdi-car-brake-fluid-level::before{content:"\F1909"}.mdi-car-brake-hold::before{content:"\F0D5E"}.mdi-car-brake-low-pressure::before{content:"\F190A"}.mdi-car-brake-parking::before{content:"\F0D5F"}.mdi-car-brake-retarder::before{content:"\F1017"}.mdi-car-brake-temperature::before{content:"\F190B"}.mdi-car-brake-worn-linings::before{content:"\F190C"}.mdi-car-child-seat::before{content:"\F0FA3"}.mdi-car-clock::before{content:"\F1974"}.mdi-car-clutch::before{content:"\F1018"}.mdi-car-cog::before{content:"\F13CC"}.mdi-car-connected::before{content:"\F010D"}.mdi-car-convertible::before{content:"\F07A7"}.mdi-car-coolant-level::before{content:"\F1019"}.mdi-car-cruise-control::before{content:"\F0D60"}.mdi-car-defrost-front::before{content:"\F0D61"}.mdi-car-defrost-rear::before{content:"\F0D62"}.mdi-car-door::before{content:"\F0B6B"}.mdi-car-door-lock::before{content:"\F109D"}.mdi-car-door-lock-open::before{content:"\F1C81"}.mdi-car-electric::before{content:"\F0B6C"}.mdi-car-electric-outline::before{content:"\F15B5"}.mdi-car-emergency::before{content:"\F160F"}.mdi-car-esp::before{content:"\F0C49"}.mdi-car-estate::before{content:"\F07A8"}.mdi-car-hatchback::before{content:"\F07A9"}.mdi-car-info::before{content:"\F11BE"}.mdi-car-key::before{content:"\F0B6D"}.mdi-car-lifted-pickup::before{content:"\F152D"}.mdi-car-light-alert::before{content:"\F190D"}.mdi-car-light-dimmed::before{content:"\F0C4A"}.mdi-car-light-fog::before{content:"\F0C4B"}.mdi-car-light-high::before{content:"\F0C4C"}.mdi-car-limousine::before{content:"\F08CD"}.mdi-car-multiple::before{content:"\F0B6E"}.mdi-car-off::before{content:"\F0E1C"}.mdi-car-outline::before{content:"\F14ED"}.mdi-car-parking-lights::before{content:"\F0D63"}.mdi-car-pickup::before{content:"\F07AA"}.mdi-car-search::before{content:"\F1B8D"}.mdi-car-search-outline::before{content:"\F1B8E"}.mdi-car-seat::before{content:"\F0FA4"}.mdi-car-seat-cooler::before{content:"\F0FA5"}.mdi-car-seat-heater::before{content:"\F0FA6"}.mdi-car-select::before{content:"\F1879"}.mdi-car-settings::before{content:"\F13CD"}.mdi-car-shift-pattern::before{content:"\F0F40"}.mdi-car-side::before{content:"\F07AB"}.mdi-car-speed-limiter::before{content:"\F190E"}.mdi-car-sports::before{content:"\F07AC"}.mdi-car-tire-alert::before{content:"\F0C4D"}.mdi-car-traction-control::before{content:"\F0D64"}.mdi-car-turbocharger::before{content:"\F101A"}.mdi-car-wash::before{content:"\F010E"}.mdi-car-windshield::before{content:"\F101B"}.mdi-car-windshield-outline::before{content:"\F101C"}.mdi-car-wireless::before{content:"\F1878"}.mdi-car-wrench::before{content:"\F1814"}.mdi-carabiner::before{content:"\F14C0"}.mdi-caravan::before{content:"\F07AD"}.mdi-card::before{content:"\F0B6F"}.mdi-card-account-details::before{content:"\F05D2"}.mdi-card-account-details-outline::before{content:"\F0DAB"}.mdi-card-account-details-star::before{content:"\F02A3"}.mdi-card-account-details-star-outline::before{content:"\F06DB"}.mdi-card-account-mail::before{content:"\F018E"}.mdi-card-account-mail-outline::before{content:"\F0E98"}.mdi-card-account-phone::before{content:"\F0E99"}.mdi-card-account-phone-outline::before{content:"\F0E9A"}.mdi-card-bulleted::before{content:"\F0B70"}.mdi-card-bulleted-off::before{content:"\F0B71"}.mdi-card-bulleted-off-outline::before{content:"\F0B72"}.mdi-card-bulleted-outline::before{content:"\F0B73"}.mdi-card-bulleted-settings::before{content:"\F0B74"}.mdi-card-bulleted-settings-outline::before{content:"\F0B75"}.mdi-card-minus::before{content:"\F1600"}.mdi-card-minus-outline::before{content:"\F1601"}.mdi-card-multiple::before{content:"\F17F1"}.mdi-card-multiple-outline::before{content:"\F17F2"}.mdi-card-off::before{content:"\F1602"}.mdi-card-off-outline::before{content:"\F1603"}.mdi-card-outline::before{content:"\F0B76"}.mdi-card-plus::before{content:"\F11FF"}.mdi-card-plus-outline::before{content:"\F1200"}.mdi-card-remove::before{content:"\F1604"}.mdi-card-remove-outline::before{content:"\F1605"}.mdi-card-search::before{content:"\F1074"}.mdi-card-search-outline::before{content:"\F1075"}.mdi-card-text::before{content:"\F0B77"}.mdi-card-text-outline::before{content:"\F0B78"}.mdi-cards::before{content:"\F0638"}.mdi-cards-club::before{content:"\F08CE"}.mdi-cards-club-outline::before{content:"\F189F"}.mdi-cards-diamond::before{content:"\F08CF"}.mdi-cards-diamond-outline::before{content:"\F101D"}.mdi-cards-heart::before{content:"\F08D0"}.mdi-cards-heart-outline::before{content:"\F18A0"}.mdi-cards-outline::before{content:"\F0639"}.mdi-cards-playing::before{content:"\F18A1"}.mdi-cards-playing-club::before{content:"\F18A2"}.mdi-cards-playing-club-multiple::before{content:"\F18A3"}.mdi-cards-playing-club-multiple-outline::before{content:"\F18A4"}.mdi-cards-playing-club-outline::before{content:"\F18A5"}.mdi-cards-playing-diamond::before{content:"\F18A6"}.mdi-cards-playing-diamond-multiple::before{content:"\F18A7"}.mdi-cards-playing-diamond-multiple-outline::before{content:"\F18A8"}.mdi-cards-playing-diamond-outline::before{content:"\F18A9"}.mdi-cards-playing-heart::before{content:"\F18AA"}.mdi-cards-playing-heart-multiple::before{content:"\F18AB"}.mdi-cards-playing-heart-multiple-outline::before{content:"\F18AC"}.mdi-cards-playing-heart-outline::before{content:"\F18AD"}.mdi-cards-playing-outline::before{content:"\F063A"}.mdi-cards-playing-spade::before{content:"\F18AE"}.mdi-cards-playing-spade-multiple::before{content:"\F18AF"}.mdi-cards-playing-spade-multiple-outline::before{content:"\F18B0"}.mdi-cards-playing-spade-outline::before{content:"\F18B1"}.mdi-cards-spade::before{content:"\F08D1"}.mdi-cards-spade-outline::before{content:"\F18B2"}.mdi-cards-variant::before{content:"\F06C7"}.mdi-carrot::before{content:"\F010F"}.mdi-cart::before{content:"\F0110"}.mdi-cart-arrow-down::before{content:"\F0D66"}.mdi-cart-arrow-right::before{content:"\F0C4E"}.mdi-cart-arrow-up::before{content:"\F0D67"}.mdi-cart-check::before{content:"\F15EA"}.mdi-cart-heart::before{content:"\F18E0"}.mdi-cart-minus::before{content:"\F0D68"}.mdi-cart-off::before{content:"\F066B"}.mdi-cart-outline::before{content:"\F0111"}.mdi-cart-percent::before{content:"\F1BAE"}.mdi-cart-plus::before{content:"\F0112"}.mdi-cart-remove::before{content:"\F0D69"}.mdi-cart-variant::before{content:"\F15EB"}.mdi-case-sensitive-alt::before{content:"\F0113"}.mdi-cash::before{content:"\F0114"}.mdi-cash-100::before{content:"\F0115"}.mdi-cash-check::before{content:"\F14EE"}.mdi-cash-clock::before{content:"\F1A91"}.mdi-cash-edit::before{content:"\F1CAB"}.mdi-cash-fast::before{content:"\F185C"}.mdi-cash-lock::before{content:"\F14EA"}.mdi-cash-lock-open::before{content:"\F14EB"}.mdi-cash-marker::before{content:"\F0DB8"}.mdi-cash-minus::before{content:"\F1260"}.mdi-cash-multiple::before{content:"\F0116"}.mdi-cash-off::before{content:"\F1C79"}.mdi-cash-plus::before{content:"\F1261"}.mdi-cash-refund::before{content:"\F0A9C"}.mdi-cash-register::before{content:"\F0CF4"}.mdi-cash-remove::before{content:"\F1262"}.mdi-cash-sync::before{content:"\F1A92"}.mdi-cassette::before{content:"\F09D4"}.mdi-cast::before{content:"\F0118"}.mdi-cast-audio::before{content:"\F101E"}.mdi-cast-audio-variant::before{content:"\F1749"}.mdi-cast-connected::before{content:"\F0119"}.mdi-cast-education::before{content:"\F0E1D"}.mdi-cast-off::before{content:"\F078A"}.mdi-cast-variant::before{content:"\F001F"}.mdi-castle::before{content:"\F011A"}.mdi-cat::before{content:"\F011B"}.mdi-cctv::before{content:"\F07AE"}.mdi-cctv-off::before{content:"\F185F"}.mdi-ceiling-fan::before{content:"\F1797"}.mdi-ceiling-fan-light::before{content:"\F1798"}.mdi-ceiling-light::before{content:"\F0769"}.mdi-ceiling-light-multiple::before{content:"\F18DD"}.mdi-ceiling-light-multiple-outline::before{content:"\F18DE"}.mdi-ceiling-light-outline::before{content:"\F17C7"}.mdi-cellphone::before{content:"\F011C"}.mdi-cellphone-arrow-down::before{content:"\F09D5"}.mdi-cellphone-arrow-down-variant::before{content:"\F19C5"}.mdi-cellphone-basic::before{content:"\F011E"}.mdi-cellphone-charging::before{content:"\F1397"}.mdi-cellphone-check::before{content:"\F17FD"}.mdi-cellphone-cog::before{content:"\F0951"}.mdi-cellphone-dock::before{content:"\F011F"}.mdi-cellphone-information::before{content:"\F0F41"}.mdi-cellphone-key::before{content:"\F094E"}.mdi-cellphone-link::before{content:"\F0121"}.mdi-cellphone-link-off::before{content:"\F0122"}.mdi-cellphone-lock::before{content:"\F094F"}.mdi-cellphone-marker::before{content:"\F183A"}.mdi-cellphone-message::before{content:"\F08D3"}.mdi-cellphone-message-off::before{content:"\F10D2"}.mdi-cellphone-nfc::before{content:"\F0E90"}.mdi-cellphone-nfc-off::before{content:"\F12D8"}.mdi-cellphone-off::before{content:"\F0950"}.mdi-cellphone-play::before{content:"\F101F"}.mdi-cellphone-remove::before{content:"\F094D"}.mdi-cellphone-screenshot::before{content:"\F0A35"}.mdi-cellphone-settings::before{content:"\F0123"}.mdi-cellphone-sound::before{content:"\F0952"}.mdi-cellphone-text::before{content:"\F08D2"}.mdi-cellphone-wireless::before{content:"\F0815"}.mdi-centos::before{content:"\F111A"}.mdi-certificate::before{content:"\F0124"}.mdi-certificate-outline::before{content:"\F1188"}.mdi-chair-rolling::before{content:"\F0F48"}.mdi-chair-school::before{content:"\F0125"}.mdi-chandelier::before{content:"\F1793"}.mdi-charity::before{content:"\F0C4F"}.mdi-charity-search::before{content:"\F1C82"}.mdi-chart-arc::before{content:"\F0126"}.mdi-chart-areaspline::before{content:"\F0127"}.mdi-chart-areaspline-variant::before{content:"\F0E91"}.mdi-chart-bar::before{content:"\F0128"}.mdi-chart-bar-stacked::before{content:"\F076A"}.mdi-chart-bell-curve::before{content:"\F0C50"}.mdi-chart-bell-curve-cumulative::before{content:"\F0FA7"}.mdi-chart-box::before{content:"\F154D"}.mdi-chart-box-multiple::before{content:"\F1CCD"}.mdi-chart-box-multiple-outline::before{content:"\F1CCE"}.mdi-chart-box-outline::before{content:"\F154E"}.mdi-chart-box-plus-outline::before{content:"\F154F"}.mdi-chart-bubble::before{content:"\F05E3"}.mdi-chart-donut::before{content:"\F07AF"}.mdi-chart-donut-variant::before{content:"\F07B0"}.mdi-chart-gantt::before{content:"\F066C"}.mdi-chart-histogram::before{content:"\F0129"}.mdi-chart-line::before{content:"\F012A"}.mdi-chart-line-stacked::before{content:"\F076B"}.mdi-chart-line-variant::before{content:"\F07B1"}.mdi-chart-multiline::before{content:"\F08D4"}.mdi-chart-multiple::before{content:"\F1213"}.mdi-chart-pie::before{content:"\F012B"}.mdi-chart-pie-outline::before{content:"\F1BDF"}.mdi-chart-ppf::before{content:"\F1380"}.mdi-chart-sankey::before{content:"\F11DF"}.mdi-chart-sankey-variant::before{content:"\F11E0"}.mdi-chart-scatter-plot::before{content:"\F0E92"}.mdi-chart-scatter-plot-hexbin::before{content:"\F066D"}.mdi-chart-timeline::before{content:"\F066E"}.mdi-chart-timeline-variant::before{content:"\F0E93"}.mdi-chart-timeline-variant-shimmer::before{content:"\F15B6"}.mdi-chart-tree::before{content:"\F0E94"}.mdi-chart-waterfall::before{content:"\F1918"}.mdi-chat::before{content:"\F0B79"}.mdi-chat-alert::before{content:"\F0B7A"}.mdi-chat-alert-outline::before{content:"\F12C9"}.mdi-chat-minus::before{content:"\F1410"}.mdi-chat-minus-outline::before{content:"\F1413"}.mdi-chat-outline::before{content:"\F0EDE"}.mdi-chat-plus::before{content:"\F140F"}.mdi-chat-plus-outline::before{content:"\F1412"}.mdi-chat-processing::before{content:"\F0B7B"}.mdi-chat-processing-outline::before{content:"\F12CA"}.mdi-chat-question::before{content:"\F1738"}.mdi-chat-question-outline::before{content:"\F1739"}.mdi-chat-remove::before{content:"\F1411"}.mdi-chat-remove-outline::before{content:"\F1414"}.mdi-chat-sleep::before{content:"\F12D1"}.mdi-chat-sleep-outline::before{content:"\F12D2"}.mdi-check::before{content:"\F012C"}.mdi-check-all::before{content:"\F012D"}.mdi-check-bold::before{content:"\F0E1E"}.mdi-check-circle::before{content:"\F05E0"}.mdi-check-circle-outline::before{content:"\F05E1"}.mdi-check-decagram::before{content:"\F0791"}.mdi-check-decagram-outline::before{content:"\F1740"}.mdi-check-network::before{content:"\F0C53"}.mdi-check-network-outline::before{content:"\F0C54"}.mdi-check-outline::before{content:"\F0855"}.mdi-check-underline::before{content:"\F0E1F"}.mdi-check-underline-circle::before{content:"\F0E20"}.mdi-check-underline-circle-outline::before{content:"\F0E21"}.mdi-checkbook::before{content:"\F0A9D"}.mdi-checkbook-arrow-left::before{content:"\F1C1D"}.mdi-checkbook-arrow-right::before{content:"\F1C1E"}.mdi-checkbox-blank::before{content:"\F012E"}.mdi-checkbox-blank-badge::before{content:"\F1176"}.mdi-checkbox-blank-badge-outline::before{content:"\F0117"}.mdi-checkbox-blank-circle::before{content:"\F012F"}.mdi-checkbox-blank-circle-outline::before{content:"\F0130"}.mdi-checkbox-blank-off::before{content:"\F12EC"}.mdi-checkbox-blank-off-outline::before{content:"\F12ED"}.mdi-checkbox-blank-outline::before{content:"\F0131"}.mdi-checkbox-intermediate::before{content:"\F0856"}.mdi-checkbox-intermediate-variant::before{content:"\F1B54"}.mdi-checkbox-marked::before{content:"\F0132"}.mdi-checkbox-marked-circle::before{content:"\F0133"}.mdi-checkbox-marked-circle-auto-outline::before{content:"\F1C26"}.mdi-checkbox-marked-circle-minus-outline::before{content:"\F1C27"}.mdi-checkbox-marked-circle-outline::before{content:"\F0134"}.mdi-checkbox-marked-circle-plus-outline::before{content:"\F1927"}.mdi-checkbox-marked-outline::before{content:"\F0135"}.mdi-checkbox-multiple-blank::before{content:"\F0136"}.mdi-checkbox-multiple-blank-circle::before{content:"\F063B"}.mdi-checkbox-multiple-blank-circle-outline::before{content:"\F063C"}.mdi-checkbox-multiple-blank-outline::before{content:"\F0137"}.mdi-checkbox-multiple-marked::before{content:"\F0138"}.mdi-checkbox-multiple-marked-circle::before{content:"\F063D"}.mdi-checkbox-multiple-marked-circle-outline::before{content:"\F063E"}.mdi-checkbox-multiple-marked-outline::before{content:"\F0139"}.mdi-checkbox-multiple-outline::before{content:"\F0C51"}.mdi-checkbox-outline::before{content:"\F0C52"}.mdi-checkerboard::before{content:"\F013A"}.mdi-checkerboard-minus::before{content:"\F1202"}.mdi-checkerboard-plus::before{content:"\F1201"}.mdi-checkerboard-remove::before{content:"\F1203"}.mdi-cheese::before{content:"\F12B9"}.mdi-cheese-off::before{content:"\F13EE"}.mdi-chef-hat::before{content:"\F0B7C"}.mdi-chemical-weapon::before{content:"\F013B"}.mdi-chess-bishop::before{content:"\F085C"}.mdi-chess-king::before{content:"\F0857"}.mdi-chess-knight::before{content:"\F0858"}.mdi-chess-pawn::before{content:"\F0859"}.mdi-chess-queen::before{content:"\F085A"}.mdi-chess-rook::before{content:"\F085B"}.mdi-chevron-double-down::before{content:"\F013C"}.mdi-chevron-double-left::before{content:"\F013D"}.mdi-chevron-double-right::before{content:"\F013E"}.mdi-chevron-double-up::before{content:"\F013F"}.mdi-chevron-down::before{content:"\F0140"}.mdi-chevron-down-box::before{content:"\F09D6"}.mdi-chevron-down-box-outline::before{content:"\F09D7"}.mdi-chevron-down-circle::before{content:"\F0B26"}.mdi-chevron-down-circle-outline::before{content:"\F0B27"}.mdi-chevron-left::before{content:"\F0141"}.mdi-chevron-left-box::before{content:"\F09D8"}.mdi-chevron-left-box-outline::before{content:"\F09D9"}.mdi-chevron-left-circle::before{content:"\F0B28"}.mdi-chevron-left-circle-outline::before{content:"\F0B29"}.mdi-chevron-right::before{content:"\F0142"}.mdi-chevron-right-box::before{content:"\F09DA"}.mdi-chevron-right-box-outline::before{content:"\F09DB"}.mdi-chevron-right-circle::before{content:"\F0B2A"}.mdi-chevron-right-circle-outline::before{content:"\F0B2B"}.mdi-chevron-triple-down::before{content:"\F0DB9"}.mdi-chevron-triple-left::before{content:"\F0DBA"}.mdi-chevron-triple-right::before{content:"\F0DBB"}.mdi-chevron-triple-up::before{content:"\F0DBC"}.mdi-chevron-up::before{content:"\F0143"}.mdi-chevron-up-box::before{content:"\F09DC"}.mdi-chevron-up-box-outline::before{content:"\F09DD"}.mdi-chevron-up-circle::before{content:"\F0B2C"}.mdi-chevron-up-circle-outline::before{content:"\F0B2D"}.mdi-chili-alert::before{content:"\F17EA"}.mdi-chili-alert-outline::before{content:"\F17EB"}.mdi-chili-hot::before{content:"\F07B2"}.mdi-chili-hot-outline::before{content:"\F17EC"}.mdi-chili-medium::before{content:"\F07B3"}.mdi-chili-medium-outline::before{content:"\F17ED"}.mdi-chili-mild::before{content:"\F07B4"}.mdi-chili-mild-outline::before{content:"\F17EE"}.mdi-chili-off::before{content:"\F1467"}.mdi-chili-off-outline::before{content:"\F17EF"}.mdi-chip::before{content:"\F061A"}.mdi-church::before{content:"\F0144"}.mdi-church-outline::before{content:"\F1B02"}.mdi-cigar::before{content:"\F1189"}.mdi-cigar-off::before{content:"\F141B"}.mdi-circle::before{content:"\F0765"}.mdi-circle-box::before{content:"\F15DC"}.mdi-circle-box-outline::before{content:"\F15DD"}.mdi-circle-double::before{content:"\F0E95"}.mdi-circle-edit-outline::before{content:"\F08D5"}.mdi-circle-expand::before{content:"\F0E96"}.mdi-circle-half::before{content:"\F1395"}.mdi-circle-half-full::before{content:"\F1396"}.mdi-circle-medium::before{content:"\F09DE"}.mdi-circle-multiple::before{content:"\F0B38"}.mdi-circle-multiple-outline::before{content:"\F0695"}.mdi-circle-off-outline::before{content:"\F10D3"}.mdi-circle-opacity::before{content:"\F1853"}.mdi-circle-outline::before{content:"\F0766"}.mdi-circle-slice-1::before{content:"\F0A9E"}.mdi-circle-slice-2::before{content:"\F0A9F"}.mdi-circle-slice-3::before{content:"\F0AA0"}.mdi-circle-slice-4::before{content:"\F0AA1"}.mdi-circle-slice-5::before{content:"\F0AA2"}.mdi-circle-slice-6::before{content:"\F0AA3"}.mdi-circle-slice-7::before{content:"\F0AA4"}.mdi-circle-slice-8::before{content:"\F0AA5"}.mdi-circle-small::before{content:"\F09DF"}.mdi-circular-saw::before{content:"\F0E22"}.mdi-city::before{content:"\F0146"}.mdi-city-switch::before{content:"\F1C28"}.mdi-city-variant::before{content:"\F0A36"}.mdi-city-variant-outline::before{content:"\F0A37"}.mdi-clipboard::before{content:"\F0147"}.mdi-clipboard-account::before{content:"\F0148"}.mdi-clipboard-account-outline::before{content:"\F0C55"}.mdi-clipboard-alert::before{content:"\F0149"}.mdi-clipboard-alert-outline::before{content:"\F0CF7"}.mdi-clipboard-arrow-down::before{content:"\F014A"}.mdi-clipboard-arrow-down-outline::before{content:"\F0C56"}.mdi-clipboard-arrow-left::before{content:"\F014B"}.mdi-clipboard-arrow-left-outline::before{content:"\F0CF8"}.mdi-clipboard-arrow-right::before{content:"\F0CF9"}.mdi-clipboard-arrow-right-outline::before{content:"\F0CFA"}.mdi-clipboard-arrow-up::before{content:"\F0C57"}.mdi-clipboard-arrow-up-outline::before{content:"\F0C58"}.mdi-clipboard-check::before{content:"\F014E"}.mdi-clipboard-check-multiple::before{content:"\F1263"}.mdi-clipboard-check-multiple-outline::before{content:"\F1264"}.mdi-clipboard-check-outline::before{content:"\F08A8"}.mdi-clipboard-clock::before{content:"\F16E2"}.mdi-clipboard-clock-outline::before{content:"\F16E3"}.mdi-clipboard-edit::before{content:"\F14E5"}.mdi-clipboard-edit-outline::before{content:"\F14E6"}.mdi-clipboard-file::before{content:"\F1265"}.mdi-clipboard-file-outline::before{content:"\F1266"}.mdi-clipboard-flow::before{content:"\F06C8"}.mdi-clipboard-flow-outline::before{content:"\F1117"}.mdi-clipboard-list::before{content:"\F10D4"}.mdi-clipboard-list-outline::before{content:"\F10D5"}.mdi-clipboard-minus::before{content:"\F1618"}.mdi-clipboard-minus-outline::before{content:"\F1619"}.mdi-clipboard-multiple::before{content:"\F1267"}.mdi-clipboard-multiple-outline::before{content:"\F1268"}.mdi-clipboard-off::before{content:"\F161A"}.mdi-clipboard-off-outline::before{content:"\F161B"}.mdi-clipboard-outline::before{content:"\F014C"}.mdi-clipboard-play::before{content:"\F0C59"}.mdi-clipboard-play-multiple::before{content:"\F1269"}.mdi-clipboard-play-multiple-outline::before{content:"\F126A"}.mdi-clipboard-play-outline::before{content:"\F0C5A"}.mdi-clipboard-plus::before{content:"\F0751"}.mdi-clipboard-plus-outline::before{content:"\F131F"}.mdi-clipboard-pulse::before{content:"\F085D"}.mdi-clipboard-pulse-outline::before{content:"\F085E"}.mdi-clipboard-remove::before{content:"\F161C"}.mdi-clipboard-remove-outline::before{content:"\F161D"}.mdi-clipboard-search::before{content:"\F161E"}.mdi-clipboard-search-outline::before{content:"\F161F"}.mdi-clipboard-text::before{content:"\F014D"}.mdi-clipboard-text-clock::before{content:"\F18F9"}.mdi-clipboard-text-clock-outline::before{content:"\F18FA"}.mdi-clipboard-text-multiple::before{content:"\F126B"}.mdi-clipboard-text-multiple-outline::before{content:"\F126C"}.mdi-clipboard-text-off::before{content:"\F1620"}.mdi-clipboard-text-off-outline::before{content:"\F1621"}.mdi-clipboard-text-outline::before{content:"\F0A38"}.mdi-clipboard-text-play::before{content:"\F0C5B"}.mdi-clipboard-text-play-outline::before{content:"\F0C5C"}.mdi-clipboard-text-search::before{content:"\F1622"}.mdi-clipboard-text-search-outline::before{content:"\F1623"}.mdi-clippy::before{content:"\F014F"}.mdi-clock::before{content:"\F0954"}.mdi-clock-alert::before{content:"\F0955"}.mdi-clock-alert-outline::before{content:"\F05CE"}.mdi-clock-check::before{content:"\F0FA8"}.mdi-clock-check-outline::before{content:"\F0FA9"}.mdi-clock-digital::before{content:"\F0E97"}.mdi-clock-edit::before{content:"\F19BA"}.mdi-clock-edit-outline::before{content:"\F19BB"}.mdi-clock-end::before{content:"\F0151"}.mdi-clock-fast::before{content:"\F0152"}.mdi-clock-in::before{content:"\F0153"}.mdi-clock-minus::before{content:"\F1863"}.mdi-clock-minus-outline::before{content:"\F1864"}.mdi-clock-out::before{content:"\F0154"}.mdi-clock-outline::before{content:"\F0150"}.mdi-clock-plus::before{content:"\F1861"}.mdi-clock-plus-outline::before{content:"\F1862"}.mdi-clock-remove::before{content:"\F1865"}.mdi-clock-remove-outline::before{content:"\F1866"}.mdi-clock-star-four-points::before{content:"\F1C29"}.mdi-clock-star-four-points-outline::before{content:"\F1C2A"}.mdi-clock-start::before{content:"\F0155"}.mdi-clock-time-eight::before{content:"\F1446"}.mdi-clock-time-eight-outline::before{content:"\F1452"}.mdi-clock-time-eleven::before{content:"\F1449"}.mdi-clock-time-eleven-outline::before{content:"\F1455"}.mdi-clock-time-five::before{content:"\F1443"}.mdi-clock-time-five-outline::before{content:"\F144F"}.mdi-clock-time-four::before{content:"\F1442"}.mdi-clock-time-four-outline::before{content:"\F144E"}.mdi-clock-time-nine::before{content:"\F1447"}.mdi-clock-time-nine-outline::before{content:"\F1453"}.mdi-clock-time-one::before{content:"\F143F"}.mdi-clock-time-one-outline::before{content:"\F144B"}.mdi-clock-time-seven::before{content:"\F1445"}.mdi-clock-time-seven-outline::before{content:"\F1451"}.mdi-clock-time-six::before{content:"\F1444"}.mdi-clock-time-six-outline::before{content:"\F1450"}.mdi-clock-time-ten::before{content:"\F1448"}.mdi-clock-time-ten-outline::before{content:"\F1454"}.mdi-clock-time-three::before{content:"\F1441"}.mdi-clock-time-three-outline::before{content:"\F144D"}.mdi-clock-time-twelve::before{content:"\F144A"}.mdi-clock-time-twelve-outline::before{content:"\F1456"}.mdi-clock-time-two::before{content:"\F1440"}.mdi-clock-time-two-outline::before{content:"\F144C"}.mdi-close::before{content:"\F0156"}.mdi-close-box::before{content:"\F0157"}.mdi-close-box-multiple::before{content:"\F0C5D"}.mdi-close-box-multiple-outline::before{content:"\F0C5E"}.mdi-close-box-outline::before{content:"\F0158"}.mdi-close-circle::before{content:"\F0159"}.mdi-close-circle-multiple::before{content:"\F062A"}.mdi-close-circle-multiple-outline::before{content:"\F0883"}.mdi-close-circle-outline::before{content:"\F015A"}.mdi-close-network::before{content:"\F015B"}.mdi-close-network-outline::before{content:"\F0C5F"}.mdi-close-octagon::before{content:"\F015C"}.mdi-close-octagon-outline::before{content:"\F015D"}.mdi-close-outline::before{content:"\F06C9"}.mdi-close-thick::before{content:"\F1398"}.mdi-closed-caption::before{content:"\F015E"}.mdi-closed-caption-outline::before{content:"\F0DBD"}.mdi-cloud::before{content:"\F015F"}.mdi-cloud-alert::before{content:"\F09E0"}.mdi-cloud-alert-outline::before{content:"\F1BE0"}.mdi-cloud-arrow-down::before{content:"\F1BE1"}.mdi-cloud-arrow-down-outline::before{content:"\F1BE2"}.mdi-cloud-arrow-left::before{content:"\F1BE3"}.mdi-cloud-arrow-left-outline::before{content:"\F1BE4"}.mdi-cloud-arrow-right::before{content:"\F1BE5"}.mdi-cloud-arrow-right-outline::before{content:"\F1BE6"}.mdi-cloud-arrow-up::before{content:"\F1BE7"}.mdi-cloud-arrow-up-outline::before{content:"\F1BE8"}.mdi-cloud-braces::before{content:"\F07B5"}.mdi-cloud-cancel::before{content:"\F1BE9"}.mdi-cloud-cancel-outline::before{content:"\F1BEA"}.mdi-cloud-check::before{content:"\F1BEB"}.mdi-cloud-check-outline::before{content:"\F1BEC"}.mdi-cloud-check-variant::before{content:"\F0160"}.mdi-cloud-check-variant-outline::before{content:"\F12CC"}.mdi-cloud-circle::before{content:"\F0161"}.mdi-cloud-circle-outline::before{content:"\F1BED"}.mdi-cloud-clock::before{content:"\F1BEE"}.mdi-cloud-clock-outline::before{content:"\F1BEF"}.mdi-cloud-cog::before{content:"\F1BF0"}.mdi-cloud-cog-outline::before{content:"\F1BF1"}.mdi-cloud-download::before{content:"\F0162"}.mdi-cloud-download-outline::before{content:"\F0B7D"}.mdi-cloud-key::before{content:"\F1CA1"}.mdi-cloud-key-outline::before{content:"\F1CA2"}.mdi-cloud-lock::before{content:"\F11F1"}.mdi-cloud-lock-open::before{content:"\F1BF2"}.mdi-cloud-lock-open-outline::before{content:"\F1BF3"}.mdi-cloud-lock-outline::before{content:"\F11F2"}.mdi-cloud-minus::before{content:"\F1BF4"}.mdi-cloud-minus-outline::before{content:"\F1BF5"}.mdi-cloud-off::before{content:"\F1BF6"}.mdi-cloud-off-outline::before{content:"\F0164"}.mdi-cloud-outline::before{content:"\F0163"}.mdi-cloud-percent::before{content:"\F1A35"}.mdi-cloud-percent-outline::before{content:"\F1A36"}.mdi-cloud-plus::before{content:"\F1BF7"}.mdi-cloud-plus-outline::before{content:"\F1BF8"}.mdi-cloud-print::before{content:"\F0165"}.mdi-cloud-print-outline::before{content:"\F0166"}.mdi-cloud-question::before{content:"\F0A39"}.mdi-cloud-question-outline::before{content:"\F1BF9"}.mdi-cloud-refresh::before{content:"\F1BFA"}.mdi-cloud-refresh-outline::before{content:"\F1BFB"}.mdi-cloud-refresh-variant::before{content:"\F052A"}.mdi-cloud-refresh-variant-outline::before{content:"\F1BFC"}.mdi-cloud-remove::before{content:"\F1BFD"}.mdi-cloud-remove-outline::before{content:"\F1BFE"}.mdi-cloud-search::before{content:"\F0956"}.mdi-cloud-search-outline::before{content:"\F0957"}.mdi-cloud-sync::before{content:"\F063F"}.mdi-cloud-sync-outline::before{content:"\F12D6"}.mdi-cloud-tags::before{content:"\F07B6"}.mdi-cloud-upload::before{content:"\F0167"}.mdi-cloud-upload-outline::before{content:"\F0B7E"}.mdi-clouds::before{content:"\F1B95"}.mdi-clover::before{content:"\F0816"}.mdi-clover-outline::before{content:"\F1C62"}.mdi-coach-lamp::before{content:"\F1020"}.mdi-coach-lamp-variant::before{content:"\F1A37"}.mdi-coat-rack::before{content:"\F109E"}.mdi-code-array::before{content:"\F0168"}.mdi-code-block-braces::before{content:"\F1C83"}.mdi-code-block-brackets::before{content:"\F1C84"}.mdi-code-block-parentheses::before{content:"\F1C85"}.mdi-code-block-tags::before{content:"\F1C86"}.mdi-code-braces::before{content:"\F0169"}.mdi-code-braces-box::before{content:"\F10D6"}.mdi-code-brackets::before{content:"\F016A"}.mdi-code-equal::before{content:"\F016B"}.mdi-code-greater-than::before{content:"\F016C"}.mdi-code-greater-than-or-equal::before{content:"\F016D"}.mdi-code-json::before{content:"\F0626"}.mdi-code-less-than::before{content:"\F016E"}.mdi-code-less-than-or-equal::before{content:"\F016F"}.mdi-code-not-equal::before{content:"\F0170"}.mdi-code-not-equal-variant::before{content:"\F0171"}.mdi-code-parentheses::before{content:"\F0172"}.mdi-code-parentheses-box::before{content:"\F10D7"}.mdi-code-string::before{content:"\F0173"}.mdi-code-tags::before{content:"\F0174"}.mdi-code-tags-check::before{content:"\F0694"}.mdi-codepen::before{content:"\F0175"}.mdi-coffee::before{content:"\F0176"}.mdi-coffee-maker::before{content:"\F109F"}.mdi-coffee-maker-check::before{content:"\F1931"}.mdi-coffee-maker-check-outline::before{content:"\F1932"}.mdi-coffee-maker-outline::before{content:"\F181B"}.mdi-coffee-off::before{content:"\F0FAA"}.mdi-coffee-off-outline::before{content:"\F0FAB"}.mdi-coffee-outline::before{content:"\F06CA"}.mdi-coffee-to-go::before{content:"\F0177"}.mdi-coffee-to-go-outline::before{content:"\F130E"}.mdi-coffin::before{content:"\F0B7F"}.mdi-cog::before{content:"\F0493"}.mdi-cog-box::before{content:"\F0494"}.mdi-cog-clockwise::before{content:"\F11DD"}.mdi-cog-counterclockwise::before{content:"\F11DE"}.mdi-cog-off::before{content:"\F13CE"}.mdi-cog-off-outline::before{content:"\F13CF"}.mdi-cog-outline::before{content:"\F08BB"}.mdi-cog-pause::before{content:"\F1933"}.mdi-cog-pause-outline::before{content:"\F1934"}.mdi-cog-play::before{content:"\F1935"}.mdi-cog-play-outline::before{content:"\F1936"}.mdi-cog-refresh::before{content:"\F145E"}.mdi-cog-refresh-outline::before{content:"\F145F"}.mdi-cog-stop::before{content:"\F1937"}.mdi-cog-stop-outline::before{content:"\F1938"}.mdi-cog-sync::before{content:"\F1460"}.mdi-cog-sync-outline::before{content:"\F1461"}.mdi-cog-transfer::before{content:"\F105B"}.mdi-cog-transfer-outline::before{content:"\F105C"}.mdi-cogs::before{content:"\F08D6"}.mdi-collage::before{content:"\F0640"}.mdi-collapse-all::before{content:"\F0AA6"}.mdi-collapse-all-outline::before{content:"\F0AA7"}.mdi-color-helper::before{content:"\F0179"}.mdi-comma::before{content:"\F0E23"}.mdi-comma-box::before{content:"\F0E2B"}.mdi-comma-box-outline::before{content:"\F0E24"}.mdi-comma-circle::before{content:"\F0E25"}.mdi-comma-circle-outline::before{content:"\F0E26"}.mdi-comment::before{content:"\F017A"}.mdi-comment-account::before{content:"\F017B"}.mdi-comment-account-outline::before{content:"\F017C"}.mdi-comment-alert::before{content:"\F017D"}.mdi-comment-alert-outline::before{content:"\F017E"}.mdi-comment-arrow-left::before{content:"\F09E1"}.mdi-comment-arrow-left-outline::before{content:"\F09E2"}.mdi-comment-arrow-right::before{content:"\F09E3"}.mdi-comment-arrow-right-outline::before{content:"\F09E4"}.mdi-comment-bookmark::before{content:"\F15AE"}.mdi-comment-bookmark-outline::before{content:"\F15AF"}.mdi-comment-check::before{content:"\F017F"}.mdi-comment-check-outline::before{content:"\F0180"}.mdi-comment-edit::before{content:"\F11BF"}.mdi-comment-edit-outline::before{content:"\F12C4"}.mdi-comment-eye::before{content:"\F0A3A"}.mdi-comment-eye-outline::before{content:"\F0A3B"}.mdi-comment-flash::before{content:"\F15B0"}.mdi-comment-flash-outline::before{content:"\F15B1"}.mdi-comment-minus::before{content:"\F15DF"}.mdi-comment-minus-outline::before{content:"\F15E0"}.mdi-comment-multiple::before{content:"\F085F"}.mdi-comment-multiple-outline::before{content:"\F0181"}.mdi-comment-off::before{content:"\F15E1"}.mdi-comment-off-outline::before{content:"\F15E2"}.mdi-comment-outline::before{content:"\F0182"}.mdi-comment-plus::before{content:"\F09E5"}.mdi-comment-plus-outline::before{content:"\F0183"}.mdi-comment-processing::before{content:"\F0184"}.mdi-comment-processing-outline::before{content:"\F0185"}.mdi-comment-question::before{content:"\F0817"}.mdi-comment-question-outline::before{content:"\F0186"}.mdi-comment-quote::before{content:"\F1021"}.mdi-comment-quote-outline::before{content:"\F1022"}.mdi-comment-remove::before{content:"\F05DE"}.mdi-comment-remove-outline::before{content:"\F0187"}.mdi-comment-search::before{content:"\F0A3C"}.mdi-comment-search-outline::before{content:"\F0A3D"}.mdi-comment-text::before{content:"\F0188"}.mdi-comment-text-multiple::before{content:"\F0860"}.mdi-comment-text-multiple-outline::before{content:"\F0861"}.mdi-comment-text-outline::before{content:"\F0189"}.mdi-compare::before{content:"\F018A"}.mdi-compare-horizontal::before{content:"\F1492"}.mdi-compare-remove::before{content:"\F18B3"}.mdi-compare-vertical::before{content:"\F1493"}.mdi-compass::before{content:"\F018B"}.mdi-compass-off::before{content:"\F0B80"}.mdi-compass-off-outline::before{content:"\F0B81"}.mdi-compass-outline::before{content:"\F018C"}.mdi-compass-rose::before{content:"\F1382"}.mdi-compost::before{content:"\F1A38"}.mdi-cone::before{content:"\F194C"}.mdi-cone-off::before{content:"\F194D"}.mdi-connection::before{content:"\F1616"}.mdi-console::before{content:"\F018D"}.mdi-console-line::before{content:"\F07B7"}.mdi-console-network::before{content:"\F08A9"}.mdi-console-network-outline::before{content:"\F0C60"}.mdi-consolidate::before{content:"\F10D8"}.mdi-contactless-payment::before{content:"\F0D6A"}.mdi-contactless-payment-circle::before{content:"\F0321"}.mdi-contactless-payment-circle-outline::before{content:"\F0408"}.mdi-contacts::before{content:"\F06CB"}.mdi-contacts-outline::before{content:"\F05B8"}.mdi-contain::before{content:"\F0A3E"}.mdi-contain-end::before{content:"\F0A3F"}.mdi-contain-start::before{content:"\F0A40"}.mdi-content-copy::before{content:"\F018F"}.mdi-content-cut::before{content:"\F0190"}.mdi-content-duplicate::before{content:"\F0191"}.mdi-content-paste::before{content:"\F0192"}.mdi-content-save::before{content:"\F0193"}.mdi-content-save-alert::before{content:"\F0F42"}.mdi-content-save-alert-outline::before{content:"\F0F43"}.mdi-content-save-all::before{content:"\F0194"}.mdi-content-save-all-outline::before{content:"\F0F44"}.mdi-content-save-check::before{content:"\F18EA"}.mdi-content-save-check-outline::before{content:"\F18EB"}.mdi-content-save-cog::before{content:"\F145B"}.mdi-content-save-cog-outline::before{content:"\F145C"}.mdi-content-save-edit::before{content:"\F0CFB"}.mdi-content-save-edit-outline::before{content:"\F0CFC"}.mdi-content-save-minus::before{content:"\F1B43"}.mdi-content-save-minus-outline::before{content:"\F1B44"}.mdi-content-save-move::before{content:"\F0E27"}.mdi-content-save-move-outline::before{content:"\F0E28"}.mdi-content-save-off::before{content:"\F1643"}.mdi-content-save-off-outline::before{content:"\F1644"}.mdi-content-save-outline::before{content:"\F0818"}.mdi-content-save-plus::before{content:"\F1B41"}.mdi-content-save-plus-outline::before{content:"\F1B42"}.mdi-content-save-settings::before{content:"\F061B"}.mdi-content-save-settings-outline::before{content:"\F0B2E"}.mdi-contrast::before{content:"\F0195"}.mdi-contrast-box::before{content:"\F0196"}.mdi-contrast-circle::before{content:"\F0197"}.mdi-controller::before{content:"\F02B4"}.mdi-controller-classic::before{content:"\F0B82"}.mdi-controller-classic-outline::before{content:"\F0B83"}.mdi-controller-off::before{content:"\F02B5"}.mdi-cookie::before{content:"\F0198"}.mdi-cookie-alert::before{content:"\F16D0"}.mdi-cookie-alert-outline::before{content:"\F16D1"}.mdi-cookie-check::before{content:"\F16D2"}.mdi-cookie-check-outline::before{content:"\F16D3"}.mdi-cookie-clock::before{content:"\F16E4"}.mdi-cookie-clock-outline::before{content:"\F16E5"}.mdi-cookie-cog::before{content:"\F16D4"}.mdi-cookie-cog-outline::before{content:"\F16D5"}.mdi-cookie-edit::before{content:"\F16E6"}.mdi-cookie-edit-outline::before{content:"\F16E7"}.mdi-cookie-lock::before{content:"\F16E8"}.mdi-cookie-lock-outline::before{content:"\F16E9"}.mdi-cookie-minus::before{content:"\F16DA"}.mdi-cookie-minus-outline::before{content:"\F16DB"}.mdi-cookie-off::before{content:"\F16EA"}.mdi-cookie-off-outline::before{content:"\F16EB"}.mdi-cookie-outline::before{content:"\F16DE"}.mdi-cookie-plus::before{content:"\F16D6"}.mdi-cookie-plus-outline::before{content:"\F16D7"}.mdi-cookie-refresh::before{content:"\F16EC"}.mdi-cookie-refresh-outline::before{content:"\F16ED"}.mdi-cookie-remove::before{content:"\F16D8"}.mdi-cookie-remove-outline::before{content:"\F16D9"}.mdi-cookie-settings::before{content:"\F16DC"}.mdi-cookie-settings-outline::before{content:"\F16DD"}.mdi-coolant-temperature::before{content:"\F03C8"}.mdi-copyleft::before{content:"\F1939"}.mdi-copyright::before{content:"\F05E6"}.mdi-cordova::before{content:"\F0958"}.mdi-corn::before{content:"\F07B8"}.mdi-corn-off::before{content:"\F13EF"}.mdi-cosine-wave::before{content:"\F1479"}.mdi-counter::before{content:"\F0199"}.mdi-countertop::before{content:"\F181C"}.mdi-countertop-outline::before{content:"\F181D"}.mdi-cow::before{content:"\F019A"}.mdi-cow-off::before{content:"\F18FC"}.mdi-cpu-32-bit::before{content:"\F0EDF"}.mdi-cpu-64-bit::before{content:"\F0EE0"}.mdi-cradle::before{content:"\F198B"}.mdi-cradle-outline::before{content:"\F1991"}.mdi-crane::before{content:"\F0862"}.mdi-creation::before{content:"\F0674"}.mdi-creation-outline::before{content:"\F1C2B"}.mdi-creative-commons::before{content:"\F0D6B"}.mdi-credit-card::before{content:"\F0FEF"}.mdi-credit-card-check::before{content:"\F13D0"}.mdi-credit-card-check-outline::before{content:"\F13D1"}.mdi-credit-card-chip::before{content:"\F190F"}.mdi-credit-card-chip-outline::before{content:"\F1910"}.mdi-credit-card-clock::before{content:"\F0EE1"}.mdi-credit-card-clock-outline::before{content:"\F0EE2"}.mdi-credit-card-edit::before{content:"\F17D7"}.mdi-credit-card-edit-outline::before{content:"\F17D8"}.mdi-credit-card-fast::before{content:"\F1911"}.mdi-credit-card-fast-outline::before{content:"\F1912"}.mdi-credit-card-lock::before{content:"\F18E7"}.mdi-credit-card-lock-outline::before{content:"\F18E8"}.mdi-credit-card-marker::before{content:"\F06A8"}.mdi-credit-card-marker-outline::before{content:"\F0DBE"}.mdi-credit-card-minus::before{content:"\F0FAC"}.mdi-credit-card-minus-outline::before{content:"\F0FAD"}.mdi-credit-card-multiple::before{content:"\F0FF0"}.mdi-credit-card-multiple-outline::before{content:"\F019C"}.mdi-credit-card-off::before{content:"\F0FF1"}.mdi-credit-card-off-outline::before{content:"\F05E4"}.mdi-credit-card-outline::before{content:"\F019B"}.mdi-credit-card-plus::before{content:"\F0FF2"}.mdi-credit-card-plus-outline::before{content:"\F0676"}.mdi-credit-card-refresh::before{content:"\F1645"}.mdi-credit-card-refresh-outline::before{content:"\F1646"}.mdi-credit-card-refund::before{content:"\F0FF3"}.mdi-credit-card-refund-outline::before{content:"\F0AA8"}.mdi-credit-card-remove::before{content:"\F0FAE"}.mdi-credit-card-remove-outline::before{content:"\F0FAF"}.mdi-credit-card-scan::before{content:"\F0FF4"}.mdi-credit-card-scan-outline::before{content:"\F019D"}.mdi-credit-card-search::before{content:"\F1647"}.mdi-credit-card-search-outline::before{content:"\F1648"}.mdi-credit-card-settings::before{content:"\F0FF5"}.mdi-credit-card-settings-outline::before{content:"\F08D7"}.mdi-credit-card-sync::before{content:"\F1649"}.mdi-credit-card-sync-outline::before{content:"\F164A"}.mdi-credit-card-wireless::before{content:"\F0802"}.mdi-credit-card-wireless-off::before{content:"\F057A"}.mdi-credit-card-wireless-off-outline::before{content:"\F057B"}.mdi-credit-card-wireless-outline::before{content:"\F0D6C"}.mdi-cricket::before{content:"\F0D6D"}.mdi-crop::before{content:"\F019E"}.mdi-crop-free::before{content:"\F019F"}.mdi-crop-landscape::before{content:"\F01A0"}.mdi-crop-portrait::before{content:"\F01A1"}.mdi-crop-rotate::before{content:"\F0696"}.mdi-crop-square::before{content:"\F01A2"}.mdi-cross::before{content:"\F0953"}.mdi-cross-bolnisi::before{content:"\F0CED"}.mdi-cross-celtic::before{content:"\F0CF5"}.mdi-cross-outline::before{content:"\F0CF6"}.mdi-crosshairs::before{content:"\F01A3"}.mdi-crosshairs-gps::before{content:"\F01A4"}.mdi-crosshairs-off::before{content:"\F0F45"}.mdi-crosshairs-question::before{content:"\F1136"}.mdi-crowd::before{content:"\F1975"}.mdi-crown::before{content:"\F01A5"}.mdi-crown-circle::before{content:"\F17DC"}.mdi-crown-circle-outline::before{content:"\F17DD"}.mdi-crown-outline::before{content:"\F11D0"}.mdi-cryengine::before{content:"\F0959"}.mdi-crystal-ball::before{content:"\F0B2F"}.mdi-cube::before{content:"\F01A6"}.mdi-cube-off::before{content:"\F141C"}.mdi-cube-off-outline::before{content:"\F141D"}.mdi-cube-outline::before{content:"\F01A7"}.mdi-cube-scan::before{content:"\F0B84"}.mdi-cube-send::before{content:"\F01A8"}.mdi-cube-unfolded::before{content:"\F01A9"}.mdi-cup::before{content:"\F01AA"}.mdi-cup-off::before{content:"\F05E5"}.mdi-cup-off-outline::before{content:"\F137D"}.mdi-cup-outline::before{content:"\F130F"}.mdi-cup-water::before{content:"\F01AB"}.mdi-cupboard::before{content:"\F0F46"}.mdi-cupboard-outline::before{content:"\F0F47"}.mdi-cupcake::before{content:"\F095A"}.mdi-curling::before{content:"\F0863"}.mdi-currency-bdt::before{content:"\F0864"}.mdi-currency-brl::before{content:"\F0B85"}.mdi-currency-btc::before{content:"\F01AC"}.mdi-currency-cny::before{content:"\F07BA"}.mdi-currency-eth::before{content:"\F07BB"}.mdi-currency-eur::before{content:"\F01AD"}.mdi-currency-eur-off::before{content:"\F1315"}.mdi-currency-fra::before{content:"\F1A39"}.mdi-currency-gbp::before{content:"\F01AE"}.mdi-currency-ils::before{content:"\F0C61"}.mdi-currency-inr::before{content:"\F01AF"}.mdi-currency-jpy::before{content:"\F07BC"}.mdi-currency-krw::before{content:"\F07BD"}.mdi-currency-kzt::before{content:"\F0865"}.mdi-currency-mnt::before{content:"\F1512"}.mdi-currency-ngn::before{content:"\F01B0"}.mdi-currency-php::before{content:"\F09E6"}.mdi-currency-rial::before{content:"\F0E9C"}.mdi-currency-rub::before{content:"\F01B1"}.mdi-currency-rupee::before{content:"\F1976"}.mdi-currency-sign::before{content:"\F07BE"}.mdi-currency-thb::before{content:"\F1C05"}.mdi-currency-try::before{content:"\F01B2"}.mdi-currency-twd::before{content:"\F07BF"}.mdi-currency-uah::before{content:"\F1B9B"}.mdi-currency-usd::before{content:"\F01C1"}.mdi-currency-usd-off::before{content:"\F067A"}.mdi-current-ac::before{content:"\F1480"}.mdi-current-dc::before{content:"\F095C"}.mdi-cursor-default::before{content:"\F01C0"}.mdi-cursor-default-click::before{content:"\F0CFD"}.mdi-cursor-default-click-outline::before{content:"\F0CFE"}.mdi-cursor-default-gesture::before{content:"\F1127"}.mdi-cursor-default-gesture-outline::before{content:"\F1128"}.mdi-cursor-default-outline::before{content:"\F01BF"}.mdi-cursor-move::before{content:"\F01BE"}.mdi-cursor-pointer::before{content:"\F01BD"}.mdi-cursor-text::before{content:"\F05E7"}.mdi-curtains::before{content:"\F1846"}.mdi-curtains-closed::before{content:"\F1847"}.mdi-cylinder::before{content:"\F194E"}.mdi-cylinder-off::before{content:"\F194F"}.mdi-dance-ballroom::before{content:"\F15FB"}.mdi-dance-pole::before{content:"\F1578"}.mdi-data-matrix::before{content:"\F153C"}.mdi-data-matrix-edit::before{content:"\F153D"}.mdi-data-matrix-minus::before{content:"\F153E"}.mdi-data-matrix-plus::before{content:"\F153F"}.mdi-data-matrix-remove::before{content:"\F1540"}.mdi-data-matrix-scan::before{content:"\F1541"}.mdi-database::before{content:"\F01BC"}.mdi-database-alert::before{content:"\F163A"}.mdi-database-alert-outline::before{content:"\F1624"}.mdi-database-arrow-down::before{content:"\F163B"}.mdi-database-arrow-down-outline::before{content:"\F1625"}.mdi-database-arrow-left::before{content:"\F163C"}.mdi-database-arrow-left-outline::before{content:"\F1626"}.mdi-database-arrow-right::before{content:"\F163D"}.mdi-database-arrow-right-outline::before{content:"\F1627"}.mdi-database-arrow-up::before{content:"\F163E"}.mdi-database-arrow-up-outline::before{content:"\F1628"}.mdi-database-check::before{content:"\F0AA9"}.mdi-database-check-outline::before{content:"\F1629"}.mdi-database-clock::before{content:"\F163F"}.mdi-database-clock-outline::before{content:"\F162A"}.mdi-database-cog::before{content:"\F164B"}.mdi-database-cog-outline::before{content:"\F164C"}.mdi-database-edit::before{content:"\F0B86"}.mdi-database-edit-outline::before{content:"\F162B"}.mdi-database-export::before{content:"\F095E"}.mdi-database-export-outline::before{content:"\F162C"}.mdi-database-eye::before{content:"\F191F"}.mdi-database-eye-off::before{content:"\F1920"}.mdi-database-eye-off-outline::before{content:"\F1921"}.mdi-database-eye-outline::before{content:"\F1922"}.mdi-database-import::before{content:"\F095D"}.mdi-database-import-outline::before{content:"\F162D"}.mdi-database-lock::before{content:"\F0AAA"}.mdi-database-lock-outline::before{content:"\F162E"}.mdi-database-marker::before{content:"\F12F6"}.mdi-database-marker-outline::before{content:"\F162F"}.mdi-database-minus::before{content:"\F01BB"}.mdi-database-minus-outline::before{content:"\F1630"}.mdi-database-off::before{content:"\F1640"}.mdi-database-off-outline::before{content:"\F1631"}.mdi-database-outline::before{content:"\F1632"}.mdi-database-plus::before{content:"\F01BA"}.mdi-database-plus-outline::before{content:"\F1633"}.mdi-database-refresh::before{content:"\F05C2"}.mdi-database-refresh-outline::before{content:"\F1634"}.mdi-database-remove::before{content:"\F0D00"}.mdi-database-remove-outline::before{content:"\F1635"}.mdi-database-search::before{content:"\F0866"}.mdi-database-search-outline::before{content:"\F1636"}.mdi-database-settings::before{content:"\F0D01"}.mdi-database-settings-outline::before{content:"\F1637"}.mdi-database-sync::before{content:"\F0CFF"}.mdi-database-sync-outline::before{content:"\F1638"}.mdi-death-star::before{content:"\F08D8"}.mdi-death-star-variant::before{content:"\F08D9"}.mdi-deathly-hallows::before{content:"\F0B87"}.mdi-debian::before{content:"\F08DA"}.mdi-debug-step-into::before{content:"\F01B9"}.mdi-debug-step-out::before{content:"\F01B8"}.mdi-debug-step-over::before{content:"\F01B7"}.mdi-decagram::before{content:"\F076C"}.mdi-decagram-outline::before{content:"\F076D"}.mdi-decimal::before{content:"\F10A1"}.mdi-decimal-comma::before{content:"\F10A2"}.mdi-decimal-comma-decrease::before{content:"\F10A3"}.mdi-decimal-comma-increase::before{content:"\F10A4"}.mdi-decimal-decrease::before{content:"\F01B6"}.mdi-decimal-increase::before{content:"\F01B5"}.mdi-delete::before{content:"\F01B4"}.mdi-delete-alert::before{content:"\F10A5"}.mdi-delete-alert-outline::before{content:"\F10A6"}.mdi-delete-circle::before{content:"\F0683"}.mdi-delete-circle-outline::before{content:"\F0B88"}.mdi-delete-clock::before{content:"\F1556"}.mdi-delete-clock-outline::before{content:"\F1557"}.mdi-delete-empty::before{content:"\F06CC"}.mdi-delete-empty-outline::before{content:"\F0E9D"}.mdi-delete-forever::before{content:"\F05E8"}.mdi-delete-forever-outline::before{content:"\F0B89"}.mdi-delete-off::before{content:"\F10A7"}.mdi-delete-off-outline::before{content:"\F10A8"}.mdi-delete-outline::before{content:"\F09E7"}.mdi-delete-restore::before{content:"\F0819"}.mdi-delete-sweep::before{content:"\F05E9"}.mdi-delete-sweep-outline::before{content:"\F0C62"}.mdi-delete-variant::before{content:"\F01B3"}.mdi-delta::before{content:"\F01C2"}.mdi-desk::before{content:"\F1239"}.mdi-desk-lamp::before{content:"\F095F"}.mdi-desk-lamp-off::before{content:"\F1B1F"}.mdi-desk-lamp-on::before{content:"\F1B20"}.mdi-deskphone::before{content:"\F01C3"}.mdi-desktop-classic::before{content:"\F07C0"}.mdi-desktop-tower::before{content:"\F01C5"}.mdi-desktop-tower-monitor::before{content:"\F0AAB"}.mdi-details::before{content:"\F01C6"}.mdi-dev-to::before{content:"\F0D6E"}.mdi-developer-board::before{content:"\F0697"}.mdi-deviantart::before{content:"\F01C7"}.mdi-devices::before{content:"\F0FB0"}.mdi-dharmachakra::before{content:"\F094B"}.mdi-diabetes::before{content:"\F1126"}.mdi-dialpad::before{content:"\F061C"}.mdi-diameter::before{content:"\F0C63"}.mdi-diameter-outline::before{content:"\F0C64"}.mdi-diameter-variant::before{content:"\F0C65"}.mdi-diamond::before{content:"\F0B8A"}.mdi-diamond-outline::before{content:"\F0B8B"}.mdi-diamond-stone::before{content:"\F01C8"}.mdi-diaper-outline::before{content:"\F1CCF"}.mdi-dice-1::before{content:"\F01CA"}.mdi-dice-1-outline::before{content:"\F114A"}.mdi-dice-2::before{content:"\F01CB"}.mdi-dice-2-outline::before{content:"\F114B"}.mdi-dice-3::before{content:"\F01CC"}.mdi-dice-3-outline::before{content:"\F114C"}.mdi-dice-4::before{content:"\F01CD"}.mdi-dice-4-outline::before{content:"\F114D"}.mdi-dice-5::before{content:"\F01CE"}.mdi-dice-5-outline::before{content:"\F114E"}.mdi-dice-6::before{content:"\F01CF"}.mdi-dice-6-outline::before{content:"\F114F"}.mdi-dice-d10::before{content:"\F1153"}.mdi-dice-d10-outline::before{content:"\F076F"}.mdi-dice-d12::before{content:"\F1154"}.mdi-dice-d12-outline::before{content:"\F0867"}.mdi-dice-d20::before{content:"\F1155"}.mdi-dice-d20-outline::before{content:"\F05EA"}.mdi-dice-d4::before{content:"\F1150"}.mdi-dice-d4-outline::before{content:"\F05EB"}.mdi-dice-d6::before{content:"\F1151"}.mdi-dice-d6-outline::before{content:"\F05ED"}.mdi-dice-d8::before{content:"\F1152"}.mdi-dice-d8-outline::before{content:"\F05EC"}.mdi-dice-multiple::before{content:"\F076E"}.mdi-dice-multiple-outline::before{content:"\F1156"}.mdi-digital-ocean::before{content:"\F1237"}.mdi-dip-switch::before{content:"\F07C1"}.mdi-directions::before{content:"\F01D0"}.mdi-directions-fork::before{content:"\F0641"}.mdi-disc::before{content:"\F05EE"}.mdi-disc-alert::before{content:"\F01D1"}.mdi-disc-player::before{content:"\F0960"}.mdi-dishwasher::before{content:"\F0AAC"}.mdi-dishwasher-alert::before{content:"\F11B8"}.mdi-dishwasher-off::before{content:"\F11B9"}.mdi-disqus::before{content:"\F01D2"}.mdi-distribute-horizontal-center::before{content:"\F11C9"}.mdi-distribute-horizontal-left::before{content:"\F11C8"}.mdi-distribute-horizontal-right::before{content:"\F11CA"}.mdi-distribute-vertical-bottom::before{content:"\F11CB"}.mdi-distribute-vertical-center::before{content:"\F11CC"}.mdi-distribute-vertical-top::before{content:"\F11CD"}.mdi-diversify::before{content:"\F1877"}.mdi-diving::before{content:"\F1977"}.mdi-diving-flippers::before{content:"\F0DBF"}.mdi-diving-helmet::before{content:"\F0DC0"}.mdi-diving-scuba::before{content:"\F1B77"}.mdi-diving-scuba-flag::before{content:"\F0DC2"}.mdi-diving-scuba-mask::before{content:"\F0DC1"}.mdi-diving-scuba-tank::before{content:"\F0DC3"}.mdi-diving-scuba-tank-multiple::before{content:"\F0DC4"}.mdi-diving-snorkel::before{content:"\F0DC5"}.mdi-division::before{content:"\F01D4"}.mdi-division-box::before{content:"\F01D5"}.mdi-dlna::before{content:"\F0A41"}.mdi-dna::before{content:"\F0684"}.mdi-dns::before{content:"\F01D6"}.mdi-dns-outline::before{content:"\F0B8C"}.mdi-dock-bottom::before{content:"\F10A9"}.mdi-dock-left::before{content:"\F10AA"}.mdi-dock-right::before{content:"\F10AB"}.mdi-dock-top::before{content:"\F1513"}.mdi-dock-window::before{content:"\F10AC"}.mdi-docker::before{content:"\F0868"}.mdi-doctor::before{content:"\F0A42"}.mdi-dog::before{content:"\F0A43"}.mdi-dog-service::before{content:"\F0AAD"}.mdi-dog-side::before{content:"\F0A44"}.mdi-dog-side-off::before{content:"\F16EE"}.mdi-dolby::before{content:"\F06B3"}.mdi-dolly::before{content:"\F0E9E"}.mdi-dolphin::before{content:"\F18B4"}.mdi-domain::before{content:"\F01D7"}.mdi-domain-off::before{content:"\F0D6F"}.mdi-domain-plus::before{content:"\F10AD"}.mdi-domain-remove::before{content:"\F10AE"}.mdi-domain-switch::before{content:"\F1C2C"}.mdi-dome-light::before{content:"\F141E"}.mdi-domino-mask::before{content:"\F1023"}.mdi-donkey::before{content:"\F07C2"}.mdi-door::before{content:"\F081A"}.mdi-door-closed::before{content:"\F081B"}.mdi-door-closed-cancel::before{content:"\F1C93"}.mdi-door-closed-lock::before{content:"\F10AF"}.mdi-door-open::before{content:"\F081C"}.mdi-door-sliding::before{content:"\F181E"}.mdi-door-sliding-lock::before{content:"\F181F"}.mdi-door-sliding-open::before{content:"\F1820"}.mdi-doorbell::before{content:"\F12E6"}.mdi-doorbell-video::before{content:"\F0869"}.mdi-dot-net::before{content:"\F0AAE"}.mdi-dots-circle::before{content:"\F1978"}.mdi-dots-grid::before{content:"\F15FC"}.mdi-dots-hexagon::before{content:"\F15FF"}.mdi-dots-horizontal::before{content:"\F01D8"}.mdi-dots-horizontal-circle::before{content:"\F07C3"}.mdi-dots-horizontal-circle-outline::before{content:"\F0B8D"}.mdi-dots-square::before{content:"\F15FD"}.mdi-dots-triangle::before{content:"\F15FE"}.mdi-dots-vertical::before{content:"\F01D9"}.mdi-dots-vertical-circle::before{content:"\F07C4"}.mdi-dots-vertical-circle-outline::before{content:"\F0B8E"}.mdi-download::before{content:"\F01DA"}.mdi-download-box::before{content:"\F1462"}.mdi-download-box-outline::before{content:"\F1463"}.mdi-download-circle::before{content:"\F1464"}.mdi-download-circle-outline::before{content:"\F1465"}.mdi-download-lock::before{content:"\F1320"}.mdi-download-lock-outline::before{content:"\F1321"}.mdi-download-multiple::before{content:"\F09E9"}.mdi-download-multiple-outline::before{content:"\F1CD0"}.mdi-download-network::before{content:"\F06F4"}.mdi-download-network-outline::before{content:"\F0C66"}.mdi-download-off::before{content:"\F10B0"}.mdi-download-off-outline::before{content:"\F10B1"}.mdi-download-outline::before{content:"\F0B8F"}.mdi-drag::before{content:"\F01DB"}.mdi-drag-horizontal::before{content:"\F01DC"}.mdi-drag-horizontal-variant::before{content:"\F12F0"}.mdi-drag-variant::before{content:"\F0B90"}.mdi-drag-vertical::before{content:"\F01DD"}.mdi-drag-vertical-variant::before{content:"\F12F1"}.mdi-drama-masks::before{content:"\F0D02"}.mdi-draw::before{content:"\F0F49"}.mdi-draw-pen::before{content:"\F19B9"}.mdi-drawing::before{content:"\F01DE"}.mdi-drawing-box::before{content:"\F01DF"}.mdi-dresser::before{content:"\F0F4A"}.mdi-dresser-outline::before{content:"\F0F4B"}.mdi-drone::before{content:"\F01E2"}.mdi-dropbox::before{content:"\F01E3"}.mdi-drupal::before{content:"\F01E4"}.mdi-duck::before{content:"\F01E5"}.mdi-dumbbell::before{content:"\F01E6"}.mdi-dump-truck::before{content:"\F0C67"}.mdi-ear-hearing::before{content:"\F07C5"}.mdi-ear-hearing-loop::before{content:"\F1AEE"}.mdi-ear-hearing-off::before{content:"\F0A45"}.mdi-earbuds::before{content:"\F184F"}.mdi-earbuds-off::before{content:"\F1850"}.mdi-earbuds-off-outline::before{content:"\F1851"}.mdi-earbuds-outline::before{content:"\F1852"}.mdi-earth::before{content:"\F01E7"}.mdi-earth-arrow-down::before{content:"\F1C87"}.mdi-earth-arrow-left::before{content:"\F1C88"}.mdi-earth-arrow-right::before{content:"\F1311"}.mdi-earth-arrow-up::before{content:"\F1C89"}.mdi-earth-box::before{content:"\F06CD"}.mdi-earth-box-minus::before{content:"\F1407"}.mdi-earth-box-off::before{content:"\F06CE"}.mdi-earth-box-plus::before{content:"\F1406"}.mdi-earth-box-remove::before{content:"\F1408"}.mdi-earth-minus::before{content:"\F1404"}.mdi-earth-off::before{content:"\F01E8"}.mdi-earth-plus::before{content:"\F1403"}.mdi-earth-remove::before{content:"\F1405"}.mdi-egg::before{content:"\F0AAF"}.mdi-egg-easter::before{content:"\F0AB0"}.mdi-egg-fried::before{content:"\F184A"}.mdi-egg-off::before{content:"\F13F0"}.mdi-egg-off-outline::before{content:"\F13F1"}.mdi-egg-outline::before{content:"\F13F2"}.mdi-eiffel-tower::before{content:"\F156B"}.mdi-eight-track::before{content:"\F09EA"}.mdi-eject::before{content:"\F01EA"}.mdi-eject-circle::before{content:"\F1B23"}.mdi-eject-circle-outline::before{content:"\F1B24"}.mdi-eject-outline::before{content:"\F0B91"}.mdi-electric-switch::before{content:"\F0E9F"}.mdi-electric-switch-closed::before{content:"\F10D9"}.mdi-electron-framework::before{content:"\F1024"}.mdi-elephant::before{content:"\F07C6"}.mdi-elevation-decline::before{content:"\F01EB"}.mdi-elevation-rise::before{content:"\F01EC"}.mdi-elevator::before{content:"\F01ED"}.mdi-elevator-down::before{content:"\F12C2"}.mdi-elevator-passenger::before{content:"\F1381"}.mdi-elevator-passenger-off::before{content:"\F1979"}.mdi-elevator-passenger-off-outline::before{content:"\F197A"}.mdi-elevator-passenger-outline::before{content:"\F197B"}.mdi-elevator-up::before{content:"\F12C1"}.mdi-ellipse::before{content:"\F0EA0"}.mdi-ellipse-outline::before{content:"\F0EA1"}.mdi-email::before{content:"\F01EE"}.mdi-email-alert::before{content:"\F06CF"}.mdi-email-alert-outline::before{content:"\F0D42"}.mdi-email-arrow-left::before{content:"\F10DA"}.mdi-email-arrow-left-outline::before{content:"\F10DB"}.mdi-email-arrow-right::before{content:"\F10DC"}.mdi-email-arrow-right-outline::before{content:"\F10DD"}.mdi-email-box::before{content:"\F0D03"}.mdi-email-check::before{content:"\F0AB1"}.mdi-email-check-outline::before{content:"\F0AB2"}.mdi-email-edit::before{content:"\F0EE3"}.mdi-email-edit-outline::before{content:"\F0EE4"}.mdi-email-fast::before{content:"\F186F"}.mdi-email-fast-outline::before{content:"\F1870"}.mdi-email-heart-outline::before{content:"\F1C5B"}.mdi-email-lock::before{content:"\F01F1"}.mdi-email-lock-outline::before{content:"\F1B61"}.mdi-email-mark-as-unread::before{content:"\F0B92"}.mdi-email-minus::before{content:"\F0EE5"}.mdi-email-minus-outline::before{content:"\F0EE6"}.mdi-email-multiple::before{content:"\F0EE7"}.mdi-email-multiple-outline::before{content:"\F0EE8"}.mdi-email-newsletter::before{content:"\F0FB1"}.mdi-email-off::before{content:"\F13E3"}.mdi-email-off-outline::before{content:"\F13E4"}.mdi-email-open::before{content:"\F01EF"}.mdi-email-open-heart-outline::before{content:"\F1C5C"}.mdi-email-open-multiple::before{content:"\F0EE9"}.mdi-email-open-multiple-outline::before{content:"\F0EEA"}.mdi-email-open-outline::before{content:"\F05EF"}.mdi-email-outline::before{content:"\F01F0"}.mdi-email-plus::before{content:"\F09EB"}.mdi-email-plus-outline::before{content:"\F09EC"}.mdi-email-remove::before{content:"\F1661"}.mdi-email-remove-outline::before{content:"\F1662"}.mdi-email-seal::before{content:"\F195B"}.mdi-email-seal-outline::before{content:"\F195C"}.mdi-email-search::before{content:"\F0961"}.mdi-email-search-outline::before{content:"\F0962"}.mdi-email-sync::before{content:"\F12C7"}.mdi-email-sync-outline::before{content:"\F12C8"}.mdi-email-variant::before{content:"\F05F0"}.mdi-ember::before{content:"\F0B30"}.mdi-emby::before{content:"\F06B4"}.mdi-emoticon::before{content:"\F0C68"}.mdi-emoticon-angry::before{content:"\F0C69"}.mdi-emoticon-angry-outline::before{content:"\F0C6A"}.mdi-emoticon-confused::before{content:"\F10DE"}.mdi-emoticon-confused-outline::before{content:"\F10DF"}.mdi-emoticon-cool::before{content:"\F0C6B"}.mdi-emoticon-cool-outline::before{content:"\F01F3"}.mdi-emoticon-cry::before{content:"\F0C6C"}.mdi-emoticon-cry-outline::before{content:"\F0C6D"}.mdi-emoticon-dead::before{content:"\F0C6E"}.mdi-emoticon-dead-outline::before{content:"\F069B"}.mdi-emoticon-devil::before{content:"\F0C6F"}.mdi-emoticon-devil-outline::before{content:"\F01F4"}.mdi-emoticon-excited::before{content:"\F0C70"}.mdi-emoticon-excited-outline::before{content:"\F069C"}.mdi-emoticon-frown::before{content:"\F0F4C"}.mdi-emoticon-frown-outline::before{content:"\F0F4D"}.mdi-emoticon-happy::before{content:"\F0C71"}.mdi-emoticon-happy-outline::before{content:"\F01F5"}.mdi-emoticon-kiss::before{content:"\F0C72"}.mdi-emoticon-kiss-outline::before{content:"\F0C73"}.mdi-emoticon-lol::before{content:"\F1214"}.mdi-emoticon-lol-outline::before{content:"\F1215"}.mdi-emoticon-minus::before{content:"\F1CB2"}.mdi-emoticon-minus-outline::before{content:"\F1CB3"}.mdi-emoticon-neutral::before{content:"\F0C74"}.mdi-emoticon-neutral-outline::before{content:"\F01F6"}.mdi-emoticon-outline::before{content:"\F01F2"}.mdi-emoticon-plus::before{content:"\F1CB4"}.mdi-emoticon-plus-outline::before{content:"\F1CB5"}.mdi-emoticon-poop::before{content:"\F01F7"}.mdi-emoticon-poop-outline::before{content:"\F0C75"}.mdi-emoticon-remove::before{content:"\F1CB6"}.mdi-emoticon-remove-outline::before{content:"\F1CB7"}.mdi-emoticon-sad::before{content:"\F0C76"}.mdi-emoticon-sad-outline::before{content:"\F01F8"}.mdi-emoticon-sick::before{content:"\F157C"}.mdi-emoticon-sick-outline::before{content:"\F157D"}.mdi-emoticon-tongue::before{content:"\F01F9"}.mdi-emoticon-tongue-outline::before{content:"\F0C77"}.mdi-emoticon-wink::before{content:"\F0C78"}.mdi-emoticon-wink-outline::before{content:"\F0C79"}.mdi-engine::before{content:"\F01FA"}.mdi-engine-off::before{content:"\F0A46"}.mdi-engine-off-outline::before{content:"\F0A47"}.mdi-engine-outline::before{content:"\F01FB"}.mdi-epsilon::before{content:"\F10E0"}.mdi-equal::before{content:"\F01FC"}.mdi-equal-box::before{content:"\F01FD"}.mdi-equalizer::before{content:"\F0EA2"}.mdi-equalizer-outline::before{content:"\F0EA3"}.mdi-eraser::before{content:"\F01FE"}.mdi-eraser-variant::before{content:"\F0642"}.mdi-escalator::before{content:"\F01FF"}.mdi-escalator-box::before{content:"\F1399"}.mdi-escalator-down::before{content:"\F12C0"}.mdi-escalator-up::before{content:"\F12BF"}.mdi-eslint::before{content:"\F0C7A"}.mdi-et::before{content:"\F0AB3"}.mdi-ethereum::before{content:"\F086A"}.mdi-ethernet::before{content:"\F0200"}.mdi-ethernet-cable::before{content:"\F0201"}.mdi-ethernet-cable-off::before{content:"\F0202"}.mdi-ethernet-off::before{content:"\F1CD1"}.mdi-ev-plug-ccs1::before{content:"\F1519"}.mdi-ev-plug-ccs2::before{content:"\F151A"}.mdi-ev-plug-chademo::before{content:"\F151B"}.mdi-ev-plug-tesla::before{content:"\F151C"}.mdi-ev-plug-type1::before{content:"\F151D"}.mdi-ev-plug-type2::before{content:"\F151E"}.mdi-ev-station::before{content:"\F05F1"}.mdi-evernote::before{content:"\F0204"}.mdi-excavator::before{content:"\F1025"}.mdi-exclamation::before{content:"\F0205"}.mdi-exclamation-thick::before{content:"\F1238"}.mdi-exit-run::before{content:"\F0A48"}.mdi-exit-to-app::before{content:"\F0206"}.mdi-expand-all::before{content:"\F0AB4"}.mdi-expand-all-outline::before{content:"\F0AB5"}.mdi-expansion-card::before{content:"\F08AE"}.mdi-expansion-card-variant::before{content:"\F0FB2"}.mdi-exponent::before{content:"\F0963"}.mdi-exponent-box::before{content:"\F0964"}.mdi-export::before{content:"\F0207"}.mdi-export-variant::before{content:"\F0B93"}.mdi-eye::before{content:"\F0208"}.mdi-eye-arrow-left::before{content:"\F18FD"}.mdi-eye-arrow-left-outline::before{content:"\F18FE"}.mdi-eye-arrow-right::before{content:"\F18FF"}.mdi-eye-arrow-right-outline::before{content:"\F1900"}.mdi-eye-check::before{content:"\F0D04"}.mdi-eye-check-outline::before{content:"\F0D05"}.mdi-eye-circle::before{content:"\F0B94"}.mdi-eye-circle-outline::before{content:"\F0B95"}.mdi-eye-closed::before{content:"\F1CA3"}.mdi-eye-lock::before{content:"\F1C06"}.mdi-eye-lock-open::before{content:"\F1C07"}.mdi-eye-lock-open-outline::before{content:"\F1C08"}.mdi-eye-lock-outline::before{content:"\F1C09"}.mdi-eye-minus::before{content:"\F1026"}.mdi-eye-minus-outline::before{content:"\F1027"}.mdi-eye-off::before{content:"\F0209"}.mdi-eye-off-outline::before{content:"\F06D1"}.mdi-eye-outline::before{content:"\F06D0"}.mdi-eye-plus::before{content:"\F086B"}.mdi-eye-plus-outline::before{content:"\F086C"}.mdi-eye-refresh::before{content:"\F197C"}.mdi-eye-refresh-outline::before{content:"\F197D"}.mdi-eye-remove::before{content:"\F15E3"}.mdi-eye-remove-outline::before{content:"\F15E4"}.mdi-eye-settings::before{content:"\F086D"}.mdi-eye-settings-outline::before{content:"\F086E"}.mdi-eyedropper::before{content:"\F020A"}.mdi-eyedropper-minus::before{content:"\F13DD"}.mdi-eyedropper-off::before{content:"\F13DF"}.mdi-eyedropper-plus::before{content:"\F13DC"}.mdi-eyedropper-remove::before{content:"\F13DE"}.mdi-eyedropper-variant::before{content:"\F020B"}.mdi-face-agent::before{content:"\F0D70"}.mdi-face-man::before{content:"\F0643"}.mdi-face-man-outline::before{content:"\F0B96"}.mdi-face-man-profile::before{content:"\F0644"}.mdi-face-man-shimmer::before{content:"\F15CC"}.mdi-face-man-shimmer-outline::before{content:"\F15CD"}.mdi-face-mask::before{content:"\F1586"}.mdi-face-mask-outline::before{content:"\F1587"}.mdi-face-recognition::before{content:"\F0C7B"}.mdi-face-woman::before{content:"\F1077"}.mdi-face-woman-outline::before{content:"\F1078"}.mdi-face-woman-profile::before{content:"\F1076"}.mdi-face-woman-shimmer::before{content:"\F15CE"}.mdi-face-woman-shimmer-outline::before{content:"\F15CF"}.mdi-facebook::before{content:"\F020C"}.mdi-facebook-gaming::before{content:"\F07DD"}.mdi-facebook-messenger::before{content:"\F020E"}.mdi-facebook-workplace::before{content:"\F0B31"}.mdi-factory::before{content:"\F020F"}.mdi-family-tree::before{content:"\F160E"}.mdi-fan::before{content:"\F0210"}.mdi-fan-alert::before{content:"\F146C"}.mdi-fan-auto::before{content:"\F171D"}.mdi-fan-chevron-down::before{content:"\F146D"}.mdi-fan-chevron-up::before{content:"\F146E"}.mdi-fan-clock::before{content:"\F1A3A"}.mdi-fan-minus::before{content:"\F1470"}.mdi-fan-off::before{content:"\F081D"}.mdi-fan-plus::before{content:"\F146F"}.mdi-fan-remove::before{content:"\F1471"}.mdi-fan-speed-1::before{content:"\F1472"}.mdi-fan-speed-2::before{content:"\F1473"}.mdi-fan-speed-3::before{content:"\F1474"}.mdi-fast-forward::before{content:"\F0211"}.mdi-fast-forward-10::before{content:"\F0D71"}.mdi-fast-forward-15::before{content:"\F193A"}.mdi-fast-forward-30::before{content:"\F0D06"}.mdi-fast-forward-45::before{content:"\F1B12"}.mdi-fast-forward-5::before{content:"\F11F8"}.mdi-fast-forward-60::before{content:"\F160B"}.mdi-fast-forward-outline::before{content:"\F06D2"}.mdi-faucet::before{content:"\F1B29"}.mdi-faucet-variant::before{content:"\F1B2A"}.mdi-fax::before{content:"\F0212"}.mdi-feather::before{content:"\F06D3"}.mdi-feature-search::before{content:"\F0A49"}.mdi-feature-search-outline::before{content:"\F0A4A"}.mdi-fedora::before{content:"\F08DB"}.mdi-fence::before{content:"\F179A"}.mdi-fence-electric::before{content:"\F17F6"}.mdi-fencing::before{content:"\F14C1"}.mdi-ferris-wheel::before{content:"\F0EA4"}.mdi-ferry::before{content:"\F0213"}.mdi-file::before{content:"\F0214"}.mdi-file-account::before{content:"\F073B"}.mdi-file-account-outline::before{content:"\F1028"}.mdi-file-alert::before{content:"\F0A4B"}.mdi-file-alert-outline::before{content:"\F0A4C"}.mdi-file-arrow-left-right::before{content:"\F1A93"}.mdi-file-arrow-left-right-outline::before{content:"\F1A94"}.mdi-file-arrow-up-down::before{content:"\F1A95"}.mdi-file-arrow-up-down-outline::before{content:"\F1A96"}.mdi-file-cabinet::before{content:"\F0AB6"}.mdi-file-cad::before{content:"\F0EEB"}.mdi-file-cad-box::before{content:"\F0EEC"}.mdi-file-cancel::before{content:"\F0DC6"}.mdi-file-cancel-outline::before{content:"\F0DC7"}.mdi-file-certificate::before{content:"\F1186"}.mdi-file-certificate-outline::before{content:"\F1187"}.mdi-file-chart::before{content:"\F0215"}.mdi-file-chart-check::before{content:"\F19C6"}.mdi-file-chart-check-outline::before{content:"\F19C7"}.mdi-file-chart-outline::before{content:"\F1029"}.mdi-file-check::before{content:"\F0216"}.mdi-file-check-outline::before{content:"\F0E29"}.mdi-file-clock::before{content:"\F12E1"}.mdi-file-clock-outline::before{content:"\F12E2"}.mdi-file-cloud::before{content:"\F0217"}.mdi-file-cloud-outline::before{content:"\F102A"}.mdi-file-code::before{content:"\F022E"}.mdi-file-code-outline::before{content:"\F102B"}.mdi-file-cog::before{content:"\F107B"}.mdi-file-cog-outline::before{content:"\F107C"}.mdi-file-compare::before{content:"\F08AA"}.mdi-file-delimited::before{content:"\F0218"}.mdi-file-delimited-outline::before{content:"\F0EA5"}.mdi-file-document::before{content:"\F0219"}.mdi-file-document-alert::before{content:"\F1A97"}.mdi-file-document-alert-outline::before{content:"\F1A98"}.mdi-file-document-arrow-right::before{content:"\F1C0F"}.mdi-file-document-arrow-right-outline::before{content:"\F1C10"}.mdi-file-document-check::before{content:"\F1A99"}.mdi-file-document-check-outline::before{content:"\F1A9A"}.mdi-file-document-edit::before{content:"\F0DC8"}.mdi-file-document-edit-outline::before{content:"\F0DC9"}.mdi-file-document-minus::before{content:"\F1A9B"}.mdi-file-document-minus-outline::before{content:"\F1A9C"}.mdi-file-document-multiple::before{content:"\F1517"}.mdi-file-document-multiple-outline::before{content:"\F1518"}.mdi-file-document-outline::before{content:"\F09EE"}.mdi-file-document-plus::before{content:"\F1A9D"}.mdi-file-document-plus-outline::before{content:"\F1A9E"}.mdi-file-document-refresh::before{content:"\F1C7A"}.mdi-file-document-refresh-outline::before{content:"\F1C7B"}.mdi-file-document-remove::before{content:"\F1A9F"}.mdi-file-document-remove-outline::before{content:"\F1AA0"}.mdi-file-download::before{content:"\F0965"}.mdi-file-download-outline::before{content:"\F0966"}.mdi-file-edit::before{content:"\F11E7"}.mdi-file-edit-outline::before{content:"\F11E8"}.mdi-file-excel::before{content:"\F021B"}.mdi-file-excel-box::before{content:"\F021C"}.mdi-file-excel-box-outline::before{content:"\F102C"}.mdi-file-excel-outline::before{content:"\F102D"}.mdi-file-export::before{content:"\F021D"}.mdi-file-export-outline::before{content:"\F102E"}.mdi-file-eye::before{content:"\F0DCA"}.mdi-file-eye-outline::before{content:"\F0DCB"}.mdi-file-find::before{content:"\F021E"}.mdi-file-find-outline::before{content:"\F0B97"}.mdi-file-gif-box::before{content:"\F0D78"}.mdi-file-hidden::before{content:"\F0613"}.mdi-file-image::before{content:"\F021F"}.mdi-file-image-marker::before{content:"\F1772"}.mdi-file-image-marker-outline::before{content:"\F1773"}.mdi-file-image-minus::before{content:"\F193B"}.mdi-file-image-minus-outline::before{content:"\F193C"}.mdi-file-image-outline::before{content:"\F0EB0"}.mdi-file-image-plus::before{content:"\F193D"}.mdi-file-image-plus-outline::before{content:"\F193E"}.mdi-file-image-remove::before{content:"\F193F"}.mdi-file-image-remove-outline::before{content:"\F1940"}.mdi-file-import::before{content:"\F0220"}.mdi-file-import-outline::before{content:"\F102F"}.mdi-file-jpg-box::before{content:"\F0225"}.mdi-file-key::before{content:"\F1184"}.mdi-file-key-outline::before{content:"\F1185"}.mdi-file-link::before{content:"\F1177"}.mdi-file-link-outline::before{content:"\F1178"}.mdi-file-lock::before{content:"\F0221"}.mdi-file-lock-open::before{content:"\F19C8"}.mdi-file-lock-open-outline::before{content:"\F19C9"}.mdi-file-lock-outline::before{content:"\F1030"}.mdi-file-marker::before{content:"\F1774"}.mdi-file-marker-outline::before{content:"\F1775"}.mdi-file-minus::before{content:"\F1AA1"}.mdi-file-minus-outline::before{content:"\F1AA2"}.mdi-file-move::before{content:"\F0AB9"}.mdi-file-move-outline::before{content:"\F1031"}.mdi-file-multiple::before{content:"\F0222"}.mdi-file-multiple-outline::before{content:"\F1032"}.mdi-file-music::before{content:"\F0223"}.mdi-file-music-outline::before{content:"\F0E2A"}.mdi-file-outline::before{content:"\F0224"}.mdi-file-pdf-box::before{content:"\F0226"}.mdi-file-percent::before{content:"\F081E"}.mdi-file-percent-outline::before{content:"\F1033"}.mdi-file-phone::before{content:"\F1179"}.mdi-file-phone-outline::before{content:"\F117A"}.mdi-file-plus::before{content:"\F0752"}.mdi-file-plus-outline::before{content:"\F0EED"}.mdi-file-png-box::before{content:"\F0E2D"}.mdi-file-powerpoint::before{content:"\F0227"}.mdi-file-powerpoint-box::before{content:"\F0228"}.mdi-file-powerpoint-box-outline::before{content:"\F1034"}.mdi-file-powerpoint-outline::before{content:"\F1035"}.mdi-file-presentation-box::before{content:"\F0229"}.mdi-file-question::before{content:"\F086F"}.mdi-file-question-outline::before{content:"\F1036"}.mdi-file-refresh::before{content:"\F0918"}.mdi-file-refresh-outline::before{content:"\F0541"}.mdi-file-remove::before{content:"\F0B98"}.mdi-file-remove-outline::before{content:"\F1037"}.mdi-file-replace::before{content:"\F0B32"}.mdi-file-replace-outline::before{content:"\F0B33"}.mdi-file-restore::before{content:"\F0670"}.mdi-file-restore-outline::before{content:"\F1038"}.mdi-file-rotate-left::before{content:"\F1A3B"}.mdi-file-rotate-left-outline::before{content:"\F1A3C"}.mdi-file-rotate-right::before{content:"\F1A3D"}.mdi-file-rotate-right-outline::before{content:"\F1A3E"}.mdi-file-search::before{content:"\F0C7C"}.mdi-file-search-outline::before{content:"\F0C7D"}.mdi-file-send::before{content:"\F022A"}.mdi-file-send-outline::before{content:"\F1039"}.mdi-file-settings::before{content:"\F1079"}.mdi-file-settings-outline::before{content:"\F107A"}.mdi-file-sign::before{content:"\F19C3"}.mdi-file-star::before{content:"\F103A"}.mdi-file-star-four-points::before{content:"\F1C2D"}.mdi-file-star-four-points-outline::before{content:"\F1C2E"}.mdi-file-star-outline::before{content:"\F103B"}.mdi-file-swap::before{content:"\F0FB4"}.mdi-file-swap-outline::before{content:"\F0FB5"}.mdi-file-sync::before{content:"\F1216"}.mdi-file-sync-outline::before{content:"\F1217"}.mdi-file-table::before{content:"\F0C7E"}.mdi-file-table-box::before{content:"\F10E1"}.mdi-file-table-box-multiple::before{content:"\F10E2"}.mdi-file-table-box-multiple-outline::before{content:"\F10E3"}.mdi-file-table-box-outline::before{content:"\F10E4"}.mdi-file-table-outline::before{content:"\F0C7F"}.mdi-file-tree::before{content:"\F0645"}.mdi-file-tree-outline::before{content:"\F13D2"}.mdi-file-undo::before{content:"\F08DC"}.mdi-file-undo-outline::before{content:"\F103C"}.mdi-file-upload::before{content:"\F0A4D"}.mdi-file-upload-outline::before{content:"\F0A4E"}.mdi-file-video::before{content:"\F022B"}.mdi-file-video-outline::before{content:"\F0E2C"}.mdi-file-word::before{content:"\F022C"}.mdi-file-word-box::before{content:"\F022D"}.mdi-file-word-box-outline::before{content:"\F103D"}.mdi-file-word-outline::before{content:"\F103E"}.mdi-file-xml-box::before{content:"\F1B4B"}.mdi-film::before{content:"\F022F"}.mdi-filmstrip::before{content:"\F0230"}.mdi-filmstrip-box::before{content:"\F0332"}.mdi-filmstrip-box-multiple::before{content:"\F0D18"}.mdi-filmstrip-off::before{content:"\F0231"}.mdi-filter::before{content:"\F0232"}.mdi-filter-check::before{content:"\F18EC"}.mdi-filter-check-outline::before{content:"\F18ED"}.mdi-filter-cog::before{content:"\F1AA3"}.mdi-filter-cog-outline::before{content:"\F1AA4"}.mdi-filter-menu::before{content:"\F10E5"}.mdi-filter-menu-outline::before{content:"\F10E6"}.mdi-filter-minus::before{content:"\F0EEE"}.mdi-filter-minus-outline::before{content:"\F0EEF"}.mdi-filter-multiple::before{content:"\F1A3F"}.mdi-filter-multiple-outline::before{content:"\F1A40"}.mdi-filter-off::before{content:"\F14EF"}.mdi-filter-off-outline::before{content:"\F14F0"}.mdi-filter-outline::before{content:"\F0233"}.mdi-filter-plus::before{content:"\F0EF0"}.mdi-filter-plus-outline::before{content:"\F0EF1"}.mdi-filter-remove::before{content:"\F0234"}.mdi-filter-remove-outline::before{content:"\F0235"}.mdi-filter-settings::before{content:"\F1AA5"}.mdi-filter-settings-outline::before{content:"\F1AA6"}.mdi-filter-variant::before{content:"\F0236"}.mdi-filter-variant-minus::before{content:"\F1112"}.mdi-filter-variant-plus::before{content:"\F1113"}.mdi-filter-variant-remove::before{content:"\F103F"}.mdi-finance::before{content:"\F081F"}.mdi-find-replace::before{content:"\F06D4"}.mdi-fingerprint::before{content:"\F0237"}.mdi-fingerprint-off::before{content:"\F0EB1"}.mdi-fire::before{content:"\F0238"}.mdi-fire-alert::before{content:"\F15D7"}.mdi-fire-circle::before{content:"\F1807"}.mdi-fire-extinguisher::before{content:"\F0EF2"}.mdi-fire-hydrant::before{content:"\F1137"}.mdi-fire-hydrant-alert::before{content:"\F1138"}.mdi-fire-hydrant-off::before{content:"\F1139"}.mdi-fire-off::before{content:"\F1722"}.mdi-fire-station::before{content:"\F1CC3"}.mdi-fire-truck::before{content:"\F08AB"}.mdi-firebase::before{content:"\F0967"}.mdi-firefox::before{content:"\F0239"}.mdi-fireplace::before{content:"\F0E2E"}.mdi-fireplace-off::before{content:"\F0E2F"}.mdi-firewire::before{content:"\F05BE"}.mdi-firework::before{content:"\F0E30"}.mdi-firework-off::before{content:"\F1723"}.mdi-fish::before{content:"\F023A"}.mdi-fish-off::before{content:"\F13F3"}.mdi-fishbowl::before{content:"\F0EF3"}.mdi-fishbowl-outline::before{content:"\F0EF4"}.mdi-fit-to-page::before{content:"\F0EF5"}.mdi-fit-to-page-outline::before{content:"\F0EF6"}.mdi-fit-to-screen::before{content:"\F18F4"}.mdi-fit-to-screen-outline::before{content:"\F18F5"}.mdi-flag::before{content:"\F023B"}.mdi-flag-checkered::before{content:"\F023C"}.mdi-flag-minus::before{content:"\F0B99"}.mdi-flag-minus-outline::before{content:"\F10B2"}.mdi-flag-off::before{content:"\F18EE"}.mdi-flag-off-outline::before{content:"\F18EF"}.mdi-flag-outline::before{content:"\F023D"}.mdi-flag-plus::before{content:"\F0B9A"}.mdi-flag-plus-outline::before{content:"\F10B3"}.mdi-flag-remove::before{content:"\F0B9B"}.mdi-flag-remove-outline::before{content:"\F10B4"}.mdi-flag-triangle::before{content:"\F023F"}.mdi-flag-variant::before{content:"\F0240"}.mdi-flag-variant-minus::before{content:"\F1BB4"}.mdi-flag-variant-minus-outline::before{content:"\F1BB5"}.mdi-flag-variant-off::before{content:"\F1BB0"}.mdi-flag-variant-off-outline::before{content:"\F1BB1"}.mdi-flag-variant-outline::before{content:"\F023E"}.mdi-flag-variant-plus::before{content:"\F1BB2"}.mdi-flag-variant-plus-outline::before{content:"\F1BB3"}.mdi-flag-variant-remove::before{content:"\F1BB6"}.mdi-flag-variant-remove-outline::before{content:"\F1BB7"}.mdi-flare::before{content:"\F0D72"}.mdi-flash::before{content:"\F0241"}.mdi-flash-alert::before{content:"\F0EF7"}.mdi-flash-alert-outline::before{content:"\F0EF8"}.mdi-flash-auto::before{content:"\F0242"}.mdi-flash-off::before{content:"\F0243"}.mdi-flash-off-outline::before{content:"\F1B45"}.mdi-flash-outline::before{content:"\F06D5"}.mdi-flash-red-eye::before{content:"\F067B"}.mdi-flash-triangle::before{content:"\F1B1D"}.mdi-flash-triangle-outline::before{content:"\F1B1E"}.mdi-flashlight::before{content:"\F0244"}.mdi-flashlight-off::before{content:"\F0245"}.mdi-flask::before{content:"\F0093"}.mdi-flask-empty::before{content:"\F0094"}.mdi-flask-empty-minus::before{content:"\F123A"}.mdi-flask-empty-minus-outline::before{content:"\F123B"}.mdi-flask-empty-off::before{content:"\F13F4"}.mdi-flask-empty-off-outline::before{content:"\F13F5"}.mdi-flask-empty-outline::before{content:"\F0095"}.mdi-flask-empty-plus::before{content:"\F123C"}.mdi-flask-empty-plus-outline::before{content:"\F123D"}.mdi-flask-empty-remove::before{content:"\F123E"}.mdi-flask-empty-remove-outline::before{content:"\F123F"}.mdi-flask-minus::before{content:"\F1240"}.mdi-flask-minus-outline::before{content:"\F1241"}.mdi-flask-off::before{content:"\F13F6"}.mdi-flask-off-outline::before{content:"\F13F7"}.mdi-flask-outline::before{content:"\F0096"}.mdi-flask-plus::before{content:"\F1242"}.mdi-flask-plus-outline::before{content:"\F1243"}.mdi-flask-remove::before{content:"\F1244"}.mdi-flask-remove-outline::before{content:"\F1245"}.mdi-flask-round-bottom::before{content:"\F124B"}.mdi-flask-round-bottom-empty::before{content:"\F124C"}.mdi-flask-round-bottom-empty-outline::before{content:"\F124D"}.mdi-flask-round-bottom-outline::before{content:"\F124E"}.mdi-fleur-de-lis::before{content:"\F1303"}.mdi-flip-horizontal::before{content:"\F10E7"}.mdi-flip-to-back::before{content:"\F0247"}.mdi-flip-to-front::before{content:"\F0248"}.mdi-flip-vertical::before{content:"\F10E8"}.mdi-floor-lamp::before{content:"\F08DD"}.mdi-floor-lamp-dual::before{content:"\F1040"}.mdi-floor-lamp-dual-outline::before{content:"\F17CE"}.mdi-floor-lamp-outline::before{content:"\F17C8"}.mdi-floor-lamp-torchiere::before{content:"\F1747"}.mdi-floor-lamp-torchiere-outline::before{content:"\F17D6"}.mdi-floor-lamp-torchiere-variant::before{content:"\F1041"}.mdi-floor-lamp-torchiere-variant-outline::before{content:"\F17CF"}.mdi-floor-plan::before{content:"\F0821"}.mdi-floppy::before{content:"\F0249"}.mdi-floppy-variant::before{content:"\F09EF"}.mdi-flower::before{content:"\F024A"}.mdi-flower-outline::before{content:"\F09F0"}.mdi-flower-pollen::before{content:"\F1885"}.mdi-flower-pollen-outline::before{content:"\F1886"}.mdi-flower-poppy::before{content:"\F0D08"}.mdi-flower-tulip::before{content:"\F09F1"}.mdi-flower-tulip-outline::before{content:"\F09F2"}.mdi-focus-auto::before{content:"\F0F4E"}.mdi-focus-field::before{content:"\F0F4F"}.mdi-focus-field-horizontal::before{content:"\F0F50"}.mdi-focus-field-vertical::before{content:"\F0F51"}.mdi-folder::before{content:"\F024B"}.mdi-folder-account::before{content:"\F024C"}.mdi-folder-account-outline::before{content:"\F0B9C"}.mdi-folder-alert::before{content:"\F0DCC"}.mdi-folder-alert-outline::before{content:"\F0DCD"}.mdi-folder-arrow-down::before{content:"\F19E8"}.mdi-folder-arrow-down-outline::before{content:"\F19E9"}.mdi-folder-arrow-left::before{content:"\F19EA"}.mdi-folder-arrow-left-outline::before{content:"\F19EB"}.mdi-folder-arrow-left-right::before{content:"\F19EC"}.mdi-folder-arrow-left-right-outline::before{content:"\F19ED"}.mdi-folder-arrow-right::before{content:"\F19EE"}.mdi-folder-arrow-right-outline::before{content:"\F19EF"}.mdi-folder-arrow-up::before{content:"\F19F0"}.mdi-folder-arrow-up-down::before{content:"\F19F1"}.mdi-folder-arrow-up-down-outline::before{content:"\F19F2"}.mdi-folder-arrow-up-outline::before{content:"\F19F3"}.mdi-folder-cancel::before{content:"\F19F4"}.mdi-folder-cancel-outline::before{content:"\F19F5"}.mdi-folder-check::before{content:"\F197E"}.mdi-folder-check-outline::before{content:"\F197F"}.mdi-folder-clock::before{content:"\F0ABA"}.mdi-folder-clock-outline::before{content:"\F0ABB"}.mdi-folder-cog::before{content:"\F107F"}.mdi-folder-cog-outline::before{content:"\F1080"}.mdi-folder-download::before{content:"\F024D"}.mdi-folder-download-outline::before{content:"\F10E9"}.mdi-folder-edit::before{content:"\F08DE"}.mdi-folder-edit-outline::before{content:"\F0DCE"}.mdi-folder-eye::before{content:"\F178A"}.mdi-folder-eye-outline::before{content:"\F178B"}.mdi-folder-file::before{content:"\F19F6"}.mdi-folder-file-outline::before{content:"\F19F7"}.mdi-folder-google-drive::before{content:"\F024E"}.mdi-folder-heart::before{content:"\F10EA"}.mdi-folder-heart-outline::before{content:"\F10EB"}.mdi-folder-hidden::before{content:"\F179E"}.mdi-folder-home::before{content:"\F10B5"}.mdi-folder-home-outline::before{content:"\F10B6"}.mdi-folder-image::before{content:"\F024F"}.mdi-folder-information::before{content:"\F10B7"}.mdi-folder-information-outline::before{content:"\F10B8"}.mdi-folder-key::before{content:"\F08AC"}.mdi-folder-key-network::before{content:"\F08AD"}.mdi-folder-key-network-outline::before{content:"\F0C80"}.mdi-folder-key-outline::before{content:"\F10EC"}.mdi-folder-lock::before{content:"\F0250"}.mdi-folder-lock-open::before{content:"\F0251"}.mdi-folder-lock-open-outline::before{content:"\F1AA7"}.mdi-folder-lock-outline::before{content:"\F1AA8"}.mdi-folder-marker::before{content:"\F126D"}.mdi-folder-marker-outline::before{content:"\F126E"}.mdi-folder-minus::before{content:"\F1B49"}.mdi-folder-minus-outline::before{content:"\F1B4A"}.mdi-folder-move::before{content:"\F0252"}.mdi-folder-move-outline::before{content:"\F1246"}.mdi-folder-multiple::before{content:"\F0253"}.mdi-folder-multiple-image::before{content:"\F0254"}.mdi-folder-multiple-outline::before{content:"\F0255"}.mdi-folder-multiple-plus::before{content:"\F147E"}.mdi-folder-multiple-plus-outline::before{content:"\F147F"}.mdi-folder-music::before{content:"\F1359"}.mdi-folder-music-outline::before{content:"\F135A"}.mdi-folder-network::before{content:"\F0870"}.mdi-folder-network-outline::before{content:"\F0C81"}.mdi-folder-off::before{content:"\F19F8"}.mdi-folder-off-outline::before{content:"\F19F9"}.mdi-folder-open::before{content:"\F0770"}.mdi-folder-open-outline::before{content:"\F0DCF"}.mdi-folder-outline::before{content:"\F0256"}.mdi-folder-play::before{content:"\F19FA"}.mdi-folder-play-outline::before{content:"\F19FB"}.mdi-folder-plus::before{content:"\F0257"}.mdi-folder-plus-outline::before{content:"\F0B9D"}.mdi-folder-pound::before{content:"\F0D09"}.mdi-folder-pound-outline::before{content:"\F0D0A"}.mdi-folder-question::before{content:"\F19CA"}.mdi-folder-question-outline::before{content:"\F19CB"}.mdi-folder-refresh::before{content:"\F0749"}.mdi-folder-refresh-outline::before{content:"\F0542"}.mdi-folder-remove::before{content:"\F0258"}.mdi-folder-remove-outline::before{content:"\F0B9E"}.mdi-folder-search::before{content:"\F0968"}.mdi-folder-search-outline::before{content:"\F0969"}.mdi-folder-settings::before{content:"\F107D"}.mdi-folder-settings-outline::before{content:"\F107E"}.mdi-folder-star::before{content:"\F069D"}.mdi-folder-star-multiple::before{content:"\F13D3"}.mdi-folder-star-multiple-outline::before{content:"\F13D4"}.mdi-folder-star-outline::before{content:"\F0B9F"}.mdi-folder-swap::before{content:"\F0FB6"}.mdi-folder-swap-outline::before{content:"\F0FB7"}.mdi-folder-sync::before{content:"\F0D0B"}.mdi-folder-sync-outline::before{content:"\F0D0C"}.mdi-folder-table::before{content:"\F12E3"}.mdi-folder-table-outline::before{content:"\F12E4"}.mdi-folder-text::before{content:"\F0C82"}.mdi-folder-text-outline::before{content:"\F0C83"}.mdi-folder-upload::before{content:"\F0259"}.mdi-folder-upload-outline::before{content:"\F10ED"}.mdi-folder-wrench::before{content:"\F19FC"}.mdi-folder-wrench-outline::before{content:"\F19FD"}.mdi-folder-zip::before{content:"\F06EB"}.mdi-folder-zip-outline::before{content:"\F07B9"}.mdi-font-awesome::before{content:"\F003A"}.mdi-food::before{content:"\F025A"}.mdi-food-apple::before{content:"\F025B"}.mdi-food-apple-outline::before{content:"\F0C84"}.mdi-food-croissant::before{content:"\F07C8"}.mdi-food-drumstick::before{content:"\F141F"}.mdi-food-drumstick-off::before{content:"\F1468"}.mdi-food-drumstick-off-outline::before{content:"\F1469"}.mdi-food-drumstick-outline::before{content:"\F1420"}.mdi-food-fork-drink::before{content:"\F05F2"}.mdi-food-halal::before{content:"\F1572"}.mdi-food-hot-dog::before{content:"\F184B"}.mdi-food-kosher::before{content:"\F1573"}.mdi-food-off::before{content:"\F05F3"}.mdi-food-off-outline::before{content:"\F1915"}.mdi-food-outline::before{content:"\F1916"}.mdi-food-steak::before{content:"\F146A"}.mdi-food-steak-off::before{content:"\F146B"}.mdi-food-takeout-box::before{content:"\F1836"}.mdi-food-takeout-box-outline::before{content:"\F1837"}.mdi-food-turkey::before{content:"\F171C"}.mdi-food-variant::before{content:"\F025C"}.mdi-food-variant-off::before{content:"\F13E5"}.mdi-foot-print::before{content:"\F0F52"}.mdi-football::before{content:"\F025D"}.mdi-football-australian::before{content:"\F025E"}.mdi-football-helmet::before{content:"\F025F"}.mdi-forest::before{content:"\F1897"}.mdi-forest-outline::before{content:"\F1C63"}.mdi-forklift::before{content:"\F07C9"}.mdi-form-dropdown::before{content:"\F1400"}.mdi-form-select::before{content:"\F1401"}.mdi-form-textarea::before{content:"\F1095"}.mdi-form-textbox::before{content:"\F060E"}.mdi-form-textbox-lock::before{content:"\F135D"}.mdi-form-textbox-password::before{content:"\F07F5"}.mdi-format-align-bottom::before{content:"\F0753"}.mdi-format-align-center::before{content:"\F0260"}.mdi-format-align-justify::before{content:"\F0261"}.mdi-format-align-left::before{content:"\F0262"}.mdi-format-align-middle::before{content:"\F0754"}.mdi-format-align-right::before{content:"\F0263"}.mdi-format-align-top::before{content:"\F0755"}.mdi-format-annotation-minus::before{content:"\F0ABC"}.mdi-format-annotation-plus::before{content:"\F0646"}.mdi-format-bold::before{content:"\F0264"}.mdi-format-clear::before{content:"\F0265"}.mdi-format-color-fill::before{content:"\F0266"}.mdi-format-color-highlight::before{content:"\F0E31"}.mdi-format-color-marker-cancel::before{content:"\F1313"}.mdi-format-color-text::before{content:"\F069E"}.mdi-format-columns::before{content:"\F08DF"}.mdi-format-float-center::before{content:"\F0267"}.mdi-format-float-left::before{content:"\F0268"}.mdi-format-float-none::before{content:"\F0269"}.mdi-format-float-right::before{content:"\F026A"}.mdi-format-font::before{content:"\F06D6"}.mdi-format-font-size-decrease::before{content:"\F09F3"}.mdi-format-font-size-increase::before{content:"\F09F4"}.mdi-format-header-1::before{content:"\F026B"}.mdi-format-header-2::before{content:"\F026C"}.mdi-format-header-3::before{content:"\F026D"}.mdi-format-header-4::before{content:"\F026E"}.mdi-format-header-5::before{content:"\F026F"}.mdi-format-header-6::before{content:"\F0270"}.mdi-format-header-decrease::before{content:"\F0271"}.mdi-format-header-equal::before{content:"\F0272"}.mdi-format-header-increase::before{content:"\F0273"}.mdi-format-header-pound::before{content:"\F0274"}.mdi-format-horizontal-align-center::before{content:"\F061E"}.mdi-format-horizontal-align-left::before{content:"\F061F"}.mdi-format-horizontal-align-right::before{content:"\F0620"}.mdi-format-indent-decrease::before{content:"\F0275"}.mdi-format-indent-increase::before{content:"\F0276"}.mdi-format-italic::before{content:"\F0277"}.mdi-format-letter-case::before{content:"\F0B34"}.mdi-format-letter-case-lower::before{content:"\F0B35"}.mdi-format-letter-case-upper::before{content:"\F0B36"}.mdi-format-letter-ends-with::before{content:"\F0FB8"}.mdi-format-letter-matches::before{content:"\F0FB9"}.mdi-format-letter-spacing::before{content:"\F1956"}.mdi-format-letter-spacing-variant::before{content:"\F1AFB"}.mdi-format-letter-starts-with::before{content:"\F0FBA"}.mdi-format-line-height::before{content:"\F1AFC"}.mdi-format-line-spacing::before{content:"\F0278"}.mdi-format-line-style::before{content:"\F05C8"}.mdi-format-line-weight::before{content:"\F05C9"}.mdi-format-list-bulleted::before{content:"\F0279"}.mdi-format-list-bulleted-square::before{content:"\F0DD0"}.mdi-format-list-bulleted-triangle::before{content:"\F0EB2"}.mdi-format-list-bulleted-type::before{content:"\F027A"}.mdi-format-list-checkbox::before{content:"\F096A"}.mdi-format-list-checks::before{content:"\F0756"}.mdi-format-list-group::before{content:"\F1860"}.mdi-format-list-group-plus::before{content:"\F1B56"}.mdi-format-list-numbered::before{content:"\F027B"}.mdi-format-list-numbered-rtl::before{content:"\F0D0D"}.mdi-format-list-text::before{content:"\F126F"}.mdi-format-overline::before{content:"\F0EB3"}.mdi-format-page-break::before{content:"\F06D7"}.mdi-format-page-split::before{content:"\F1917"}.mdi-format-paint::before{content:"\F027C"}.mdi-format-paragraph::before{content:"\F027D"}.mdi-format-paragraph-spacing::before{content:"\F1AFD"}.mdi-format-pilcrow::before{content:"\F06D8"}.mdi-format-pilcrow-arrow-left::before{content:"\F0286"}.mdi-format-pilcrow-arrow-right::before{content:"\F0285"}.mdi-format-quote-close::before{content:"\F027E"}.mdi-format-quote-close-outline::before{content:"\F11A8"}.mdi-format-quote-open::before{content:"\F0757"}.mdi-format-quote-open-outline::before{content:"\F11A7"}.mdi-format-rotate-90::before{content:"\F06AA"}.mdi-format-section::before{content:"\F069F"}.mdi-format-size::before{content:"\F027F"}.mdi-format-strikethrough::before{content:"\F0280"}.mdi-format-strikethrough-variant::before{content:"\F0281"}.mdi-format-subscript::before{content:"\F0282"}.mdi-format-superscript::before{content:"\F0283"}.mdi-format-text::before{content:"\F0284"}.mdi-format-text-rotation-angle-down::before{content:"\F0FBB"}.mdi-format-text-rotation-angle-up::before{content:"\F0FBC"}.mdi-format-text-rotation-down::before{content:"\F0D73"}.mdi-format-text-rotation-down-vertical::before{content:"\F0FBD"}.mdi-format-text-rotation-none::before{content:"\F0D74"}.mdi-format-text-rotation-up::before{content:"\F0FBE"}.mdi-format-text-rotation-vertical::before{content:"\F0FBF"}.mdi-format-text-variant::before{content:"\F0E32"}.mdi-format-text-variant-outline::before{content:"\F150F"}.mdi-format-text-wrapping-clip::before{content:"\F0D0E"}.mdi-format-text-wrapping-overflow::before{content:"\F0D0F"}.mdi-format-text-wrapping-wrap::before{content:"\F0D10"}.mdi-format-textbox::before{content:"\F0D11"}.mdi-format-title::before{content:"\F05F4"}.mdi-format-underline::before{content:"\F0287"}.mdi-format-underline-wavy::before{content:"\F18E9"}.mdi-format-vertical-align-bottom::before{content:"\F0621"}.mdi-format-vertical-align-center::before{content:"\F0622"}.mdi-format-vertical-align-top::before{content:"\F0623"}.mdi-format-wrap-inline::before{content:"\F0288"}.mdi-format-wrap-square::before{content:"\F0289"}.mdi-format-wrap-tight::before{content:"\F028A"}.mdi-format-wrap-top-bottom::before{content:"\F028B"}.mdi-forum::before{content:"\F028C"}.mdi-forum-minus::before{content:"\F1AA9"}.mdi-forum-minus-outline::before{content:"\F1AAA"}.mdi-forum-outline::before{content:"\F0822"}.mdi-forum-plus::before{content:"\F1AAB"}.mdi-forum-plus-outline::before{content:"\F1AAC"}.mdi-forum-remove::before{content:"\F1AAD"}.mdi-forum-remove-outline::before{content:"\F1AAE"}.mdi-forward::before{content:"\F028D"}.mdi-forwardburger::before{content:"\F0D75"}.mdi-fountain::before{content:"\F096B"}.mdi-fountain-pen::before{content:"\F0D12"}.mdi-fountain-pen-tip::before{content:"\F0D13"}.mdi-fraction-one-half::before{content:"\F1992"}.mdi-freebsd::before{content:"\F08E0"}.mdi-french-fries::before{content:"\F1957"}.mdi-frequently-asked-questions::before{content:"\F0EB4"}.mdi-fridge::before{content:"\F0290"}.mdi-fridge-alert::before{content:"\F11B1"}.mdi-fridge-alert-outline::before{content:"\F11B2"}.mdi-fridge-bottom::before{content:"\F0292"}.mdi-fridge-industrial::before{content:"\F15EE"}.mdi-fridge-industrial-alert::before{content:"\F15EF"}.mdi-fridge-industrial-alert-outline::before{content:"\F15F0"}.mdi-fridge-industrial-off::before{content:"\F15F1"}.mdi-fridge-industrial-off-outline::before{content:"\F15F2"}.mdi-fridge-industrial-outline::before{content:"\F15F3"}.mdi-fridge-off::before{content:"\F11AF"}.mdi-fridge-off-outline::before{content:"\F11B0"}.mdi-fridge-outline::before{content:"\F028F"}.mdi-fridge-top::before{content:"\F0291"}.mdi-fridge-variant::before{content:"\F15F4"}.mdi-fridge-variant-alert::before{content:"\F15F5"}.mdi-fridge-variant-alert-outline::before{content:"\F15F6"}.mdi-fridge-variant-off::before{content:"\F15F7"}.mdi-fridge-variant-off-outline::before{content:"\F15F8"}.mdi-fridge-variant-outline::before{content:"\F15F9"}.mdi-fruit-cherries::before{content:"\F1042"}.mdi-fruit-cherries-off::before{content:"\F13F8"}.mdi-fruit-citrus::before{content:"\F1043"}.mdi-fruit-citrus-off::before{content:"\F13F9"}.mdi-fruit-grapes::before{content:"\F1044"}.mdi-fruit-grapes-outline::before{content:"\F1045"}.mdi-fruit-pear::before{content:"\F1A0E"}.mdi-fruit-pineapple::before{content:"\F1046"}.mdi-fruit-watermelon::before{content:"\F1047"}.mdi-fuel::before{content:"\F07CA"}.mdi-fuel-cell::before{content:"\F18B5"}.mdi-fullscreen::before{content:"\F0293"}.mdi-fullscreen-exit::before{content:"\F0294"}.mdi-function::before{content:"\F0295"}.mdi-function-variant::before{content:"\F0871"}.mdi-furigana-horizontal::before{content:"\F1081"}.mdi-furigana-vertical::before{content:"\F1082"}.mdi-fuse::before{content:"\F0C85"}.mdi-fuse-alert::before{content:"\F142D"}.mdi-fuse-blade::before{content:"\F0C86"}.mdi-fuse-off::before{content:"\F142C"}.mdi-gamepad::before{content:"\F0296"}.mdi-gamepad-circle::before{content:"\F0E33"}.mdi-gamepad-circle-down::before{content:"\F0E34"}.mdi-gamepad-circle-left::before{content:"\F0E35"}.mdi-gamepad-circle-outline::before{content:"\F0E36"}.mdi-gamepad-circle-right::before{content:"\F0E37"}.mdi-gamepad-circle-up::before{content:"\F0E38"}.mdi-gamepad-down::before{content:"\F0E39"}.mdi-gamepad-left::before{content:"\F0E3A"}.mdi-gamepad-outline::before{content:"\F1919"}.mdi-gamepad-right::before{content:"\F0E3B"}.mdi-gamepad-round::before{content:"\F0E3C"}.mdi-gamepad-round-down::before{content:"\F0E3D"}.mdi-gamepad-round-left::before{content:"\F0E3E"}.mdi-gamepad-round-outline::before{content:"\F0E3F"}.mdi-gamepad-round-right::before{content:"\F0E40"}.mdi-gamepad-round-up::before{content:"\F0E41"}.mdi-gamepad-square::before{content:"\F0EB5"}.mdi-gamepad-square-outline::before{content:"\F0EB6"}.mdi-gamepad-up::before{content:"\F0E42"}.mdi-gamepad-variant::before{content:"\F0297"}.mdi-gamepad-variant-outline::before{content:"\F0EB7"}.mdi-gamma::before{content:"\F10EE"}.mdi-gantry-crane::before{content:"\F0DD1"}.mdi-garage::before{content:"\F06D9"}.mdi-garage-alert::before{content:"\F0872"}.mdi-garage-alert-variant::before{content:"\F12D5"}.mdi-garage-lock::before{content:"\F17FB"}.mdi-garage-open::before{content:"\F06DA"}.mdi-garage-open-variant::before{content:"\F12D4"}.mdi-garage-variant::before{content:"\F12D3"}.mdi-garage-variant-lock::before{content:"\F17FC"}.mdi-gas-burner::before{content:"\F1A1B"}.mdi-gas-cylinder::before{content:"\F0647"}.mdi-gas-station::before{content:"\F0298"}.mdi-gas-station-in-use::before{content:"\F1CC4"}.mdi-gas-station-in-use-outline::before{content:"\F1CC5"}.mdi-gas-station-off::before{content:"\F1409"}.mdi-gas-station-off-outline::before{content:"\F140A"}.mdi-gas-station-outline::before{content:"\F0EB8"}.mdi-gate::before{content:"\F0299"}.mdi-gate-alert::before{content:"\F17F8"}.mdi-gate-and::before{content:"\F08E1"}.mdi-gate-arrow-left::before{content:"\F17F7"}.mdi-gate-arrow-right::before{content:"\F1169"}.mdi-gate-buffer::before{content:"\F1AFE"}.mdi-gate-nand::before{content:"\F08E2"}.mdi-gate-nor::before{content:"\F08E3"}.mdi-gate-not::before{content:"\F08E4"}.mdi-gate-open::before{content:"\F116A"}.mdi-gate-or::before{content:"\F08E5"}.mdi-gate-xnor::before{content:"\F08E6"}.mdi-gate-xor::before{content:"\F08E7"}.mdi-gatsby::before{content:"\F0E43"}.mdi-gauge::before{content:"\F029A"}.mdi-gauge-empty::before{content:"\F0873"}.mdi-gauge-full::before{content:"\F0874"}.mdi-gauge-low::before{content:"\F0875"}.mdi-gavel::before{content:"\F029B"}.mdi-gender-female::before{content:"\F029C"}.mdi-gender-male::before{content:"\F029D"}.mdi-gender-male-female::before{content:"\F029E"}.mdi-gender-male-female-variant::before{content:"\F113F"}.mdi-gender-non-binary::before{content:"\F1140"}.mdi-gender-transgender::before{content:"\F029F"}.mdi-generator-mobile::before{content:"\F1C8A"}.mdi-generator-portable::before{content:"\F1C8B"}.mdi-generator-stationary::before{content:"\F1C8C"}.mdi-gentoo::before{content:"\F08E8"}.mdi-gesture::before{content:"\F07CB"}.mdi-gesture-double-tap::before{content:"\F073C"}.mdi-gesture-pinch::before{content:"\F0ABD"}.mdi-gesture-spread::before{content:"\F0ABE"}.mdi-gesture-swipe::before{content:"\F0D76"}.mdi-gesture-swipe-down::before{content:"\F073D"}.mdi-gesture-swipe-horizontal::before{content:"\F0ABF"}.mdi-gesture-swipe-left::before{content:"\F073E"}.mdi-gesture-swipe-right::before{content:"\F073F"}.mdi-gesture-swipe-up::before{content:"\F0740"}.mdi-gesture-swipe-vertical::before{content:"\F0AC0"}.mdi-gesture-tap::before{content:"\F0741"}.mdi-gesture-tap-box::before{content:"\F12A9"}.mdi-gesture-tap-button::before{content:"\F12A8"}.mdi-gesture-tap-hold::before{content:"\F0D77"}.mdi-gesture-two-double-tap::before{content:"\F0742"}.mdi-gesture-two-tap::before{content:"\F0743"}.mdi-ghost::before{content:"\F02A0"}.mdi-ghost-off::before{content:"\F09F5"}.mdi-ghost-off-outline::before{content:"\F165C"}.mdi-ghost-outline::before{content:"\F165D"}.mdi-gift::before{content:"\F0E44"}.mdi-gift-off::before{content:"\F16EF"}.mdi-gift-off-outline::before{content:"\F16F0"}.mdi-gift-open::before{content:"\F16F1"}.mdi-gift-open-outline::before{content:"\F16F2"}.mdi-gift-outline::before{content:"\F02A1"}.mdi-git::before{content:"\F02A2"}.mdi-github::before{content:"\F02A4"}.mdi-gitlab::before{content:"\F0BA0"}.mdi-glass-cocktail::before{content:"\F0356"}.mdi-glass-cocktail-off::before{content:"\F15E6"}.mdi-glass-flute::before{content:"\F02A5"}.mdi-glass-fragile::before{content:"\F1873"}.mdi-glass-mug::before{content:"\F02A6"}.mdi-glass-mug-off::before{content:"\F15E7"}.mdi-glass-mug-variant::before{content:"\F1116"}.mdi-glass-mug-variant-off::before{content:"\F15E8"}.mdi-glass-pint-outline::before{content:"\F130D"}.mdi-glass-stange::before{content:"\F02A7"}.mdi-glass-tulip::before{content:"\F02A8"}.mdi-glass-wine::before{content:"\F0876"}.mdi-glasses::before{content:"\F02AA"}.mdi-globe-light::before{content:"\F066F"}.mdi-globe-light-outline::before{content:"\F12D7"}.mdi-globe-model::before{content:"\F08E9"}.mdi-gmail::before{content:"\F02AB"}.mdi-gnome::before{content:"\F02AC"}.mdi-go-kart::before{content:"\F0D79"}.mdi-go-kart-track::before{content:"\F0D7A"}.mdi-gog::before{content:"\F0BA1"}.mdi-gold::before{content:"\F124F"}.mdi-golf::before{content:"\F0823"}.mdi-golf-cart::before{content:"\F11A4"}.mdi-golf-tee::before{content:"\F1083"}.mdi-gondola::before{content:"\F0686"}.mdi-goodreads::before{content:"\F0D7B"}.mdi-google::before{content:"\F02AD"}.mdi-google-ads::before{content:"\F0C87"}.mdi-google-analytics::before{content:"\F07CC"}.mdi-google-assistant::before{content:"\F07CD"}.mdi-google-cardboard::before{content:"\F02AE"}.mdi-google-chrome::before{content:"\F02AF"}.mdi-google-circles::before{content:"\F02B0"}.mdi-google-circles-communities::before{content:"\F02B1"}.mdi-google-circles-extended::before{content:"\F02B2"}.mdi-google-circles-group::before{content:"\F02B3"}.mdi-google-classroom::before{content:"\F02C0"}.mdi-google-cloud::before{content:"\F11F6"}.mdi-google-downasaur::before{content:"\F1362"}.mdi-google-drive::before{content:"\F02B6"}.mdi-google-earth::before{content:"\F02B7"}.mdi-google-fit::before{content:"\F096C"}.mdi-google-glass::before{content:"\F02B8"}.mdi-google-hangouts::before{content:"\F02C9"}.mdi-google-keep::before{content:"\F06DC"}.mdi-google-lens::before{content:"\F09F6"}.mdi-google-maps::before{content:"\F05F5"}.mdi-google-my-business::before{content:"\F1048"}.mdi-google-nearby::before{content:"\F02B9"}.mdi-google-play::before{content:"\F02BC"}.mdi-google-plus::before{content:"\F02BD"}.mdi-google-podcast::before{content:"\F0EB9"}.mdi-google-spreadsheet::before{content:"\F09F7"}.mdi-google-street-view::before{content:"\F0C88"}.mdi-google-translate::before{content:"\F02BF"}.mdi-gradient-horizontal::before{content:"\F174A"}.mdi-gradient-vertical::before{content:"\F06A0"}.mdi-grain::before{content:"\F0D7C"}.mdi-graph::before{content:"\F1049"}.mdi-graph-outline::before{content:"\F104A"}.mdi-graphql::before{content:"\F0877"}.mdi-grass::before{content:"\F1510"}.mdi-grave-stone::before{content:"\F0BA2"}.mdi-grease-pencil::before{content:"\F0648"}.mdi-greater-than::before{content:"\F096D"}.mdi-greater-than-or-equal::before{content:"\F096E"}.mdi-greenhouse::before{content:"\F002D"}.mdi-grid::before{content:"\F02C1"}.mdi-grid-large::before{content:"\F0758"}.mdi-grid-off::before{content:"\F02C2"}.mdi-grill::before{content:"\F0E45"}.mdi-grill-outline::before{content:"\F118A"}.mdi-group::before{content:"\F02C3"}.mdi-guitar-acoustic::before{content:"\F0771"}.mdi-guitar-electric::before{content:"\F02C4"}.mdi-guitar-pick::before{content:"\F02C5"}.mdi-guitar-pick-outline::before{content:"\F02C6"}.mdi-guy-fawkes-mask::before{content:"\F0825"}.mdi-gymnastics::before{content:"\F1A41"}.mdi-hail::before{content:"\F0AC1"}.mdi-hair-dryer::before{content:"\F10EF"}.mdi-hair-dryer-outline::before{content:"\F10F0"}.mdi-halloween::before{content:"\F0BA3"}.mdi-hamburger::before{content:"\F0685"}.mdi-hamburger-check::before{content:"\F1776"}.mdi-hamburger-minus::before{content:"\F1777"}.mdi-hamburger-off::before{content:"\F1778"}.mdi-hamburger-plus::before{content:"\F1779"}.mdi-hamburger-remove::before{content:"\F177A"}.mdi-hammer::before{content:"\F08EA"}.mdi-hammer-screwdriver::before{content:"\F1322"}.mdi-hammer-sickle::before{content:"\F1887"}.mdi-hammer-wrench::before{content:"\F1323"}.mdi-hand-back-left::before{content:"\F0E46"}.mdi-hand-back-left-off::before{content:"\F1830"}.mdi-hand-back-left-off-outline::before{content:"\F1832"}.mdi-hand-back-left-outline::before{content:"\F182C"}.mdi-hand-back-right::before{content:"\F0E47"}.mdi-hand-back-right-off::before{content:"\F1831"}.mdi-hand-back-right-off-outline::before{content:"\F1833"}.mdi-hand-back-right-outline::before{content:"\F182D"}.mdi-hand-clap::before{content:"\F194B"}.mdi-hand-clap-off::before{content:"\F1A42"}.mdi-hand-coin::before{content:"\F188F"}.mdi-hand-coin-outline::before{content:"\F1890"}.mdi-hand-cycle::before{content:"\F1B9C"}.mdi-hand-extended::before{content:"\F18B6"}.mdi-hand-extended-outline::before{content:"\F18B7"}.mdi-hand-front-left::before{content:"\F182B"}.mdi-hand-front-left-outline::before{content:"\F182E"}.mdi-hand-front-right::before{content:"\F0A4F"}.mdi-hand-front-right-outline::before{content:"\F182F"}.mdi-hand-heart::before{content:"\F10F1"}.mdi-hand-heart-outline::before{content:"\F157E"}.mdi-hand-okay::before{content:"\F0A50"}.mdi-hand-peace::before{content:"\F0A51"}.mdi-hand-peace-variant::before{content:"\F0A52"}.mdi-hand-pointing-down::before{content:"\F0A53"}.mdi-hand-pointing-left::before{content:"\F0A54"}.mdi-hand-pointing-right::before{content:"\F02C7"}.mdi-hand-pointing-up::before{content:"\F0A55"}.mdi-hand-saw::before{content:"\F0E48"}.mdi-hand-wash::before{content:"\F157F"}.mdi-hand-wash-outline::before{content:"\F1580"}.mdi-hand-water::before{content:"\F139F"}.mdi-hand-wave::before{content:"\F1821"}.mdi-hand-wave-outline::before{content:"\F1822"}.mdi-handball::before{content:"\F0F53"}.mdi-handcuffs::before{content:"\F113E"}.mdi-hands-pray::before{content:"\F0579"}.mdi-handshake::before{content:"\F1218"}.mdi-handshake-outline::before{content:"\F15A1"}.mdi-hanger::before{content:"\F02C8"}.mdi-hard-hat::before{content:"\F096F"}.mdi-harddisk::before{content:"\F02CA"}.mdi-harddisk-plus::before{content:"\F104B"}.mdi-harddisk-remove::before{content:"\F104C"}.mdi-hat-fedora::before{content:"\F0BA4"}.mdi-hazard-lights::before{content:"\F0C89"}.mdi-hdmi-port::before{content:"\F1BB8"}.mdi-hdr::before{content:"\F0D7D"}.mdi-hdr-off::before{content:"\F0D7E"}.mdi-head::before{content:"\F135E"}.mdi-head-alert::before{content:"\F1338"}.mdi-head-alert-outline::before{content:"\F1339"}.mdi-head-check::before{content:"\F133A"}.mdi-head-check-outline::before{content:"\F133B"}.mdi-head-cog::before{content:"\F133C"}.mdi-head-cog-outline::before{content:"\F133D"}.mdi-head-dots-horizontal::before{content:"\F133E"}.mdi-head-dots-horizontal-outline::before{content:"\F133F"}.mdi-head-flash::before{content:"\F1340"}.mdi-head-flash-outline::before{content:"\F1341"}.mdi-head-heart::before{content:"\F1342"}.mdi-head-heart-outline::before{content:"\F1343"}.mdi-head-lightbulb::before{content:"\F1344"}.mdi-head-lightbulb-outline::before{content:"\F1345"}.mdi-head-minus::before{content:"\F1346"}.mdi-head-minus-outline::before{content:"\F1347"}.mdi-head-outline::before{content:"\F135F"}.mdi-head-plus::before{content:"\F1348"}.mdi-head-plus-outline::before{content:"\F1349"}.mdi-head-question::before{content:"\F134A"}.mdi-head-question-outline::before{content:"\F134B"}.mdi-head-remove::before{content:"\F134C"}.mdi-head-remove-outline::before{content:"\F134D"}.mdi-head-snowflake::before{content:"\F134E"}.mdi-head-snowflake-outline::before{content:"\F134F"}.mdi-head-sync::before{content:"\F1350"}.mdi-head-sync-outline::before{content:"\F1351"}.mdi-headphones::before{content:"\F02CB"}.mdi-headphones-bluetooth::before{content:"\F0970"}.mdi-headphones-box::before{content:"\F02CC"}.mdi-headphones-off::before{content:"\F07CE"}.mdi-headphones-settings::before{content:"\F02CD"}.mdi-headset::before{content:"\F02CE"}.mdi-headset-dock::before{content:"\F02CF"}.mdi-headset-off::before{content:"\F02D0"}.mdi-heart::before{content:"\F02D1"}.mdi-heart-box::before{content:"\F02D2"}.mdi-heart-box-outline::before{content:"\F02D3"}.mdi-heart-broken::before{content:"\F02D4"}.mdi-heart-broken-outline::before{content:"\F0D14"}.mdi-heart-circle::before{content:"\F0971"}.mdi-heart-circle-outline::before{content:"\F0972"}.mdi-heart-cog::before{content:"\F1663"}.mdi-heart-cog-outline::before{content:"\F1664"}.mdi-heart-flash::before{content:"\F0EF9"}.mdi-heart-half::before{content:"\F06DF"}.mdi-heart-half-full::before{content:"\F06DE"}.mdi-heart-half-outline::before{content:"\F06E0"}.mdi-heart-minus::before{content:"\F142F"}.mdi-heart-minus-outline::before{content:"\F1432"}.mdi-heart-multiple::before{content:"\F0A56"}.mdi-heart-multiple-outline::before{content:"\F0A57"}.mdi-heart-off::before{content:"\F0759"}.mdi-heart-off-outline::before{content:"\F1434"}.mdi-heart-outline::before{content:"\F02D5"}.mdi-heart-plus::before{content:"\F142E"}.mdi-heart-plus-outline::before{content:"\F1431"}.mdi-heart-pulse::before{content:"\F05F6"}.mdi-heart-remove::before{content:"\F1430"}.mdi-heart-remove-outline::before{content:"\F1433"}.mdi-heart-search::before{content:"\F1C8D"}.mdi-heart-settings::before{content:"\F1665"}.mdi-heart-settings-outline::before{content:"\F1666"}.mdi-heat-pump::before{content:"\F1A43"}.mdi-heat-pump-outline::before{content:"\F1A44"}.mdi-heat-wave::before{content:"\F1A45"}.mdi-heating-coil::before{content:"\F1AAF"}.mdi-helicopter::before{content:"\F0AC2"}.mdi-help::before{content:"\F02D6"}.mdi-help-box::before{content:"\F078B"}.mdi-help-box-multiple::before{content:"\F1C0A"}.mdi-help-box-multiple-outline::before{content:"\F1C0B"}.mdi-help-box-outline::before{content:"\F1C0C"}.mdi-help-circle::before{content:"\F02D7"}.mdi-help-circle-outline::before{content:"\F0625"}.mdi-help-network::before{content:"\F06F5"}.mdi-help-network-outline::before{content:"\F0C8A"}.mdi-help-rhombus::before{content:"\F0BA5"}.mdi-help-rhombus-outline::before{content:"\F0BA6"}.mdi-hexadecimal::before{content:"\F12A7"}.mdi-hexagon::before{content:"\F02D8"}.mdi-hexagon-multiple::before{content:"\F06E1"}.mdi-hexagon-multiple-outline::before{content:"\F10F2"}.mdi-hexagon-outline::before{content:"\F02D9"}.mdi-hexagon-slice-1::before{content:"\F0AC3"}.mdi-hexagon-slice-2::before{content:"\F0AC4"}.mdi-hexagon-slice-3::before{content:"\F0AC5"}.mdi-hexagon-slice-4::before{content:"\F0AC6"}.mdi-hexagon-slice-5::before{content:"\F0AC7"}.mdi-hexagon-slice-6::before{content:"\F0AC8"}.mdi-hexagram::before{content:"\F0AC9"}.mdi-hexagram-outline::before{content:"\F0ACA"}.mdi-high-definition::before{content:"\F07CF"}.mdi-high-definition-box::before{content:"\F0878"}.mdi-highway::before{content:"\F05F7"}.mdi-hiking::before{content:"\F0D7F"}.mdi-history::before{content:"\F02DA"}.mdi-hockey-puck::before{content:"\F0879"}.mdi-hockey-sticks::before{content:"\F087A"}.mdi-hololens::before{content:"\F02DB"}.mdi-home::before{content:"\F02DC"}.mdi-home-account::before{content:"\F0826"}.mdi-home-alert::before{content:"\F087B"}.mdi-home-alert-outline::before{content:"\F15D0"}.mdi-home-analytics::before{content:"\F0EBA"}.mdi-home-assistant::before{content:"\F07D0"}.mdi-home-automation::before{content:"\F07D1"}.mdi-home-battery::before{content:"\F1901"}.mdi-home-battery-outline::before{content:"\F1902"}.mdi-home-circle::before{content:"\F07D2"}.mdi-home-circle-outline::before{content:"\F104D"}.mdi-home-city::before{content:"\F0D15"}.mdi-home-city-outline::before{content:"\F0D16"}.mdi-home-clock::before{content:"\F1A12"}.mdi-home-clock-outline::before{content:"\F1A13"}.mdi-home-edit::before{content:"\F1159"}.mdi-home-edit-outline::before{content:"\F115A"}.mdi-home-export-outline::before{content:"\F0F9B"}.mdi-home-flood::before{content:"\F0EFA"}.mdi-home-floor-0::before{content:"\F0DD2"}.mdi-home-floor-1::before{content:"\F0D80"}.mdi-home-floor-2::before{content:"\F0D81"}.mdi-home-floor-3::before{content:"\F0D82"}.mdi-home-floor-a::before{content:"\F0D83"}.mdi-home-floor-b::before{content:"\F0D84"}.mdi-home-floor-g::before{content:"\F0D85"}.mdi-home-floor-l::before{content:"\F0D86"}.mdi-home-floor-negative-1::before{content:"\F0DD3"}.mdi-home-group::before{content:"\F0DD4"}.mdi-home-group-minus::before{content:"\F19C1"}.mdi-home-group-plus::before{content:"\F19C0"}.mdi-home-group-remove::before{content:"\F19C2"}.mdi-home-heart::before{content:"\F0827"}.mdi-home-import-outline::before{content:"\F0F9C"}.mdi-home-lightbulb::before{content:"\F1251"}.mdi-home-lightbulb-outline::before{content:"\F1252"}.mdi-home-lightning-bolt::before{content:"\F1903"}.mdi-home-lightning-bolt-outline::before{content:"\F1904"}.mdi-home-lock::before{content:"\F08EB"}.mdi-home-lock-open::before{content:"\F08EC"}.mdi-home-map-marker::before{content:"\F05F8"}.mdi-home-minus::before{content:"\F0974"}.mdi-home-minus-outline::before{content:"\F13D5"}.mdi-home-modern::before{content:"\F02DD"}.mdi-home-off::before{content:"\F1A46"}.mdi-home-off-outline::before{content:"\F1A47"}.mdi-home-outline::before{content:"\F06A1"}.mdi-home-percent::before{content:"\F1C7C"}.mdi-home-percent-outline::before{content:"\F1C7D"}.mdi-home-plus::before{content:"\F0975"}.mdi-home-plus-outline::before{content:"\F13D6"}.mdi-home-remove::before{content:"\F1247"}.mdi-home-remove-outline::before{content:"\F13D7"}.mdi-home-roof::before{content:"\F112B"}.mdi-home-search::before{content:"\F13B0"}.mdi-home-search-outline::before{content:"\F13B1"}.mdi-home-silo::before{content:"\F1BA0"}.mdi-home-silo-outline::before{content:"\F1BA1"}.mdi-home-sound-in::before{content:"\F1C2F"}.mdi-home-sound-in-outline::before{content:"\F1C30"}.mdi-home-sound-out::before{content:"\F1C31"}.mdi-home-sound-out-outline::before{content:"\F1C32"}.mdi-home-switch::before{content:"\F1794"}.mdi-home-switch-outline::before{content:"\F1795"}.mdi-home-thermometer::before{content:"\F0F54"}.mdi-home-thermometer-outline::before{content:"\F0F55"}.mdi-home-variant::before{content:"\F02DE"}.mdi-home-variant-outline::before{content:"\F0BA7"}.mdi-hook::before{content:"\F06E2"}.mdi-hook-off::before{content:"\F06E3"}.mdi-hoop-house::before{content:"\F0E56"}.mdi-hops::before{content:"\F02DF"}.mdi-horizontal-rotate-clockwise::before{content:"\F10F3"}.mdi-horizontal-rotate-counterclockwise::before{content:"\F10F4"}.mdi-horse::before{content:"\F15BF"}.mdi-horse-human::before{content:"\F15C0"}.mdi-horse-variant::before{content:"\F15C1"}.mdi-horse-variant-fast::before{content:"\F186E"}.mdi-horseshoe::before{content:"\F0A58"}.mdi-hospital::before{content:"\F0FF6"}.mdi-hospital-box::before{content:"\F02E0"}.mdi-hospital-box-outline::before{content:"\F0FF7"}.mdi-hospital-building::before{content:"\F02E1"}.mdi-hospital-marker::before{content:"\F02E2"}.mdi-hot-tub::before{content:"\F0828"}.mdi-hours-12::before{content:"\F1C94"}.mdi-hours-24::before{content:"\F1478"}.mdi-hub::before{content:"\F1C95"}.mdi-hub-outline::before{content:"\F1C96"}.mdi-hubspot::before{content:"\F0D17"}.mdi-hulu::before{content:"\F0829"}.mdi-human::before{content:"\F02E6"}.mdi-human-baby-changing-table::before{content:"\F138B"}.mdi-human-cane::before{content:"\F1581"}.mdi-human-capacity-decrease::before{content:"\F159B"}.mdi-human-capacity-increase::before{content:"\F159C"}.mdi-human-child::before{content:"\F02E7"}.mdi-human-dolly::before{content:"\F1980"}.mdi-human-edit::before{content:"\F14E8"}.mdi-human-female::before{content:"\F0649"}.mdi-human-female-boy::before{content:"\F0A59"}.mdi-human-female-dance::before{content:"\F15C9"}.mdi-human-female-female::before{content:"\F0A5A"}.mdi-human-female-female-child::before{content:"\F1C8E"}.mdi-human-female-girl::before{content:"\F0A5B"}.mdi-human-greeting::before{content:"\F17C4"}.mdi-human-greeting-proximity::before{content:"\F159D"}.mdi-human-greeting-variant::before{content:"\F064A"}.mdi-human-handsdown::before{content:"\F064B"}.mdi-human-handsup::before{content:"\F064C"}.mdi-human-male::before{content:"\F064D"}.mdi-human-male-board::before{content:"\F0890"}.mdi-human-male-board-poll::before{content:"\F0846"}.mdi-human-male-boy::before{content:"\F0A5C"}.mdi-human-male-child::before{content:"\F138C"}.mdi-human-male-female::before{content:"\F02E8"}.mdi-human-male-female-child::before{content:"\F1823"}.mdi-human-male-girl::before{content:"\F0A5D"}.mdi-human-male-height::before{content:"\F0EFB"}.mdi-human-male-height-variant::before{content:"\F0EFC"}.mdi-human-male-male::before{content:"\F0A5E"}.mdi-human-male-male-child::before{content:"\F1C8F"}.mdi-human-non-binary::before{content:"\F1848"}.mdi-human-pregnant::before{content:"\F05CF"}.mdi-human-queue::before{content:"\F1571"}.mdi-human-scooter::before{content:"\F11E9"}.mdi-human-walker::before{content:"\F1B71"}.mdi-human-wheelchair::before{content:"\F138D"}.mdi-human-white-cane::before{content:"\F1981"}.mdi-humble-bundle::before{content:"\F0744"}.mdi-hvac::before{content:"\F1352"}.mdi-hvac-off::before{content:"\F159E"}.mdi-hydraulic-oil-level::before{content:"\F1324"}.mdi-hydraulic-oil-temperature::before{content:"\F1325"}.mdi-hydro-power::before{content:"\F12E5"}.mdi-hydrogen-station::before{content:"\F1894"}.mdi-ice-cream::before{content:"\F082A"}.mdi-ice-cream-off::before{content:"\F0E52"}.mdi-ice-pop::before{content:"\F0EFD"}.mdi-id-card::before{content:"\F0FC0"}.mdi-identifier::before{content:"\F0EFE"}.mdi-ideogram-cjk::before{content:"\F1331"}.mdi-ideogram-cjk-variant::before{content:"\F1332"}.mdi-image::before{content:"\F02E9"}.mdi-image-album::before{content:"\F02EA"}.mdi-image-area::before{content:"\F02EB"}.mdi-image-area-close::before{content:"\F02EC"}.mdi-image-auto-adjust::before{content:"\F0FC1"}.mdi-image-broken::before{content:"\F02ED"}.mdi-image-broken-variant::before{content:"\F02EE"}.mdi-image-check::before{content:"\F1B25"}.mdi-image-check-outline::before{content:"\F1B26"}.mdi-image-edit::before{content:"\F11E3"}.mdi-image-edit-outline::before{content:"\F11E4"}.mdi-image-filter-black-white::before{content:"\F02F0"}.mdi-image-filter-center-focus::before{content:"\F02F1"}.mdi-image-filter-center-focus-strong::before{content:"\F0EFF"}.mdi-image-filter-center-focus-strong-outline::before{content:"\F0F00"}.mdi-image-filter-center-focus-weak::before{content:"\F02F2"}.mdi-image-filter-drama::before{content:"\F02F3"}.mdi-image-filter-drama-outline::before{content:"\F1BFF"}.mdi-image-filter-frames::before{content:"\F02F4"}.mdi-image-filter-hdr::before{content:"\F02F5"}.mdi-image-filter-hdr-outline::before{content:"\F1C64"}.mdi-image-filter-none::before{content:"\F02F6"}.mdi-image-filter-tilt-shift::before{content:"\F02F7"}.mdi-image-filter-vintage::before{content:"\F02F8"}.mdi-image-frame::before{content:"\F0E49"}.mdi-image-lock::before{content:"\F1AB0"}.mdi-image-lock-outline::before{content:"\F1AB1"}.mdi-image-marker::before{content:"\F177B"}.mdi-image-marker-outline::before{content:"\F177C"}.mdi-image-minus::before{content:"\F1419"}.mdi-image-minus-outline::before{content:"\F1B47"}.mdi-image-move::before{content:"\F09F8"}.mdi-image-multiple::before{content:"\F02F9"}.mdi-image-multiple-outline::before{content:"\F02EF"}.mdi-image-off::before{content:"\F082B"}.mdi-image-off-outline::before{content:"\F11D1"}.mdi-image-outline::before{content:"\F0976"}.mdi-image-plus::before{content:"\F087C"}.mdi-image-plus-outline::before{content:"\F1B46"}.mdi-image-refresh::before{content:"\F19FE"}.mdi-image-refresh-outline::before{content:"\F19FF"}.mdi-image-remove::before{content:"\F1418"}.mdi-image-remove-outline::before{content:"\F1B48"}.mdi-image-search::before{content:"\F0977"}.mdi-image-search-outline::before{content:"\F0978"}.mdi-image-size-select-actual::before{content:"\F0C8D"}.mdi-image-size-select-large::before{content:"\F0C8E"}.mdi-image-size-select-small::before{content:"\F0C8F"}.mdi-image-sync::before{content:"\F1A00"}.mdi-image-sync-outline::before{content:"\F1A01"}.mdi-image-text::before{content:"\F160D"}.mdi-import::before{content:"\F02FA"}.mdi-inbox::before{content:"\F0687"}.mdi-inbox-arrow-down::before{content:"\F02FB"}.mdi-inbox-arrow-down-outline::before{content:"\F1270"}.mdi-inbox-arrow-up::before{content:"\F03D1"}.mdi-inbox-arrow-up-outline::before{content:"\F1271"}.mdi-inbox-full::before{content:"\F1272"}.mdi-inbox-full-outline::before{content:"\F1273"}.mdi-inbox-multiple::before{content:"\F08B0"}.mdi-inbox-multiple-outline::before{content:"\F0BA8"}.mdi-inbox-outline::before{content:"\F1274"}.mdi-inbox-remove::before{content:"\F159F"}.mdi-inbox-remove-outline::before{content:"\F15A0"}.mdi-incognito::before{content:"\F05F9"}.mdi-incognito-circle::before{content:"\F1421"}.mdi-incognito-circle-off::before{content:"\F1422"}.mdi-incognito-off::before{content:"\F0075"}.mdi-induction::before{content:"\F184C"}.mdi-infinity::before{content:"\F06E4"}.mdi-information::before{content:"\F02FC"}.mdi-information-box::before{content:"\F1C65"}.mdi-information-box-outline::before{content:"\F1C66"}.mdi-information-off::before{content:"\F178C"}.mdi-information-off-outline::before{content:"\F178D"}.mdi-information-outline::before{content:"\F02FD"}.mdi-information-slab-box::before{content:"\F1C67"}.mdi-information-slab-box-outline::before{content:"\F1C68"}.mdi-information-slab-circle::before{content:"\F1C69"}.mdi-information-slab-circle-outline::before{content:"\F1C6A"}.mdi-information-slab-symbol::before{content:"\F1C6B"}.mdi-information-symbol::before{content:"\F1C6C"}.mdi-information-variant::before{content:"\F064E"}.mdi-information-variant-box::before{content:"\F1C6D"}.mdi-information-variant-box-outline::before{content:"\F1C6E"}.mdi-information-variant-circle::before{content:"\F1C6F"}.mdi-information-variant-circle-outline::before{content:"\F1C70"}.mdi-instagram::before{content:"\F02FE"}.mdi-instrument-triangle::before{content:"\F104E"}.mdi-integrated-circuit-chip::before{content:"\F1913"}.mdi-invert-colors::before{content:"\F0301"}.mdi-invert-colors-off::before{content:"\F0E4A"}.mdi-invoice::before{content:"\F1CD2"}.mdi-invoice-arrow-left::before{content:"\F1CD3"}.mdi-invoice-arrow-left-outline::before{content:"\F1CD4"}.mdi-invoice-arrow-right::before{content:"\F1CD5"}.mdi-invoice-arrow-right-outline::before{content:"\F1CD6"}.mdi-invoice-check::before{content:"\F1CD7"}.mdi-invoice-check-outline::before{content:"\F1CD8"}.mdi-invoice-clock::before{content:"\F1CD9"}.mdi-invoice-clock-outline::before{content:"\F1CDA"}.mdi-invoice-edit::before{content:"\F1CDB"}.mdi-invoice-edit-outline::before{content:"\F1CDC"}.mdi-invoice-export-outline::before{content:"\F1CDD"}.mdi-invoice-fast::before{content:"\F1CDE"}.mdi-invoice-fast-outline::before{content:"\F1CDF"}.mdi-invoice-import::before{content:"\F1CE0"}.mdi-invoice-import-outline::before{content:"\F1CE1"}.mdi-invoice-list::before{content:"\F1CE2"}.mdi-invoice-list-outline::before{content:"\F1CE3"}.mdi-invoice-minus::before{content:"\F1CE4"}.mdi-invoice-minus-outline::before{content:"\F1CE5"}.mdi-invoice-multiple::before{content:"\F1CE6"}.mdi-invoice-multiple-outline::before{content:"\F1CE7"}.mdi-invoice-outline::before{content:"\F1CE8"}.mdi-invoice-plus::before{content:"\F1CE9"}.mdi-invoice-plus-outline::before{content:"\F1CEA"}.mdi-invoice-remove::before{content:"\F1CEB"}.mdi-invoice-remove-outline::before{content:"\F1CEC"}.mdi-invoice-send::before{content:"\F1CED"}.mdi-invoice-send-outline::before{content:"\F1CEE"}.mdi-invoice-text::before{content:"\F1CEF"}.mdi-invoice-text-arrow-left::before{content:"\F1CF0"}.mdi-invoice-text-arrow-left-outline::before{content:"\F1CF1"}.mdi-invoice-text-arrow-right::before{content:"\F1CF2"}.mdi-invoice-text-arrow-right-outline::before{content:"\F1CF3"}.mdi-invoice-text-check::before{content:"\F1CF4"}.mdi-invoice-text-check-outline::before{content:"\F1CF5"}.mdi-invoice-text-clock::before{content:"\F1CF6"}.mdi-invoice-text-clock-outline::before{content:"\F1CF7"}.mdi-invoice-text-edit::before{content:"\F1CF8"}.mdi-invoice-text-edit-outline::before{content:"\F1CF9"}.mdi-invoice-text-fast::before{content:"\F1CFA"}.mdi-invoice-text-fast-outline::before{content:"\F1CFB"}.mdi-invoice-text-minus::before{content:"\F1CFC"}.mdi-invoice-text-minus-outline::before{content:"\F1CFD"}.mdi-invoice-text-multiple::before{content:"\F1CFE"}.mdi-invoice-text-multiple-outline::before{content:"\F1CFF"}.mdi-invoice-text-outline::before{content:"\F1D00"}.mdi-invoice-text-plus::before{content:"\F1D01"}.mdi-invoice-text-plus-outline::before{content:"\F1D02"}.mdi-invoice-text-remove::before{content:"\F1D03"}.mdi-invoice-text-remove-outline::before{content:"\F1D04"}.mdi-invoice-text-send::before{content:"\F1D05"}.mdi-invoice-text-send-outline::before{content:"\F1D06"}.mdi-iobroker::before{content:"\F12E8"}.mdi-ip::before{content:"\F0A5F"}.mdi-ip-network::before{content:"\F0A60"}.mdi-ip-network-outline::before{content:"\F0C90"}.mdi-ip-outline::before{content:"\F1982"}.mdi-ipod::before{content:"\F0C91"}.mdi-iron::before{content:"\F1824"}.mdi-iron-board::before{content:"\F1838"}.mdi-iron-outline::before{content:"\F1825"}.mdi-island::before{content:"\F104F"}.mdi-island-variant::before{content:"\F1CC6"}.mdi-iv-bag::before{content:"\F10B9"}.mdi-jabber::before{content:"\F0DD5"}.mdi-jeepney::before{content:"\F0302"}.mdi-jellyfish::before{content:"\F0F01"}.mdi-jellyfish-outline::before{content:"\F0F02"}.mdi-jira::before{content:"\F0303"}.mdi-jquery::before{content:"\F087D"}.mdi-jsfiddle::before{content:"\F0304"}.mdi-jump-rope::before{content:"\F12FF"}.mdi-kabaddi::before{content:"\F0D87"}.mdi-kangaroo::before{content:"\F1558"}.mdi-karate::before{content:"\F082C"}.mdi-kayaking::before{content:"\F08AF"}.mdi-keg::before{content:"\F0305"}.mdi-kettle::before{content:"\F05FA"}.mdi-kettle-alert::before{content:"\F1317"}.mdi-kettle-alert-outline::before{content:"\F1318"}.mdi-kettle-off::before{content:"\F131B"}.mdi-kettle-off-outline::before{content:"\F131C"}.mdi-kettle-outline::before{content:"\F0F56"}.mdi-kettle-pour-over::before{content:"\F173C"}.mdi-kettle-steam::before{content:"\F1319"}.mdi-kettle-steam-outline::before{content:"\F131A"}.mdi-kettlebell::before{content:"\F1300"}.mdi-key::before{content:"\F0306"}.mdi-key-alert::before{content:"\F1983"}.mdi-key-alert-outline::before{content:"\F1984"}.mdi-key-arrow-right::before{content:"\F1312"}.mdi-key-chain::before{content:"\F1574"}.mdi-key-chain-variant::before{content:"\F1575"}.mdi-key-change::before{content:"\F0307"}.mdi-key-link::before{content:"\F119F"}.mdi-key-minus::before{content:"\F0308"}.mdi-key-outline::before{content:"\F0DD6"}.mdi-key-plus::before{content:"\F0309"}.mdi-key-remove::before{content:"\F030A"}.mdi-key-star::before{content:"\F119E"}.mdi-key-variant::before{content:"\F030B"}.mdi-key-wireless::before{content:"\F0FC2"}.mdi-keyboard::before{content:"\F030C"}.mdi-keyboard-backspace::before{content:"\F030D"}.mdi-keyboard-caps::before{content:"\F030E"}.mdi-keyboard-close::before{content:"\F030F"}.mdi-keyboard-close-outline::before{content:"\F1C00"}.mdi-keyboard-esc::before{content:"\F12B7"}.mdi-keyboard-f1::before{content:"\F12AB"}.mdi-keyboard-f10::before{content:"\F12B4"}.mdi-keyboard-f11::before{content:"\F12B5"}.mdi-keyboard-f12::before{content:"\F12B6"}.mdi-keyboard-f2::before{content:"\F12AC"}.mdi-keyboard-f3::before{content:"\F12AD"}.mdi-keyboard-f4::before{content:"\F12AE"}.mdi-keyboard-f5::before{content:"\F12AF"}.mdi-keyboard-f6::before{content:"\F12B0"}.mdi-keyboard-f7::before{content:"\F12B1"}.mdi-keyboard-f8::before{content:"\F12B2"}.mdi-keyboard-f9::before{content:"\F12B3"}.mdi-keyboard-off::before{content:"\F0310"}.mdi-keyboard-off-outline::before{content:"\F0E4B"}.mdi-keyboard-outline::before{content:"\F097B"}.mdi-keyboard-return::before{content:"\F0311"}.mdi-keyboard-settings::before{content:"\F09F9"}.mdi-keyboard-settings-outline::before{content:"\F09FA"}.mdi-keyboard-space::before{content:"\F1050"}.mdi-keyboard-tab::before{content:"\F0312"}.mdi-keyboard-tab-reverse::before{content:"\F0325"}.mdi-keyboard-variant::before{content:"\F0313"}.mdi-khanda::before{content:"\F10FD"}.mdi-kickstarter::before{content:"\F0745"}.mdi-kite::before{content:"\F1985"}.mdi-kite-outline::before{content:"\F1986"}.mdi-kitesurfing::before{content:"\F1744"}.mdi-klingon::before{content:"\F135B"}.mdi-knife::before{content:"\F09FB"}.mdi-knife-military::before{content:"\F09FC"}.mdi-knob::before{content:"\F1B96"}.mdi-koala::before{content:"\F173F"}.mdi-kodi::before{content:"\F0314"}.mdi-kubernetes::before{content:"\F10FE"}.mdi-label::before{content:"\F0315"}.mdi-label-multiple::before{content:"\F1375"}.mdi-label-multiple-outline::before{content:"\F1376"}.mdi-label-off::before{content:"\F0ACB"}.mdi-label-off-outline::before{content:"\F0ACC"}.mdi-label-outline::before{content:"\F0316"}.mdi-label-percent::before{content:"\F12EA"}.mdi-label-percent-outline::before{content:"\F12EB"}.mdi-label-variant::before{content:"\F0ACD"}.mdi-label-variant-outline::before{content:"\F0ACE"}.mdi-ladder::before{content:"\F15A2"}.mdi-ladybug::before{content:"\F082D"}.mdi-lambda::before{content:"\F0627"}.mdi-lamp::before{content:"\F06B5"}.mdi-lamp-outline::before{content:"\F17D0"}.mdi-lamps::before{content:"\F1576"}.mdi-lamps-outline::before{content:"\F17D1"}.mdi-lan::before{content:"\F0317"}.mdi-lan-check::before{content:"\F12AA"}.mdi-lan-connect::before{content:"\F0318"}.mdi-lan-disconnect::before{content:"\F0319"}.mdi-lan-pending::before{content:"\F031A"}.mdi-land-fields::before{content:"\F1AB2"}.mdi-land-plots::before{content:"\F1AB3"}.mdi-land-plots-circle::before{content:"\F1AB4"}.mdi-land-plots-circle-variant::before{content:"\F1AB5"}.mdi-land-plots-marker::before{content:"\F1C5D"}.mdi-land-rows-horizontal::before{content:"\F1AB6"}.mdi-land-rows-vertical::before{content:"\F1AB7"}.mdi-landslide::before{content:"\F1A48"}.mdi-landslide-outline::before{content:"\F1A49"}.mdi-language-c::before{content:"\F0671"}.mdi-language-cpp::before{content:"\F0672"}.mdi-language-csharp::before{content:"\F031B"}.mdi-language-css3::before{content:"\F031C"}.mdi-language-fortran::before{content:"\F121A"}.mdi-language-go::before{content:"\F07D3"}.mdi-language-haskell::before{content:"\F0C92"}.mdi-language-html5::before{content:"\F031D"}.mdi-language-java::before{content:"\F0B37"}.mdi-language-javascript::before{content:"\F031E"}.mdi-language-kotlin::before{content:"\F1219"}.mdi-language-lua::before{content:"\F08B1"}.mdi-language-markdown::before{content:"\F0354"}.mdi-language-markdown-outline::before{content:"\F0F5B"}.mdi-language-php::before{content:"\F031F"}.mdi-language-python::before{content:"\F0320"}.mdi-language-r::before{content:"\F07D4"}.mdi-language-ruby::before{content:"\F0D2D"}.mdi-language-ruby-on-rails::before{content:"\F0ACF"}.mdi-language-rust::before{content:"\F1617"}.mdi-language-swift::before{content:"\F06E5"}.mdi-language-typescript::before{content:"\F06E6"}.mdi-language-xaml::before{content:"\F0673"}.mdi-laptop::before{content:"\F0322"}.mdi-laptop-account::before{content:"\F1A4A"}.mdi-laptop-off::before{content:"\F06E7"}.mdi-laravel::before{content:"\F0AD0"}.mdi-laser-pointer::before{content:"\F1484"}.mdi-lasso::before{content:"\F0F03"}.mdi-lastpass::before{content:"\F0446"}.mdi-latitude::before{content:"\F0F57"}.mdi-launch::before{content:"\F0327"}.mdi-lava-lamp::before{content:"\F07D5"}.mdi-layers::before{content:"\F0328"}.mdi-layers-edit::before{content:"\F1892"}.mdi-layers-minus::before{content:"\F0E4C"}.mdi-layers-off::before{content:"\F0329"}.mdi-layers-off-outline::before{content:"\F09FD"}.mdi-layers-outline::before{content:"\F09FE"}.mdi-layers-plus::before{content:"\F0E4D"}.mdi-layers-remove::before{content:"\F0E4E"}.mdi-layers-search::before{content:"\F1206"}.mdi-layers-search-outline::before{content:"\F1207"}.mdi-layers-triple::before{content:"\F0F58"}.mdi-layers-triple-outline::before{content:"\F0F59"}.mdi-lead-pencil::before{content:"\F064F"}.mdi-leaf::before{content:"\F032A"}.mdi-leaf-circle::before{content:"\F1905"}.mdi-leaf-circle-outline::before{content:"\F1906"}.mdi-leaf-maple::before{content:"\F0C93"}.mdi-leaf-maple-off::before{content:"\F12DA"}.mdi-leaf-off::before{content:"\F12D9"}.mdi-leak::before{content:"\F0DD7"}.mdi-leak-off::before{content:"\F0DD8"}.mdi-lectern::before{content:"\F1AF0"}.mdi-led-off::before{content:"\F032B"}.mdi-led-on::before{content:"\F032C"}.mdi-led-outline::before{content:"\F032D"}.mdi-led-strip::before{content:"\F07D6"}.mdi-led-strip-variant::before{content:"\F1051"}.mdi-led-strip-variant-off::before{content:"\F1A4B"}.mdi-led-variant-off::before{content:"\F032E"}.mdi-led-variant-on::before{content:"\F032F"}.mdi-led-variant-outline::before{content:"\F0330"}.mdi-leek::before{content:"\F117D"}.mdi-less-than::before{content:"\F097C"}.mdi-less-than-or-equal::before{content:"\F097D"}.mdi-library::before{content:"\F0331"}.mdi-library-outline::before{content:"\F1A22"}.mdi-library-shelves::before{content:"\F0BA9"}.mdi-license::before{content:"\F0FC3"}.mdi-lifebuoy::before{content:"\F087E"}.mdi-light-flood-down::before{content:"\F1987"}.mdi-light-flood-up::before{content:"\F1988"}.mdi-light-recessed::before{content:"\F179B"}.mdi-light-switch::before{content:"\F097E"}.mdi-light-switch-off::before{content:"\F1A24"}.mdi-lightbulb::before{content:"\F0335"}.mdi-lightbulb-alert::before{content:"\F19E1"}.mdi-lightbulb-alert-outline::before{content:"\F19E2"}.mdi-lightbulb-auto::before{content:"\F1800"}.mdi-lightbulb-auto-outline::before{content:"\F1801"}.mdi-lightbulb-cfl::before{content:"\F1208"}.mdi-lightbulb-cfl-off::before{content:"\F1209"}.mdi-lightbulb-cfl-spiral::before{content:"\F1275"}.mdi-lightbulb-cfl-spiral-off::before{content:"\F12C3"}.mdi-lightbulb-fluorescent-tube::before{content:"\F1804"}.mdi-lightbulb-fluorescent-tube-outline::before{content:"\F1805"}.mdi-lightbulb-group::before{content:"\F1253"}.mdi-lightbulb-group-off::before{content:"\F12CD"}.mdi-lightbulb-group-off-outline::before{content:"\F12CE"}.mdi-lightbulb-group-outline::before{content:"\F1254"}.mdi-lightbulb-multiple::before{content:"\F1255"}.mdi-lightbulb-multiple-off::before{content:"\F12CF"}.mdi-lightbulb-multiple-off-outline::before{content:"\F12D0"}.mdi-lightbulb-multiple-outline::before{content:"\F1256"}.mdi-lightbulb-night::before{content:"\F1A4C"}.mdi-lightbulb-night-outline::before{content:"\F1A4D"}.mdi-lightbulb-off::before{content:"\F0E4F"}.mdi-lightbulb-off-outline::before{content:"\F0E50"}.mdi-lightbulb-on::before{content:"\F06E8"}.mdi-lightbulb-on-10::before{content:"\F1A4E"}.mdi-lightbulb-on-20::before{content:"\F1A4F"}.mdi-lightbulb-on-30::before{content:"\F1A50"}.mdi-lightbulb-on-40::before{content:"\F1A51"}.mdi-lightbulb-on-50::before{content:"\F1A52"}.mdi-lightbulb-on-60::before{content:"\F1A53"}.mdi-lightbulb-on-70::before{content:"\F1A54"}.mdi-lightbulb-on-80::before{content:"\F1A55"}.mdi-lightbulb-on-90::before{content:"\F1A56"}.mdi-lightbulb-on-outline::before{content:"\F06E9"}.mdi-lightbulb-outline::before{content:"\F0336"}.mdi-lightbulb-question::before{content:"\F19E3"}.mdi-lightbulb-question-outline::before{content:"\F19E4"}.mdi-lightbulb-spot::before{content:"\F17F4"}.mdi-lightbulb-spot-off::before{content:"\F17F5"}.mdi-lightbulb-variant::before{content:"\F1802"}.mdi-lightbulb-variant-outline::before{content:"\F1803"}.mdi-lighthouse::before{content:"\F09FF"}.mdi-lighthouse-on::before{content:"\F0A00"}.mdi-lightning-bolt::before{content:"\F140B"}.mdi-lightning-bolt-circle::before{content:"\F0820"}.mdi-lightning-bolt-outline::before{content:"\F140C"}.mdi-line-scan::before{content:"\F0624"}.mdi-lingerie::before{content:"\F1476"}.mdi-link::before{content:"\F0337"}.mdi-link-box::before{content:"\F0D1A"}.mdi-link-box-outline::before{content:"\F0D1B"}.mdi-link-box-variant::before{content:"\F0D1C"}.mdi-link-box-variant-outline::before{content:"\F0D1D"}.mdi-link-circle::before{content:"\F1CAC"}.mdi-link-circle-outline::before{content:"\F1CAD"}.mdi-link-edit::before{content:"\F1CAE"}.mdi-link-lock::before{content:"\F10BA"}.mdi-link-off::before{content:"\F0338"}.mdi-link-plus::before{content:"\F0C94"}.mdi-link-variant::before{content:"\F0339"}.mdi-link-variant-minus::before{content:"\F10FF"}.mdi-link-variant-off::before{content:"\F033A"}.mdi-link-variant-plus::before{content:"\F1100"}.mdi-link-variant-remove::before{content:"\F1101"}.mdi-linkedin::before{content:"\F033B"}.mdi-linux::before{content:"\F033D"}.mdi-linux-mint::before{content:"\F08ED"}.mdi-lipstick::before{content:"\F13B5"}.mdi-liquid-spot::before{content:"\F1826"}.mdi-liquor::before{content:"\F191E"}.mdi-list-box::before{content:"\F1B7B"}.mdi-list-box-outline::before{content:"\F1B7C"}.mdi-list-status::before{content:"\F15AB"}.mdi-litecoin::before{content:"\F0A61"}.mdi-loading::before{content:"\F0772"}.mdi-location-enter::before{content:"\F0FC4"}.mdi-location-exit::before{content:"\F0FC5"}.mdi-lock::before{content:"\F033E"}.mdi-lock-alert::before{content:"\F08EE"}.mdi-lock-alert-outline::before{content:"\F15D1"}.mdi-lock-check::before{content:"\F139A"}.mdi-lock-check-outline::before{content:"\F16A8"}.mdi-lock-clock::before{content:"\F097F"}.mdi-lock-minus::before{content:"\F16A9"}.mdi-lock-minus-outline::before{content:"\F16AA"}.mdi-lock-off::before{content:"\F1671"}.mdi-lock-off-outline::before{content:"\F1672"}.mdi-lock-open::before{content:"\F033F"}.mdi-lock-open-alert::before{content:"\F139B"}.mdi-lock-open-alert-outline::before{content:"\F15D2"}.mdi-lock-open-check::before{content:"\F139C"}.mdi-lock-open-check-outline::before{content:"\F16AB"}.mdi-lock-open-minus::before{content:"\F16AC"}.mdi-lock-open-minus-outline::before{content:"\F16AD"}.mdi-lock-open-outline::before{content:"\F0340"}.mdi-lock-open-plus::before{content:"\F16AE"}.mdi-lock-open-plus-outline::before{content:"\F16AF"}.mdi-lock-open-remove::before{content:"\F16B0"}.mdi-lock-open-remove-outline::before{content:"\F16B1"}.mdi-lock-open-variant::before{content:"\F0FC6"}.mdi-lock-open-variant-outline::before{content:"\F0FC7"}.mdi-lock-outline::before{content:"\F0341"}.mdi-lock-pattern::before{content:"\F06EA"}.mdi-lock-percent::before{content:"\F1C12"}.mdi-lock-percent-open::before{content:"\F1C13"}.mdi-lock-percent-open-outline::before{content:"\F1C14"}.mdi-lock-percent-open-variant::before{content:"\F1C15"}.mdi-lock-percent-open-variant-outline::before{content:"\F1C16"}.mdi-lock-percent-outline::before{content:"\F1C17"}.mdi-lock-plus::before{content:"\F05FB"}.mdi-lock-plus-outline::before{content:"\F16B2"}.mdi-lock-question::before{content:"\F08EF"}.mdi-lock-remove::before{content:"\F16B3"}.mdi-lock-remove-outline::before{content:"\F16B4"}.mdi-lock-reset::before{content:"\F0773"}.mdi-lock-smart::before{content:"\F08B2"}.mdi-locker::before{content:"\F07D7"}.mdi-locker-multiple::before{content:"\F07D8"}.mdi-login::before{content:"\F0342"}.mdi-login-variant::before{content:"\F05FC"}.mdi-logout::before{content:"\F0343"}.mdi-logout-variant::before{content:"\F05FD"}.mdi-longitude::before{content:"\F0F5A"}.mdi-looks::before{content:"\F0344"}.mdi-lotion::before{content:"\F1582"}.mdi-lotion-outline::before{content:"\F1583"}.mdi-lotion-plus::before{content:"\F1584"}.mdi-lotion-plus-outline::before{content:"\F1585"}.mdi-loupe::before{content:"\F0345"}.mdi-lumx::before{content:"\F0346"}.mdi-lungs::before{content:"\F1084"}.mdi-mace::before{content:"\F1843"}.mdi-magazine-pistol::before{content:"\F0324"}.mdi-magazine-rifle::before{content:"\F0323"}.mdi-magic-staff::before{content:"\F1844"}.mdi-magnet::before{content:"\F0347"}.mdi-magnet-on::before{content:"\F0348"}.mdi-magnify::before{content:"\F0349"}.mdi-magnify-close::before{content:"\F0980"}.mdi-magnify-expand::before{content:"\F1874"}.mdi-magnify-minus::before{content:"\F034A"}.mdi-magnify-minus-cursor::before{content:"\F0A62"}.mdi-magnify-minus-outline::before{content:"\F06EC"}.mdi-magnify-plus::before{content:"\F034B"}.mdi-magnify-plus-cursor::before{content:"\F0A63"}.mdi-magnify-plus-outline::before{content:"\F06ED"}.mdi-magnify-remove-cursor::before{content:"\F120C"}.mdi-magnify-remove-outline::before{content:"\F120D"}.mdi-magnify-scan::before{content:"\F1276"}.mdi-mail::before{content:"\F0EBB"}.mdi-mailbox::before{content:"\F06EE"}.mdi-mailbox-open::before{content:"\F0D88"}.mdi-mailbox-open-outline::before{content:"\F0D89"}.mdi-mailbox-open-up::before{content:"\F0D8A"}.mdi-mailbox-open-up-outline::before{content:"\F0D8B"}.mdi-mailbox-outline::before{content:"\F0D8C"}.mdi-mailbox-up::before{content:"\F0D8D"}.mdi-mailbox-up-outline::before{content:"\F0D8E"}.mdi-manjaro::before{content:"\F160A"}.mdi-map::before{content:"\F034D"}.mdi-map-check::before{content:"\F0EBC"}.mdi-map-check-outline::before{content:"\F0EBD"}.mdi-map-clock::before{content:"\F0D1E"}.mdi-map-clock-outline::before{content:"\F0D1F"}.mdi-map-legend::before{content:"\F0A01"}.mdi-map-marker::before{content:"\F034E"}.mdi-map-marker-account::before{content:"\F18E3"}.mdi-map-marker-account-outline::before{content:"\F18E4"}.mdi-map-marker-alert::before{content:"\F0F05"}.mdi-map-marker-alert-outline::before{content:"\F0F06"}.mdi-map-marker-check::before{content:"\F0C95"}.mdi-map-marker-check-outline::before{content:"\F12FB"}.mdi-map-marker-circle::before{content:"\F034F"}.mdi-map-marker-distance::before{content:"\F08F0"}.mdi-map-marker-down::before{content:"\F1102"}.mdi-map-marker-left::before{content:"\F12DB"}.mdi-map-marker-left-outline::before{content:"\F12DD"}.mdi-map-marker-minus::before{content:"\F0650"}.mdi-map-marker-minus-outline::before{content:"\F12F9"}.mdi-map-marker-multiple::before{content:"\F0350"}.mdi-map-marker-multiple-outline::before{content:"\F1277"}.mdi-map-marker-off::before{content:"\F0351"}.mdi-map-marker-off-outline::before{content:"\F12FD"}.mdi-map-marker-outline::before{content:"\F07D9"}.mdi-map-marker-path::before{content:"\F0D20"}.mdi-map-marker-plus::before{content:"\F0651"}.mdi-map-marker-plus-outline::before{content:"\F12F8"}.mdi-map-marker-question::before{content:"\F0F07"}.mdi-map-marker-question-outline::before{content:"\F0F08"}.mdi-map-marker-radius::before{content:"\F0352"}.mdi-map-marker-radius-outline::before{content:"\F12FC"}.mdi-map-marker-remove::before{content:"\F0F09"}.mdi-map-marker-remove-outline::before{content:"\F12FA"}.mdi-map-marker-remove-variant::before{content:"\F0F0A"}.mdi-map-marker-right::before{content:"\F12DC"}.mdi-map-marker-right-outline::before{content:"\F12DE"}.mdi-map-marker-star::before{content:"\F1608"}.mdi-map-marker-star-outline::before{content:"\F1609"}.mdi-map-marker-up::before{content:"\F1103"}.mdi-map-minus::before{content:"\F0981"}.mdi-map-outline::before{content:"\F0982"}.mdi-map-plus::before{content:"\F0983"}.mdi-map-search::before{content:"\F0984"}.mdi-map-search-outline::before{content:"\F0985"}.mdi-mapbox::before{content:"\F0BAA"}.mdi-margin::before{content:"\F0353"}.mdi-marker::before{content:"\F0652"}.mdi-marker-cancel::before{content:"\F0DD9"}.mdi-marker-check::before{content:"\F0355"}.mdi-mastodon::before{content:"\F0AD1"}.mdi-material-design::before{content:"\F0986"}.mdi-material-ui::before{content:"\F0357"}.mdi-math-compass::before{content:"\F0358"}.mdi-math-cos::before{content:"\F0C96"}.mdi-math-integral::before{content:"\F0FC8"}.mdi-math-integral-box::before{content:"\F0FC9"}.mdi-math-log::before{content:"\F1085"}.mdi-math-norm::before{content:"\F0FCA"}.mdi-math-norm-box::before{content:"\F0FCB"}.mdi-math-sin::before{content:"\F0C97"}.mdi-math-tan::before{content:"\F0C98"}.mdi-matrix::before{content:"\F0628"}.mdi-medal::before{content:"\F0987"}.mdi-medal-outline::before{content:"\F1326"}.mdi-medical-bag::before{content:"\F06EF"}.mdi-medical-cotton-swab::before{content:"\F1AB8"}.mdi-medication::before{content:"\F1B14"}.mdi-medication-outline::before{content:"\F1B15"}.mdi-meditation::before{content:"\F117B"}.mdi-memory::before{content:"\F035B"}.mdi-memory-arrow-down::before{content:"\F1CA6"}.mdi-menorah::before{content:"\F17D4"}.mdi-menorah-fire::before{content:"\F17D5"}.mdi-menu::before{content:"\F035C"}.mdi-menu-close::before{content:"\F1C90"}.mdi-menu-down::before{content:"\F035D"}.mdi-menu-down-outline::before{content:"\F06B6"}.mdi-menu-left::before{content:"\F035E"}.mdi-menu-left-outline::before{content:"\F0A02"}.mdi-menu-open::before{content:"\F0BAB"}.mdi-menu-right::before{content:"\F035F"}.mdi-menu-right-outline::before{content:"\F0A03"}.mdi-menu-swap::before{content:"\F0A64"}.mdi-menu-swap-outline::before{content:"\F0A65"}.mdi-menu-up::before{content:"\F0360"}.mdi-menu-up-outline::before{content:"\F06B7"}.mdi-merge::before{content:"\F0F5C"}.mdi-message::before{content:"\F0361"}.mdi-message-alert::before{content:"\F0362"}.mdi-message-alert-outline::before{content:"\F0A04"}.mdi-message-arrow-left::before{content:"\F12F2"}.mdi-message-arrow-left-outline::before{content:"\F12F3"}.mdi-message-arrow-right::before{content:"\F12F4"}.mdi-message-arrow-right-outline::before{content:"\F12F5"}.mdi-message-badge::before{content:"\F1941"}.mdi-message-badge-outline::before{content:"\F1942"}.mdi-message-bookmark::before{content:"\F15AC"}.mdi-message-bookmark-outline::before{content:"\F15AD"}.mdi-message-bulleted::before{content:"\F06A2"}.mdi-message-bulleted-off::before{content:"\F06A3"}.mdi-message-check::before{content:"\F1B8A"}.mdi-message-check-outline::before{content:"\F1B8B"}.mdi-message-cog::before{content:"\F06F1"}.mdi-message-cog-outline::before{content:"\F1172"}.mdi-message-draw::before{content:"\F0363"}.mdi-message-fast::before{content:"\F19CC"}.mdi-message-fast-outline::before{content:"\F19CD"}.mdi-message-flash::before{content:"\F15A9"}.mdi-message-flash-outline::before{content:"\F15AA"}.mdi-message-image::before{content:"\F0364"}.mdi-message-image-outline::before{content:"\F116C"}.mdi-message-lock::before{content:"\F0FCC"}.mdi-message-lock-outline::before{content:"\F116D"}.mdi-message-minus::before{content:"\F116E"}.mdi-message-minus-outline::before{content:"\F116F"}.mdi-message-off::before{content:"\F164D"}.mdi-message-off-outline::before{content:"\F164E"}.mdi-message-outline::before{content:"\F0365"}.mdi-message-plus::before{content:"\F0653"}.mdi-message-plus-outline::before{content:"\F10BB"}.mdi-message-processing::before{content:"\F0366"}.mdi-message-processing-outline::before{content:"\F1170"}.mdi-message-question::before{content:"\F173A"}.mdi-message-question-outline::before{content:"\F173B"}.mdi-message-reply::before{content:"\F0367"}.mdi-message-reply-outline::before{content:"\F173D"}.mdi-message-reply-text::before{content:"\F0368"}.mdi-message-reply-text-outline::before{content:"\F173E"}.mdi-message-settings::before{content:"\F06F0"}.mdi-message-settings-outline::before{content:"\F1171"}.mdi-message-star::before{content:"\F069A"}.mdi-message-star-outline::before{content:"\F1250"}.mdi-message-text::before{content:"\F0369"}.mdi-message-text-clock::before{content:"\F1173"}.mdi-message-text-clock-outline::before{content:"\F1174"}.mdi-message-text-fast::before{content:"\F19CE"}.mdi-message-text-fast-outline::before{content:"\F19CF"}.mdi-message-text-lock::before{content:"\F0FCD"}.mdi-message-text-lock-outline::before{content:"\F1175"}.mdi-message-text-outline::before{content:"\F036A"}.mdi-message-video::before{content:"\F036B"}.mdi-meteor::before{content:"\F0629"}.mdi-meter-electric::before{content:"\F1A57"}.mdi-meter-electric-outline::before{content:"\F1A58"}.mdi-meter-gas::before{content:"\F1A59"}.mdi-meter-gas-outline::before{content:"\F1A5A"}.mdi-metronome::before{content:"\F07DA"}.mdi-metronome-tick::before{content:"\F07DB"}.mdi-micro-sd::before{content:"\F07DC"}.mdi-microphone::before{content:"\F036C"}.mdi-microphone-message::before{content:"\F050A"}.mdi-microphone-message-off::before{content:"\F050B"}.mdi-microphone-minus::before{content:"\F08B3"}.mdi-microphone-off::before{content:"\F036D"}.mdi-microphone-outline::before{content:"\F036E"}.mdi-microphone-plus::before{content:"\F08B4"}.mdi-microphone-question::before{content:"\F1989"}.mdi-microphone-question-outline::before{content:"\F198A"}.mdi-microphone-settings::before{content:"\F036F"}.mdi-microphone-variant::before{content:"\F0370"}.mdi-microphone-variant-off::before{content:"\F0371"}.mdi-microscope::before{content:"\F0654"}.mdi-microsoft::before{content:"\F0372"}.mdi-microsoft-access::before{content:"\F138E"}.mdi-microsoft-azure::before{content:"\F0805"}.mdi-microsoft-azure-devops::before{content:"\F0FD5"}.mdi-microsoft-bing::before{content:"\F00A4"}.mdi-microsoft-dynamics-365::before{content:"\F0988"}.mdi-microsoft-edge::before{content:"\F01E9"}.mdi-microsoft-excel::before{content:"\F138F"}.mdi-microsoft-internet-explorer::before{content:"\F0300"}.mdi-microsoft-office::before{content:"\F03C6"}.mdi-microsoft-onedrive::before{content:"\F03CA"}.mdi-microsoft-onenote::before{content:"\F0747"}.mdi-microsoft-outlook::before{content:"\F0D22"}.mdi-microsoft-powerpoint::before{content:"\F1390"}.mdi-microsoft-sharepoint::before{content:"\F1391"}.mdi-microsoft-teams::before{content:"\F02BB"}.mdi-microsoft-visual-studio::before{content:"\F0610"}.mdi-microsoft-visual-studio-code::before{content:"\F0A1E"}.mdi-microsoft-windows::before{content:"\F05B3"}.mdi-microsoft-windows-classic::before{content:"\F0A21"}.mdi-microsoft-word::before{content:"\F1392"}.mdi-microsoft-xbox::before{content:"\F05B9"}.mdi-microsoft-xbox-controller::before{content:"\F05BA"}.mdi-microsoft-xbox-controller-battery-alert::before{content:"\F074B"}.mdi-microsoft-xbox-controller-battery-charging::before{content:"\F0A22"}.mdi-microsoft-xbox-controller-battery-empty::before{content:"\F074C"}.mdi-microsoft-xbox-controller-battery-full::before{content:"\F074D"}.mdi-microsoft-xbox-controller-battery-low::before{content:"\F074E"}.mdi-microsoft-xbox-controller-battery-medium::before{content:"\F074F"}.mdi-microsoft-xbox-controller-battery-unknown::before{content:"\F0750"}.mdi-microsoft-xbox-controller-menu::before{content:"\F0E6F"}.mdi-microsoft-xbox-controller-off::before{content:"\F05BB"}.mdi-microsoft-xbox-controller-view::before{content:"\F0E70"}.mdi-microwave::before{content:"\F0C99"}.mdi-microwave-off::before{content:"\F1423"}.mdi-middleware::before{content:"\F0F5D"}.mdi-middleware-outline::before{content:"\F0F5E"}.mdi-midi::before{content:"\F08F1"}.mdi-midi-port::before{content:"\F08F2"}.mdi-mine::before{content:"\F0DDA"}.mdi-minecraft::before{content:"\F0373"}.mdi-mini-sd::before{content:"\F0A05"}.mdi-minidisc::before{content:"\F0A06"}.mdi-minus::before{content:"\F0374"}.mdi-minus-box::before{content:"\F0375"}.mdi-minus-box-multiple::before{content:"\F1141"}.mdi-minus-box-multiple-outline::before{content:"\F1142"}.mdi-minus-box-outline::before{content:"\F06F2"}.mdi-minus-circle::before{content:"\F0376"}.mdi-minus-circle-multiple::before{content:"\F035A"}.mdi-minus-circle-multiple-outline::before{content:"\F0AD3"}.mdi-minus-circle-off::before{content:"\F1459"}.mdi-minus-circle-off-outline::before{content:"\F145A"}.mdi-minus-circle-outline::before{content:"\F0377"}.mdi-minus-network::before{content:"\F0378"}.mdi-minus-network-outline::before{content:"\F0C9A"}.mdi-minus-thick::before{content:"\F1639"}.mdi-mirror::before{content:"\F11FD"}.mdi-mirror-rectangle::before{content:"\F179F"}.mdi-mirror-variant::before{content:"\F17A0"}.mdi-mixed-martial-arts::before{content:"\F0D8F"}.mdi-mixed-reality::before{content:"\F087F"}.mdi-molecule::before{content:"\F0BAC"}.mdi-molecule-co::before{content:"\F12FE"}.mdi-molecule-co2::before{content:"\F07E4"}.mdi-monitor::before{content:"\F0379"}.mdi-monitor-account::before{content:"\F1A5B"}.mdi-monitor-arrow-down::before{content:"\F19D0"}.mdi-monitor-arrow-down-variant::before{content:"\F19D1"}.mdi-monitor-cellphone::before{content:"\F0989"}.mdi-monitor-cellphone-star::before{content:"\F098A"}.mdi-monitor-dashboard::before{content:"\F0A07"}.mdi-monitor-edit::before{content:"\F12C6"}.mdi-monitor-eye::before{content:"\F13B4"}.mdi-monitor-lock::before{content:"\F0DDB"}.mdi-monitor-multiple::before{content:"\F037A"}.mdi-monitor-off::before{content:"\F0D90"}.mdi-monitor-screenshot::before{content:"\F0E51"}.mdi-monitor-share::before{content:"\F1483"}.mdi-monitor-shimmer::before{content:"\F1104"}.mdi-monitor-small::before{content:"\F1876"}.mdi-monitor-speaker::before{content:"\F0F5F"}.mdi-monitor-speaker-off::before{content:"\F0F60"}.mdi-monitor-star::before{content:"\F0DDC"}.mdi-monitor-vertical::before{content:"\F1C33"}.mdi-moon-first-quarter::before{content:"\F0F61"}.mdi-moon-full::before{content:"\F0F62"}.mdi-moon-last-quarter::before{content:"\F0F63"}.mdi-moon-new::before{content:"\F0F64"}.mdi-moon-waning-crescent::before{content:"\F0F65"}.mdi-moon-waning-gibbous::before{content:"\F0F66"}.mdi-moon-waxing-crescent::before{content:"\F0F67"}.mdi-moon-waxing-gibbous::before{content:"\F0F68"}.mdi-moped::before{content:"\F1086"}.mdi-moped-electric::before{content:"\F15B7"}.mdi-moped-electric-outline::before{content:"\F15B8"}.mdi-moped-outline::before{content:"\F15B9"}.mdi-more::before{content:"\F037B"}.mdi-mortar-pestle::before{content:"\F1748"}.mdi-mortar-pestle-plus::before{content:"\F03F1"}.mdi-mosque::before{content:"\F0D45"}.mdi-mosque-outline::before{content:"\F1827"}.mdi-mother-heart::before{content:"\F1314"}.mdi-mother-nurse::before{content:"\F0D21"}.mdi-motion::before{content:"\F15B2"}.mdi-motion-outline::before{content:"\F15B3"}.mdi-motion-pause::before{content:"\F1590"}.mdi-motion-pause-outline::before{content:"\F1592"}.mdi-motion-play::before{content:"\F158F"}.mdi-motion-play-outline::before{content:"\F1591"}.mdi-motion-sensor::before{content:"\F0D91"}.mdi-motion-sensor-off::before{content:"\F1435"}.mdi-motorbike::before{content:"\F037C"}.mdi-motorbike-electric::before{content:"\F15BA"}.mdi-motorbike-off::before{content:"\F1B16"}.mdi-mouse::before{content:"\F037D"}.mdi-mouse-bluetooth::before{content:"\F098B"}.mdi-mouse-left-click::before{content:"\F1D07"}.mdi-mouse-left-click-outline::before{content:"\F1D08"}.mdi-mouse-move-down::before{content:"\F1550"}.mdi-mouse-move-up::before{content:"\F1551"}.mdi-mouse-move-vertical::before{content:"\F1552"}.mdi-mouse-off::before{content:"\F037E"}.mdi-mouse-outline::before{content:"\F1D09"}.mdi-mouse-right-click::before{content:"\F1D0A"}.mdi-mouse-right-click-outline::before{content:"\F1D0B"}.mdi-mouse-scroll-wheel::before{content:"\F1D0C"}.mdi-mouse-variant::before{content:"\F037F"}.mdi-mouse-variant-off::before{content:"\F0380"}.mdi-move-resize::before{content:"\F0655"}.mdi-move-resize-variant::before{content:"\F0656"}.mdi-movie::before{content:"\F0381"}.mdi-movie-check::before{content:"\F16F3"}.mdi-movie-check-outline::before{content:"\F16F4"}.mdi-movie-cog::before{content:"\F16F5"}.mdi-movie-cog-outline::before{content:"\F16F6"}.mdi-movie-edit::before{content:"\F1122"}.mdi-movie-edit-outline::before{content:"\F1123"}.mdi-movie-filter::before{content:"\F1124"}.mdi-movie-filter-outline::before{content:"\F1125"}.mdi-movie-minus::before{content:"\F16F7"}.mdi-movie-minus-outline::before{content:"\F16F8"}.mdi-movie-off::before{content:"\F16F9"}.mdi-movie-off-outline::before{content:"\F16FA"}.mdi-movie-open::before{content:"\F0FCE"}.mdi-movie-open-check::before{content:"\F16FB"}.mdi-movie-open-check-outline::before{content:"\F16FC"}.mdi-movie-open-cog::before{content:"\F16FD"}.mdi-movie-open-cog-outline::before{content:"\F16FE"}.mdi-movie-open-edit::before{content:"\F16FF"}.mdi-movie-open-edit-outline::before{content:"\F1700"}.mdi-movie-open-minus::before{content:"\F1701"}.mdi-movie-open-minus-outline::before{content:"\F1702"}.mdi-movie-open-off::before{content:"\F1703"}.mdi-movie-open-off-outline::before{content:"\F1704"}.mdi-movie-open-outline::before{content:"\F0FCF"}.mdi-movie-open-play::before{content:"\F1705"}.mdi-movie-open-play-outline::before{content:"\F1706"}.mdi-movie-open-plus::before{content:"\F1707"}.mdi-movie-open-plus-outline::before{content:"\F1708"}.mdi-movie-open-remove::before{content:"\F1709"}.mdi-movie-open-remove-outline::before{content:"\F170A"}.mdi-movie-open-settings::before{content:"\F170B"}.mdi-movie-open-settings-outline::before{content:"\F170C"}.mdi-movie-open-star::before{content:"\F170D"}.mdi-movie-open-star-outline::before{content:"\F170E"}.mdi-movie-outline::before{content:"\F0DDD"}.mdi-movie-play::before{content:"\F170F"}.mdi-movie-play-outline::before{content:"\F1710"}.mdi-movie-plus::before{content:"\F1711"}.mdi-movie-plus-outline::before{content:"\F1712"}.mdi-movie-remove::before{content:"\F1713"}.mdi-movie-remove-outline::before{content:"\F1714"}.mdi-movie-roll::before{content:"\F07DE"}.mdi-movie-search::before{content:"\F11D2"}.mdi-movie-search-outline::before{content:"\F11D3"}.mdi-movie-settings::before{content:"\F1715"}.mdi-movie-settings-outline::before{content:"\F1716"}.mdi-movie-star::before{content:"\F1717"}.mdi-movie-star-outline::before{content:"\F1718"}.mdi-mower::before{content:"\F166F"}.mdi-mower-bag::before{content:"\F1670"}.mdi-mower-bag-on::before{content:"\F1B60"}.mdi-mower-on::before{content:"\F1B5F"}.mdi-muffin::before{content:"\F098C"}.mdi-multicast::before{content:"\F1893"}.mdi-multimedia::before{content:"\F1B97"}.mdi-multiplication::before{content:"\F0382"}.mdi-multiplication-box::before{content:"\F0383"}.mdi-mushroom::before{content:"\F07DF"}.mdi-mushroom-off::before{content:"\F13FA"}.mdi-mushroom-off-outline::before{content:"\F13FB"}.mdi-mushroom-outline::before{content:"\F07E0"}.mdi-music::before{content:"\F075A"}.mdi-music-accidental-double-flat::before{content:"\F0F69"}.mdi-music-accidental-double-sharp::before{content:"\F0F6A"}.mdi-music-accidental-flat::before{content:"\F0F6B"}.mdi-music-accidental-natural::before{content:"\F0F6C"}.mdi-music-accidental-sharp::before{content:"\F0F6D"}.mdi-music-box::before{content:"\F0384"}.mdi-music-box-multiple::before{content:"\F0333"}.mdi-music-box-multiple-outline::before{content:"\F0F04"}.mdi-music-box-outline::before{content:"\F0385"}.mdi-music-circle::before{content:"\F0386"}.mdi-music-circle-outline::before{content:"\F0AD4"}.mdi-music-clef-alto::before{content:"\F0F6E"}.mdi-music-clef-bass::before{content:"\F0F6F"}.mdi-music-clef-treble::before{content:"\F0F70"}.mdi-music-note::before{content:"\F0387"}.mdi-music-note-bluetooth::before{content:"\F05FE"}.mdi-music-note-bluetooth-off::before{content:"\F05FF"}.mdi-music-note-eighth::before{content:"\F0388"}.mdi-music-note-eighth-dotted::before{content:"\F0F71"}.mdi-music-note-half::before{content:"\F0389"}.mdi-music-note-half-dotted::before{content:"\F0F72"}.mdi-music-note-minus::before{content:"\F1B89"}.mdi-music-note-off::before{content:"\F038A"}.mdi-music-note-off-outline::before{content:"\F0F73"}.mdi-music-note-outline::before{content:"\F0F74"}.mdi-music-note-plus::before{content:"\F0DDE"}.mdi-music-note-quarter::before{content:"\F038B"}.mdi-music-note-quarter-dotted::before{content:"\F0F75"}.mdi-music-note-sixteenth::before{content:"\F038C"}.mdi-music-note-sixteenth-dotted::before{content:"\F0F76"}.mdi-music-note-whole::before{content:"\F038D"}.mdi-music-note-whole-dotted::before{content:"\F0F77"}.mdi-music-off::before{content:"\F075B"}.mdi-music-rest-eighth::before{content:"\F0F78"}.mdi-music-rest-half::before{content:"\F0F79"}.mdi-music-rest-quarter::before{content:"\F0F7A"}.mdi-music-rest-sixteenth::before{content:"\F0F7B"}.mdi-music-rest-whole::before{content:"\F0F7C"}.mdi-mustache::before{content:"\F15DE"}.mdi-nail::before{content:"\F0DDF"}.mdi-nas::before{content:"\F08F3"}.mdi-nativescript::before{content:"\F0880"}.mdi-nature::before{content:"\F038E"}.mdi-nature-outline::before{content:"\F1C71"}.mdi-nature-people::before{content:"\F038F"}.mdi-nature-people-outline::before{content:"\F1C72"}.mdi-navigation::before{content:"\F0390"}.mdi-navigation-outline::before{content:"\F1607"}.mdi-navigation-variant::before{content:"\F18F0"}.mdi-navigation-variant-outline::before{content:"\F18F1"}.mdi-near-me::before{content:"\F05CD"}.mdi-necklace::before{content:"\F0F0B"}.mdi-needle::before{content:"\F0391"}.mdi-needle-off::before{content:"\F19D2"}.mdi-netflix::before{content:"\F0746"}.mdi-network::before{content:"\F06F3"}.mdi-network-off::before{content:"\F0C9B"}.mdi-network-off-outline::before{content:"\F0C9C"}.mdi-network-outline::before{content:"\F0C9D"}.mdi-network-pos::before{content:"\F1ACB"}.mdi-network-strength-1::before{content:"\F08F4"}.mdi-network-strength-1-alert::before{content:"\F08F5"}.mdi-network-strength-2::before{content:"\F08F6"}.mdi-network-strength-2-alert::before{content:"\F08F7"}.mdi-network-strength-3::before{content:"\F08F8"}.mdi-network-strength-3-alert::before{content:"\F08F9"}.mdi-network-strength-4::before{content:"\F08FA"}.mdi-network-strength-4-alert::before{content:"\F08FB"}.mdi-network-strength-4-cog::before{content:"\F191A"}.mdi-network-strength-off::before{content:"\F08FC"}.mdi-network-strength-off-outline::before{content:"\F08FD"}.mdi-network-strength-outline::before{content:"\F08FE"}.mdi-new-box::before{content:"\F0394"}.mdi-newspaper::before{content:"\F0395"}.mdi-newspaper-check::before{content:"\F1943"}.mdi-newspaper-minus::before{content:"\F0F0C"}.mdi-newspaper-plus::before{content:"\F0F0D"}.mdi-newspaper-remove::before{content:"\F1944"}.mdi-newspaper-variant::before{content:"\F1001"}.mdi-newspaper-variant-multiple::before{content:"\F1002"}.mdi-newspaper-variant-multiple-outline::before{content:"\F1003"}.mdi-newspaper-variant-outline::before{content:"\F1004"}.mdi-nfc::before{content:"\F0396"}.mdi-nfc-search-variant::before{content:"\F0E53"}.mdi-nfc-tap::before{content:"\F0397"}.mdi-nfc-variant::before{content:"\F0398"}.mdi-nfc-variant-off::before{content:"\F0E54"}.mdi-ninja::before{content:"\F0774"}.mdi-nintendo-game-boy::before{content:"\F1393"}.mdi-nintendo-switch::before{content:"\F07E1"}.mdi-nintendo-wii::before{content:"\F05AB"}.mdi-nintendo-wiiu::before{content:"\F072D"}.mdi-nix::before{content:"\F1105"}.mdi-nodejs::before{content:"\F0399"}.mdi-noodles::before{content:"\F117E"}.mdi-not-equal::before{content:"\F098D"}.mdi-not-equal-variant::before{content:"\F098E"}.mdi-note::before{content:"\F039A"}.mdi-note-alert::before{content:"\F177D"}.mdi-note-alert-outline::before{content:"\F177E"}.mdi-note-check::before{content:"\F177F"}.mdi-note-check-outline::before{content:"\F1780"}.mdi-note-edit::before{content:"\F1781"}.mdi-note-edit-outline::before{content:"\F1782"}.mdi-note-minus::before{content:"\F164F"}.mdi-note-minus-outline::before{content:"\F1650"}.mdi-note-multiple::before{content:"\F06B8"}.mdi-note-multiple-outline::before{content:"\F06B9"}.mdi-note-off::before{content:"\F1783"}.mdi-note-off-outline::before{content:"\F1784"}.mdi-note-outline::before{content:"\F039B"}.mdi-note-plus::before{content:"\F039C"}.mdi-note-plus-outline::before{content:"\F039D"}.mdi-note-remove::before{content:"\F1651"}.mdi-note-remove-outline::before{content:"\F1652"}.mdi-note-search::before{content:"\F1653"}.mdi-note-search-outline::before{content:"\F1654"}.mdi-note-text::before{content:"\F039E"}.mdi-note-text-outline::before{content:"\F11D7"}.mdi-notebook::before{content:"\F082E"}.mdi-notebook-check::before{content:"\F14F5"}.mdi-notebook-check-outline::before{content:"\F14F6"}.mdi-notebook-edit::before{content:"\F14E7"}.mdi-notebook-edit-outline::before{content:"\F14E9"}.mdi-notebook-heart::before{content:"\F1A0B"}.mdi-notebook-heart-outline::before{content:"\F1A0C"}.mdi-notebook-minus::before{content:"\F1610"}.mdi-notebook-minus-outline::before{content:"\F1611"}.mdi-notebook-multiple::before{content:"\F0E55"}.mdi-notebook-outline::before{content:"\F0EBF"}.mdi-notebook-plus::before{content:"\F1612"}.mdi-notebook-plus-outline::before{content:"\F1613"}.mdi-notebook-remove::before{content:"\F1614"}.mdi-notebook-remove-outline::before{content:"\F1615"}.mdi-notification-clear-all::before{content:"\F039F"}.mdi-npm::before{content:"\F06F7"}.mdi-nuke::before{content:"\F06A4"}.mdi-null::before{content:"\F07E2"}.mdi-numeric::before{content:"\F03A0"}.mdi-numeric-0::before{content:"\F0B39"}.mdi-numeric-0-box::before{content:"\F03A1"}.mdi-numeric-0-box-multiple::before{content:"\F0F0E"}.mdi-numeric-0-box-multiple-outline::before{content:"\F03A2"}.mdi-numeric-0-box-outline::before{content:"\F03A3"}.mdi-numeric-0-circle::before{content:"\F0C9E"}.mdi-numeric-0-circle-outline::before{content:"\F0C9F"}.mdi-numeric-1::before{content:"\F0B3A"}.mdi-numeric-1-box::before{content:"\F03A4"}.mdi-numeric-1-box-multiple::before{content:"\F0F0F"}.mdi-numeric-1-box-multiple-outline::before{content:"\F03A5"}.mdi-numeric-1-box-outline::before{content:"\F03A6"}.mdi-numeric-1-circle::before{content:"\F0CA0"}.mdi-numeric-1-circle-outline::before{content:"\F0CA1"}.mdi-numeric-10::before{content:"\F0FE9"}.mdi-numeric-10-box::before{content:"\F0F7D"}.mdi-numeric-10-box-multiple::before{content:"\F0FEA"}.mdi-numeric-10-box-multiple-outline::before{content:"\F0FEB"}.mdi-numeric-10-box-outline::before{content:"\F0F7E"}.mdi-numeric-10-circle::before{content:"\F0FEC"}.mdi-numeric-10-circle-outline::before{content:"\F0FED"}.mdi-numeric-2::before{content:"\F0B3B"}.mdi-numeric-2-box::before{content:"\F03A7"}.mdi-numeric-2-box-multiple::before{content:"\F0F10"}.mdi-numeric-2-box-multiple-outline::before{content:"\F03A8"}.mdi-numeric-2-box-outline::before{content:"\F03A9"}.mdi-numeric-2-circle::before{content:"\F0CA2"}.mdi-numeric-2-circle-outline::before{content:"\F0CA3"}.mdi-numeric-3::before{content:"\F0B3C"}.mdi-numeric-3-box::before{content:"\F03AA"}.mdi-numeric-3-box-multiple::before{content:"\F0F11"}.mdi-numeric-3-box-multiple-outline::before{content:"\F03AB"}.mdi-numeric-3-box-outline::before{content:"\F03AC"}.mdi-numeric-3-circle::before{content:"\F0CA4"}.mdi-numeric-3-circle-outline::before{content:"\F0CA5"}.mdi-numeric-4::before{content:"\F0B3D"}.mdi-numeric-4-box::before{content:"\F03AD"}.mdi-numeric-4-box-multiple::before{content:"\F0F12"}.mdi-numeric-4-box-multiple-outline::before{content:"\F03B2"}.mdi-numeric-4-box-outline::before{content:"\F03AE"}.mdi-numeric-4-circle::before{content:"\F0CA6"}.mdi-numeric-4-circle-outline::before{content:"\F0CA7"}.mdi-numeric-5::before{content:"\F0B3E"}.mdi-numeric-5-box::before{content:"\F03B1"}.mdi-numeric-5-box-multiple::before{content:"\F0F13"}.mdi-numeric-5-box-multiple-outline::before{content:"\F03AF"}.mdi-numeric-5-box-outline::before{content:"\F03B0"}.mdi-numeric-5-circle::before{content:"\F0CA8"}.mdi-numeric-5-circle-outline::before{content:"\F0CA9"}.mdi-numeric-6::before{content:"\F0B3F"}.mdi-numeric-6-box::before{content:"\F03B3"}.mdi-numeric-6-box-multiple::before{content:"\F0F14"}.mdi-numeric-6-box-multiple-outline::before{content:"\F03B4"}.mdi-numeric-6-box-outline::before{content:"\F03B5"}.mdi-numeric-6-circle::before{content:"\F0CAA"}.mdi-numeric-6-circle-outline::before{content:"\F0CAB"}.mdi-numeric-7::before{content:"\F0B40"}.mdi-numeric-7-box::before{content:"\F03B6"}.mdi-numeric-7-box-multiple::before{content:"\F0F15"}.mdi-numeric-7-box-multiple-outline::before{content:"\F03B7"}.mdi-numeric-7-box-outline::before{content:"\F03B8"}.mdi-numeric-7-circle::before{content:"\F0CAC"}.mdi-numeric-7-circle-outline::before{content:"\F0CAD"}.mdi-numeric-8::before{content:"\F0B41"}.mdi-numeric-8-box::before{content:"\F03B9"}.mdi-numeric-8-box-multiple::before{content:"\F0F16"}.mdi-numeric-8-box-multiple-outline::before{content:"\F03BA"}.mdi-numeric-8-box-outline::before{content:"\F03BB"}.mdi-numeric-8-circle::before{content:"\F0CAE"}.mdi-numeric-8-circle-outline::before{content:"\F0CAF"}.mdi-numeric-9::before{content:"\F0B42"}.mdi-numeric-9-box::before{content:"\F03BC"}.mdi-numeric-9-box-multiple::before{content:"\F0F17"}.mdi-numeric-9-box-multiple-outline::before{content:"\F03BD"}.mdi-numeric-9-box-outline::before{content:"\F03BE"}.mdi-numeric-9-circle::before{content:"\F0CB0"}.mdi-numeric-9-circle-outline::before{content:"\F0CB1"}.mdi-numeric-9-plus::before{content:"\F0FEE"}.mdi-numeric-9-plus-box::before{content:"\F03BF"}.mdi-numeric-9-plus-box-multiple::before{content:"\F0F18"}.mdi-numeric-9-plus-box-multiple-outline::before{content:"\F03C0"}.mdi-numeric-9-plus-box-outline::before{content:"\F03C1"}.mdi-numeric-9-plus-circle::before{content:"\F0CB2"}.mdi-numeric-9-plus-circle-outline::before{content:"\F0CB3"}.mdi-numeric-negative-1::before{content:"\F1052"}.mdi-numeric-off::before{content:"\F19D3"}.mdi-numeric-positive-1::before{content:"\F15CB"}.mdi-nut::before{content:"\F06F8"}.mdi-nutrition::before{content:"\F03C2"}.mdi-nuxt::before{content:"\F1106"}.mdi-oar::before{content:"\F067C"}.mdi-ocarina::before{content:"\F0DE0"}.mdi-oci::before{content:"\F12E9"}.mdi-ocr::before{content:"\F113A"}.mdi-octagon::before{content:"\F03C3"}.mdi-octagon-outline::before{content:"\F03C4"}.mdi-octagram::before{content:"\F06F9"}.mdi-octagram-edit::before{content:"\F1C34"}.mdi-octagram-edit-outline::before{content:"\F1C35"}.mdi-octagram-minus::before{content:"\F1C36"}.mdi-octagram-minus-outline::before{content:"\F1C37"}.mdi-octagram-outline::before{content:"\F0775"}.mdi-octagram-plus::before{content:"\F1C38"}.mdi-octagram-plus-outline::before{content:"\F1C39"}.mdi-octahedron::before{content:"\F1950"}.mdi-octahedron-off::before{content:"\F1951"}.mdi-odnoklassniki::before{content:"\F03C5"}.mdi-offer::before{content:"\F121B"}.mdi-office-building::before{content:"\F0991"}.mdi-office-building-cog::before{content:"\F1949"}.mdi-office-building-cog-outline::before{content:"\F194A"}.mdi-office-building-marker::before{content:"\F1520"}.mdi-office-building-marker-outline::before{content:"\F1521"}.mdi-office-building-minus::before{content:"\F1BAA"}.mdi-office-building-minus-outline::before{content:"\F1BAB"}.mdi-office-building-outline::before{content:"\F151F"}.mdi-office-building-plus::before{content:"\F1BA8"}.mdi-office-building-plus-outline::before{content:"\F1BA9"}.mdi-office-building-remove::before{content:"\F1BAC"}.mdi-office-building-remove-outline::before{content:"\F1BAD"}.mdi-oil::before{content:"\F03C7"}.mdi-oil-lamp::before{content:"\F0F19"}.mdi-oil-level::before{content:"\F1053"}.mdi-oil-temperature::before{content:"\F0FF8"}.mdi-om::before{content:"\F0973"}.mdi-omega::before{content:"\F03C9"}.mdi-one-up::before{content:"\F0BAD"}.mdi-onepassword::before{content:"\F0881"}.mdi-opacity::before{content:"\F05CC"}.mdi-open-in-app::before{content:"\F03CB"}.mdi-open-in-new::before{content:"\F03CC"}.mdi-open-source-initiative::before{content:"\F0BAE"}.mdi-openid::before{content:"\F03CD"}.mdi-opera::before{content:"\F03CE"}.mdi-orbit::before{content:"\F0018"}.mdi-orbit-variant::before{content:"\F15DB"}.mdi-order-alphabetical-ascending::before{content:"\F020D"}.mdi-order-alphabetical-descending::before{content:"\F0D07"}.mdi-order-bool-ascending::before{content:"\F02BE"}.mdi-order-bool-ascending-variant::before{content:"\F098F"}.mdi-order-bool-descending::before{content:"\F1384"}.mdi-order-bool-descending-variant::before{content:"\F0990"}.mdi-order-numeric-ascending::before{content:"\F0545"}.mdi-order-numeric-descending::before{content:"\F0546"}.mdi-origin::before{content:"\F0B43"}.mdi-ornament::before{content:"\F03CF"}.mdi-ornament-variant::before{content:"\F03D0"}.mdi-outdoor-lamp::before{content:"\F1054"}.mdi-overscan::before{content:"\F1005"}.mdi-owl::before{content:"\F03D2"}.mdi-pac-man::before{content:"\F0BAF"}.mdi-package::before{content:"\F03D3"}.mdi-package-check::before{content:"\F1B51"}.mdi-package-down::before{content:"\F03D4"}.mdi-package-up::before{content:"\F03D5"}.mdi-package-variant::before{content:"\F03D6"}.mdi-package-variant-closed::before{content:"\F03D7"}.mdi-package-variant-closed-check::before{content:"\F1B52"}.mdi-package-variant-closed-minus::before{content:"\F19D4"}.mdi-package-variant-closed-plus::before{content:"\F19D5"}.mdi-package-variant-closed-remove::before{content:"\F19D6"}.mdi-package-variant-minus::before{content:"\F19D7"}.mdi-package-variant-plus::before{content:"\F19D8"}.mdi-package-variant-remove::before{content:"\F19D9"}.mdi-page-first::before{content:"\F0600"}.mdi-page-last::before{content:"\F0601"}.mdi-page-layout-body::before{content:"\F06FA"}.mdi-page-layout-footer::before{content:"\F06FB"}.mdi-page-layout-header::before{content:"\F06FC"}.mdi-page-layout-header-footer::before{content:"\F0F7F"}.mdi-page-layout-sidebar-left::before{content:"\F06FD"}.mdi-page-layout-sidebar-right::before{content:"\F06FE"}.mdi-page-next::before{content:"\F0BB0"}.mdi-page-next-outline::before{content:"\F0BB1"}.mdi-page-previous::before{content:"\F0BB2"}.mdi-page-previous-outline::before{content:"\F0BB3"}.mdi-pail::before{content:"\F1417"}.mdi-pail-minus::before{content:"\F1437"}.mdi-pail-minus-outline::before{content:"\F143C"}.mdi-pail-off::before{content:"\F1439"}.mdi-pail-off-outline::before{content:"\F143E"}.mdi-pail-outline::before{content:"\F143A"}.mdi-pail-plus::before{content:"\F1436"}.mdi-pail-plus-outline::before{content:"\F143B"}.mdi-pail-remove::before{content:"\F1438"}.mdi-pail-remove-outline::before{content:"\F143D"}.mdi-palette::before{content:"\F03D8"}.mdi-palette-advanced::before{content:"\F03D9"}.mdi-palette-outline::before{content:"\F0E0C"}.mdi-palette-swatch::before{content:"\F08B5"}.mdi-palette-swatch-outline::before{content:"\F135C"}.mdi-palette-swatch-variant::before{content:"\F195A"}.mdi-palm-tree::before{content:"\F1055"}.mdi-pan::before{content:"\F0BB4"}.mdi-pan-bottom-left::before{content:"\F0BB5"}.mdi-pan-bottom-right::before{content:"\F0BB6"}.mdi-pan-down::before{content:"\F0BB7"}.mdi-pan-horizontal::before{content:"\F0BB8"}.mdi-pan-left::before{content:"\F0BB9"}.mdi-pan-right::before{content:"\F0BBA"}.mdi-pan-top-left::before{content:"\F0BBB"}.mdi-pan-top-right::before{content:"\F0BBC"}.mdi-pan-up::before{content:"\F0BBD"}.mdi-pan-vertical::before{content:"\F0BBE"}.mdi-panda::before{content:"\F03DA"}.mdi-pandora::before{content:"\F03DB"}.mdi-panorama::before{content:"\F03DC"}.mdi-panorama-fisheye::before{content:"\F03DD"}.mdi-panorama-horizontal::before{content:"\F1928"}.mdi-panorama-horizontal-outline::before{content:"\F03DE"}.mdi-panorama-outline::before{content:"\F198C"}.mdi-panorama-sphere::before{content:"\F198D"}.mdi-panorama-sphere-outline::before{content:"\F198E"}.mdi-panorama-variant::before{content:"\F198F"}.mdi-panorama-variant-outline::before{content:"\F1990"}.mdi-panorama-vertical::before{content:"\F1929"}.mdi-panorama-vertical-outline::before{content:"\F03DF"}.mdi-panorama-wide-angle::before{content:"\F195F"}.mdi-panorama-wide-angle-outline::before{content:"\F03E0"}.mdi-paper-cut-vertical::before{content:"\F03E1"}.mdi-paper-roll::before{content:"\F1157"}.mdi-paper-roll-outline::before{content:"\F1158"}.mdi-paperclip::before{content:"\F03E2"}.mdi-paperclip-check::before{content:"\F1AC6"}.mdi-paperclip-lock::before{content:"\F19DA"}.mdi-paperclip-minus::before{content:"\F1AC7"}.mdi-paperclip-off::before{content:"\F1AC8"}.mdi-paperclip-plus::before{content:"\F1AC9"}.mdi-paperclip-remove::before{content:"\F1ACA"}.mdi-parachute::before{content:"\F0CB4"}.mdi-parachute-outline::before{content:"\F0CB5"}.mdi-paragliding::before{content:"\F1745"}.mdi-parking::before{content:"\F03E3"}.mdi-party-popper::before{content:"\F1056"}.mdi-passport::before{content:"\F07E3"}.mdi-passport-alert::before{content:"\F1CB8"}.mdi-passport-biometric::before{content:"\F0DE1"}.mdi-passport-cancel::before{content:"\F1CB9"}.mdi-passport-check::before{content:"\F1CBA"}.mdi-passport-minus::before{content:"\F1CBB"}.mdi-passport-plus::before{content:"\F1CBC"}.mdi-passport-remove::before{content:"\F1CBD"}.mdi-pasta::before{content:"\F1160"}.mdi-patio-heater::before{content:"\F0F80"}.mdi-patreon::before{content:"\F0882"}.mdi-pause::before{content:"\F03E4"}.mdi-pause-box::before{content:"\F00BC"}.mdi-pause-box-outline::before{content:"\F1B7A"}.mdi-pause-circle::before{content:"\F03E5"}.mdi-pause-circle-outline::before{content:"\F03E6"}.mdi-pause-octagon::before{content:"\F03E7"}.mdi-pause-octagon-outline::before{content:"\F03E8"}.mdi-paw::before{content:"\F03E9"}.mdi-paw-off::before{content:"\F0657"}.mdi-paw-off-outline::before{content:"\F1676"}.mdi-paw-outline::before{content:"\F1675"}.mdi-peace::before{content:"\F0884"}.mdi-peanut::before{content:"\F0FFC"}.mdi-peanut-off::before{content:"\F0FFD"}.mdi-peanut-off-outline::before{content:"\F0FFF"}.mdi-peanut-outline::before{content:"\F0FFE"}.mdi-pen::before{content:"\F03EA"}.mdi-pen-lock::before{content:"\F0DE2"}.mdi-pen-minus::before{content:"\F0DE3"}.mdi-pen-off::before{content:"\F0DE4"}.mdi-pen-plus::before{content:"\F0DE5"}.mdi-pen-remove::before{content:"\F0DE6"}.mdi-pencil::before{content:"\F03EB"}.mdi-pencil-box::before{content:"\F03EC"}.mdi-pencil-box-multiple::before{content:"\F1144"}.mdi-pencil-box-multiple-outline::before{content:"\F1145"}.mdi-pencil-box-outline::before{content:"\F03ED"}.mdi-pencil-circle::before{content:"\F06FF"}.mdi-pencil-circle-outline::before{content:"\F0776"}.mdi-pencil-lock::before{content:"\F03EE"}.mdi-pencil-lock-outline::before{content:"\F0DE7"}.mdi-pencil-minus::before{content:"\F0DE8"}.mdi-pencil-minus-outline::before{content:"\F0DE9"}.mdi-pencil-off::before{content:"\F03EF"}.mdi-pencil-off-outline::before{content:"\F0DEA"}.mdi-pencil-outline::before{content:"\F0CB6"}.mdi-pencil-plus::before{content:"\F0DEB"}.mdi-pencil-plus-outline::before{content:"\F0DEC"}.mdi-pencil-remove::before{content:"\F0DED"}.mdi-pencil-remove-outline::before{content:"\F0DEE"}.mdi-pencil-ruler::before{content:"\F1353"}.mdi-pencil-ruler-outline::before{content:"\F1C11"}.mdi-penguin::before{content:"\F0EC0"}.mdi-pentagon::before{content:"\F0701"}.mdi-pentagon-outline::before{content:"\F0700"}.mdi-pentagram::before{content:"\F1667"}.mdi-percent::before{content:"\F03F0"}.mdi-percent-box::before{content:"\F1A02"}.mdi-percent-box-outline::before{content:"\F1A03"}.mdi-percent-circle::before{content:"\F1A04"}.mdi-percent-circle-outline::before{content:"\F1A05"}.mdi-percent-outline::before{content:"\F1278"}.mdi-periodic-table::before{content:"\F08B6"}.mdi-perspective-less::before{content:"\F0D23"}.mdi-perspective-more::before{content:"\F0D24"}.mdi-ph::before{content:"\F17C5"}.mdi-phone::before{content:"\F03F2"}.mdi-phone-alert::before{content:"\F0F1A"}.mdi-phone-alert-outline::before{content:"\F118E"}.mdi-phone-bluetooth::before{content:"\F03F3"}.mdi-phone-bluetooth-outline::before{content:"\F118F"}.mdi-phone-cancel::before{content:"\F10BC"}.mdi-phone-cancel-outline::before{content:"\F1190"}.mdi-phone-check::before{content:"\F11A9"}.mdi-phone-check-outline::before{content:"\F11AA"}.mdi-phone-classic::before{content:"\F0602"}.mdi-phone-classic-off::before{content:"\F1279"}.mdi-phone-clock::before{content:"\F19DB"}.mdi-phone-dial::before{content:"\F1559"}.mdi-phone-dial-outline::before{content:"\F155A"}.mdi-phone-forward::before{content:"\F03F4"}.mdi-phone-forward-outline::before{content:"\F1191"}.mdi-phone-hangup::before{content:"\F03F5"}.mdi-phone-hangup-outline::before{content:"\F1192"}.mdi-phone-in-talk::before{content:"\F03F6"}.mdi-phone-in-talk-outline::before{content:"\F1182"}.mdi-phone-incoming::before{content:"\F03F7"}.mdi-phone-incoming-outgoing::before{content:"\F1B3F"}.mdi-phone-incoming-outgoing-outline::before{content:"\F1B40"}.mdi-phone-incoming-outline::before{content:"\F1193"}.mdi-phone-lock::before{content:"\F03F8"}.mdi-phone-lock-outline::before{content:"\F1194"}.mdi-phone-log::before{content:"\F03F9"}.mdi-phone-log-outline::before{content:"\F1195"}.mdi-phone-message::before{content:"\F1196"}.mdi-phone-message-outline::before{content:"\F1197"}.mdi-phone-minus::before{content:"\F0658"}.mdi-phone-minus-outline::before{content:"\F1198"}.mdi-phone-missed::before{content:"\F03FA"}.mdi-phone-missed-outline::before{content:"\F11A5"}.mdi-phone-off::before{content:"\F0DEF"}.mdi-phone-off-outline::before{content:"\F11A6"}.mdi-phone-outgoing::before{content:"\F03FB"}.mdi-phone-outgoing-outline::before{content:"\F1199"}.mdi-phone-outline::before{content:"\F0DF0"}.mdi-phone-paused::before{content:"\F03FC"}.mdi-phone-paused-outline::before{content:"\F119A"}.mdi-phone-plus::before{content:"\F0659"}.mdi-phone-plus-outline::before{content:"\F119B"}.mdi-phone-refresh::before{content:"\F1993"}.mdi-phone-refresh-outline::before{content:"\F1994"}.mdi-phone-remove::before{content:"\F152F"}.mdi-phone-remove-outline::before{content:"\F1530"}.mdi-phone-return::before{content:"\F082F"}.mdi-phone-return-outline::before{content:"\F119C"}.mdi-phone-ring::before{content:"\F11AB"}.mdi-phone-ring-outline::before{content:"\F11AC"}.mdi-phone-rotate-landscape::before{content:"\F0885"}.mdi-phone-rotate-portrait::before{content:"\F0886"}.mdi-phone-settings::before{content:"\F03FD"}.mdi-phone-settings-outline::before{content:"\F119D"}.mdi-phone-sync::before{content:"\F1995"}.mdi-phone-sync-outline::before{content:"\F1996"}.mdi-phone-voip::before{content:"\F03FE"}.mdi-pi::before{content:"\F03FF"}.mdi-pi-box::before{content:"\F0400"}.mdi-pi-hole::before{content:"\F0DF1"}.mdi-piano::before{content:"\F067D"}.mdi-piano-off::before{content:"\F0698"}.mdi-pickaxe::before{content:"\F08B7"}.mdi-picture-in-picture-bottom-right::before{content:"\F0E57"}.mdi-picture-in-picture-bottom-right-outline::before{content:"\F0E58"}.mdi-picture-in-picture-top-right::before{content:"\F0E59"}.mdi-picture-in-picture-top-right-outline::before{content:"\F0E5A"}.mdi-pier::before{content:"\F0887"}.mdi-pier-crane::before{content:"\F0888"}.mdi-pig::before{content:"\F0401"}.mdi-pig-variant::before{content:"\F1006"}.mdi-pig-variant-outline::before{content:"\F1678"}.mdi-piggy-bank::before{content:"\F1007"}.mdi-piggy-bank-outline::before{content:"\F1679"}.mdi-pill::before{content:"\F0402"}.mdi-pill-multiple::before{content:"\F1B4C"}.mdi-pill-off::before{content:"\F1A5C"}.mdi-pillar::before{content:"\F0702"}.mdi-pin::before{content:"\F0403"}.mdi-pin-off::before{content:"\F0404"}.mdi-pin-off-outline::before{content:"\F0930"}.mdi-pin-outline::before{content:"\F0931"}.mdi-pine-tree::before{content:"\F0405"}.mdi-pine-tree-box::before{content:"\F0406"}.mdi-pine-tree-fire::before{content:"\F141A"}.mdi-pine-tree-variant::before{content:"\F1C73"}.mdi-pine-tree-variant-outline::before{content:"\F1C74"}.mdi-pinterest::before{content:"\F0407"}.mdi-pinwheel::before{content:"\F0AD5"}.mdi-pinwheel-outline::before{content:"\F0AD6"}.mdi-pipe::before{content:"\F07E5"}.mdi-pipe-disconnected::before{content:"\F07E6"}.mdi-pipe-leak::before{content:"\F0889"}.mdi-pipe-valve::before{content:"\F184D"}.mdi-pipe-wrench::before{content:"\F1354"}.mdi-pirate::before{content:"\F0A08"}.mdi-pistol::before{content:"\F0703"}.mdi-piston::before{content:"\F088A"}.mdi-pitchfork::before{content:"\F1553"}.mdi-pizza::before{content:"\F0409"}.mdi-plane-car::before{content:"\F1AFF"}.mdi-plane-train::before{content:"\F1B00"}.mdi-play::before{content:"\F040A"}.mdi-play-box::before{content:"\F127A"}.mdi-play-box-edit-outline::before{content:"\F1C3A"}.mdi-play-box-lock::before{content:"\F1A16"}.mdi-play-box-lock-open::before{content:"\F1A17"}.mdi-play-box-lock-open-outline::before{content:"\F1A18"}.mdi-play-box-lock-outline::before{content:"\F1A19"}.mdi-play-box-multiple::before{content:"\F0D19"}.mdi-play-box-multiple-outline::before{content:"\F13E6"}.mdi-play-box-outline::before{content:"\F040B"}.mdi-play-circle::before{content:"\F040C"}.mdi-play-circle-outline::before{content:"\F040D"}.mdi-play-network::before{content:"\F088B"}.mdi-play-network-outline::before{content:"\F0CB7"}.mdi-play-outline::before{content:"\F0F1B"}.mdi-play-pause::before{content:"\F040E"}.mdi-play-protected-content::before{content:"\F040F"}.mdi-play-speed::before{content:"\F08FF"}.mdi-playlist-check::before{content:"\F05C7"}.mdi-playlist-edit::before{content:"\F0900"}.mdi-playlist-minus::before{content:"\F0410"}.mdi-playlist-music::before{content:"\F0CB8"}.mdi-playlist-music-outline::before{content:"\F0CB9"}.mdi-playlist-play::before{content:"\F0411"}.mdi-playlist-plus::before{content:"\F0412"}.mdi-playlist-remove::before{content:"\F0413"}.mdi-playlist-star::before{content:"\F0DF2"}.mdi-plex::before{content:"\F06BA"}.mdi-pliers::before{content:"\F19A4"}.mdi-plus::before{content:"\F0415"}.mdi-plus-box::before{content:"\F0416"}.mdi-plus-box-multiple::before{content:"\F0334"}.mdi-plus-box-multiple-outline::before{content:"\F1143"}.mdi-plus-box-outline::before{content:"\F0704"}.mdi-plus-circle::before{content:"\F0417"}.mdi-plus-circle-multiple::before{content:"\F034C"}.mdi-plus-circle-multiple-outline::before{content:"\F0418"}.mdi-plus-circle-outline::before{content:"\F0419"}.mdi-plus-lock::before{content:"\F1A5D"}.mdi-plus-lock-open::before{content:"\F1A5E"}.mdi-plus-minus::before{content:"\F0992"}.mdi-plus-minus-box::before{content:"\F0993"}.mdi-plus-minus-variant::before{content:"\F14C9"}.mdi-plus-network::before{content:"\F041A"}.mdi-plus-network-outline::before{content:"\F0CBA"}.mdi-plus-outline::before{content:"\F0705"}.mdi-plus-thick::before{content:"\F11EC"}.mdi-pocket::before{content:"\F1CBE"}.mdi-podcast::before{content:"\F0994"}.mdi-podium::before{content:"\F0D25"}.mdi-podium-bronze::before{content:"\F0D26"}.mdi-podium-gold::before{content:"\F0D27"}.mdi-podium-silver::before{content:"\F0D28"}.mdi-point-of-sale::before{content:"\F0D92"}.mdi-pokeball::before{content:"\F041D"}.mdi-pokemon-go::before{content:"\F0A09"}.mdi-poker-chip::before{content:"\F0830"}.mdi-polaroid::before{content:"\F041E"}.mdi-police-badge::before{content:"\F1167"}.mdi-police-badge-outline::before{content:"\F1168"}.mdi-police-station::before{content:"\F1839"}.mdi-poll::before{content:"\F041F"}.mdi-polo::before{content:"\F14C3"}.mdi-polymer::before{content:"\F0421"}.mdi-pool::before{content:"\F0606"}.mdi-pool-thermometer::before{content:"\F1A5F"}.mdi-popcorn::before{content:"\F0422"}.mdi-post::before{content:"\F1008"}.mdi-post-lamp::before{content:"\F1A60"}.mdi-post-outline::before{content:"\F1009"}.mdi-postage-stamp::before{content:"\F0CBB"}.mdi-pot::before{content:"\F02E5"}.mdi-pot-mix::before{content:"\F065B"}.mdi-pot-mix-outline::before{content:"\F0677"}.mdi-pot-outline::before{content:"\F02FF"}.mdi-pot-steam::before{content:"\F065A"}.mdi-pot-steam-outline::before{content:"\F0326"}.mdi-pound::before{content:"\F0423"}.mdi-pound-box::before{content:"\F0424"}.mdi-pound-box-outline::before{content:"\F117F"}.mdi-power::before{content:"\F0425"}.mdi-power-cycle::before{content:"\F0901"}.mdi-power-off::before{content:"\F0902"}.mdi-power-on::before{content:"\F0903"}.mdi-power-plug::before{content:"\F06A5"}.mdi-power-plug-battery::before{content:"\F1C3B"}.mdi-power-plug-battery-outline::before{content:"\F1C3C"}.mdi-power-plug-off::before{content:"\F06A6"}.mdi-power-plug-off-outline::before{content:"\F1424"}.mdi-power-plug-outline::before{content:"\F1425"}.mdi-power-settings::before{content:"\F0426"}.mdi-power-sleep::before{content:"\F0904"}.mdi-power-socket::before{content:"\F0427"}.mdi-power-socket-au::before{content:"\F0905"}.mdi-power-socket-ch::before{content:"\F0FB3"}.mdi-power-socket-de::before{content:"\F1107"}.mdi-power-socket-eu::before{content:"\F07E7"}.mdi-power-socket-fr::before{content:"\F1108"}.mdi-power-socket-it::before{content:"\F14FF"}.mdi-power-socket-jp::before{content:"\F1109"}.mdi-power-socket-uk::before{content:"\F07E8"}.mdi-power-socket-us::before{content:"\F07E9"}.mdi-power-standby::before{content:"\F0906"}.mdi-powershell::before{content:"\F0A0A"}.mdi-prescription::before{content:"\F0706"}.mdi-presentation::before{content:"\F0428"}.mdi-presentation-play::before{content:"\F0429"}.mdi-pretzel::before{content:"\F1562"}.mdi-printer::before{content:"\F042A"}.mdi-printer-3d::before{content:"\F042B"}.mdi-printer-3d-nozzle::before{content:"\F0E5B"}.mdi-printer-3d-nozzle-alert::before{content:"\F11C0"}.mdi-printer-3d-nozzle-alert-outline::before{content:"\F11C1"}.mdi-printer-3d-nozzle-heat::before{content:"\F18B8"}.mdi-printer-3d-nozzle-heat-outline::before{content:"\F18B9"}.mdi-printer-3d-nozzle-off::before{content:"\F1B19"}.mdi-printer-3d-nozzle-off-outline::before{content:"\F1B1A"}.mdi-printer-3d-nozzle-outline::before{content:"\F0E5C"}.mdi-printer-3d-off::before{content:"\F1B0E"}.mdi-printer-alert::before{content:"\F042C"}.mdi-printer-check::before{content:"\F1146"}.mdi-printer-eye::before{content:"\F1458"}.mdi-printer-off::before{content:"\F0E5D"}.mdi-printer-off-outline::before{content:"\F1785"}.mdi-printer-outline::before{content:"\F1786"}.mdi-printer-pos::before{content:"\F1057"}.mdi-printer-pos-alert::before{content:"\F1BBC"}.mdi-printer-pos-alert-outline::before{content:"\F1BBD"}.mdi-printer-pos-cancel::before{content:"\F1BBE"}.mdi-printer-pos-cancel-outline::before{content:"\F1BBF"}.mdi-printer-pos-check::before{content:"\F1BC0"}.mdi-printer-pos-check-outline::before{content:"\F1BC1"}.mdi-printer-pos-cog::before{content:"\F1BC2"}.mdi-printer-pos-cog-outline::before{content:"\F1BC3"}.mdi-printer-pos-edit::before{content:"\F1BC4"}.mdi-printer-pos-edit-outline::before{content:"\F1BC5"}.mdi-printer-pos-minus::before{content:"\F1BC6"}.mdi-printer-pos-minus-outline::before{content:"\F1BC7"}.mdi-printer-pos-network::before{content:"\F1BC8"}.mdi-printer-pos-network-outline::before{content:"\F1BC9"}.mdi-printer-pos-off::before{content:"\F1BCA"}.mdi-printer-pos-off-outline::before{content:"\F1BCB"}.mdi-printer-pos-outline::before{content:"\F1BCC"}.mdi-printer-pos-pause::before{content:"\F1BCD"}.mdi-printer-pos-pause-outline::before{content:"\F1BCE"}.mdi-printer-pos-play::before{content:"\F1BCF"}.mdi-printer-pos-play-outline::before{content:"\F1BD0"}.mdi-printer-pos-plus::before{content:"\F1BD1"}.mdi-printer-pos-plus-outline::before{content:"\F1BD2"}.mdi-printer-pos-refresh::before{content:"\F1BD3"}.mdi-printer-pos-refresh-outline::before{content:"\F1BD4"}.mdi-printer-pos-remove::before{content:"\F1BD5"}.mdi-printer-pos-remove-outline::before{content:"\F1BD6"}.mdi-printer-pos-star::before{content:"\F1BD7"}.mdi-printer-pos-star-outline::before{content:"\F1BD8"}.mdi-printer-pos-stop::before{content:"\F1BD9"}.mdi-printer-pos-stop-outline::before{content:"\F1BDA"}.mdi-printer-pos-sync::before{content:"\F1BDB"}.mdi-printer-pos-sync-outline::before{content:"\F1BDC"}.mdi-printer-pos-wrench::before{content:"\F1BDD"}.mdi-printer-pos-wrench-outline::before{content:"\F1BDE"}.mdi-printer-search::before{content:"\F1457"}.mdi-printer-settings::before{content:"\F0707"}.mdi-printer-wireless::before{content:"\F0A0B"}.mdi-priority-high::before{content:"\F0603"}.mdi-priority-low::before{content:"\F0604"}.mdi-professional-hexagon::before{content:"\F042D"}.mdi-progress-alert::before{content:"\F0CBC"}.mdi-progress-check::before{content:"\F0995"}.mdi-progress-clock::before{content:"\F0996"}.mdi-progress-close::before{content:"\F110A"}.mdi-progress-download::before{content:"\F0997"}.mdi-progress-helper::before{content:"\F1BA2"}.mdi-progress-pencil::before{content:"\F1787"}.mdi-progress-question::before{content:"\F1522"}.mdi-progress-star::before{content:"\F1788"}.mdi-progress-star-four-points::before{content:"\F1C3D"}.mdi-progress-tag::before{content:"\F1D0D"}.mdi-progress-upload::before{content:"\F0998"}.mdi-progress-wrench::before{content:"\F0CBD"}.mdi-projector::before{content:"\F042E"}.mdi-projector-off::before{content:"\F1A23"}.mdi-projector-screen::before{content:"\F042F"}.mdi-projector-screen-off::before{content:"\F180D"}.mdi-projector-screen-off-outline::before{content:"\F180E"}.mdi-projector-screen-outline::before{content:"\F1724"}.mdi-projector-screen-variant::before{content:"\F180F"}.mdi-projector-screen-variant-off::before{content:"\F1810"}.mdi-projector-screen-variant-off-outline::before{content:"\F1811"}.mdi-projector-screen-variant-outline::before{content:"\F1812"}.mdi-propane-tank::before{content:"\F1357"}.mdi-propane-tank-outline::before{content:"\F1358"}.mdi-protocol::before{content:"\F0FD8"}.mdi-publish::before{content:"\F06A7"}.mdi-publish-off::before{content:"\F1945"}.mdi-pulse::before{content:"\F0430"}.mdi-pump::before{content:"\F1402"}.mdi-pump-off::before{content:"\F1B22"}.mdi-pumpkin::before{content:"\F0BBF"}.mdi-purse::before{content:"\F0F1C"}.mdi-purse-outline::before{content:"\F0F1D"}.mdi-puzzle::before{content:"\F0431"}.mdi-puzzle-check::before{content:"\F1426"}.mdi-puzzle-check-outline::before{content:"\F1427"}.mdi-puzzle-edit::before{content:"\F14D3"}.mdi-puzzle-edit-outline::before{content:"\F14D9"}.mdi-puzzle-heart::before{content:"\F14D4"}.mdi-puzzle-heart-outline::before{content:"\F14DA"}.mdi-puzzle-minus::before{content:"\F14D1"}.mdi-puzzle-minus-outline::before{content:"\F14D7"}.mdi-puzzle-outline::before{content:"\F0A66"}.mdi-puzzle-plus::before{content:"\F14D0"}.mdi-puzzle-plus-outline::before{content:"\F14D6"}.mdi-puzzle-remove::before{content:"\F14D2"}.mdi-puzzle-remove-outline::before{content:"\F14D8"}.mdi-puzzle-star::before{content:"\F14D5"}.mdi-puzzle-star-outline::before{content:"\F14DB"}.mdi-pyramid::before{content:"\F1952"}.mdi-pyramid-off::before{content:"\F1953"}.mdi-qi::before{content:"\F0999"}.mdi-qqchat::before{content:"\F0605"}.mdi-qrcode::before{content:"\F0432"}.mdi-qrcode-edit::before{content:"\F08B8"}.mdi-qrcode-minus::before{content:"\F118C"}.mdi-qrcode-plus::before{content:"\F118B"}.mdi-qrcode-remove::before{content:"\F118D"}.mdi-qrcode-scan::before{content:"\F0433"}.mdi-quadcopter::before{content:"\F0434"}.mdi-quality-high::before{content:"\F0435"}.mdi-quality-low::before{content:"\F0A0C"}.mdi-quality-medium::before{content:"\F0A0D"}.mdi-queue-first-in-last-out::before{content:"\F1CAF"}.mdi-quora::before{content:"\F0D29"}.mdi-rabbit::before{content:"\F0907"}.mdi-rabbit-variant::before{content:"\F1A61"}.mdi-rabbit-variant-outline::before{content:"\F1A62"}.mdi-racing-helmet::before{content:"\F0D93"}.mdi-racquetball::before{content:"\F0D94"}.mdi-radar::before{content:"\F0437"}.mdi-radiator::before{content:"\F0438"}.mdi-radiator-disabled::before{content:"\F0AD7"}.mdi-radiator-off::before{content:"\F0AD8"}.mdi-radio::before{content:"\F0439"}.mdi-radio-am::before{content:"\F0CBE"}.mdi-radio-fm::before{content:"\F0CBF"}.mdi-radio-handheld::before{content:"\F043A"}.mdi-radio-off::before{content:"\F121C"}.mdi-radio-tower::before{content:"\F043B"}.mdi-radioactive::before{content:"\F043C"}.mdi-radioactive-circle::before{content:"\F185D"}.mdi-radioactive-circle-outline::before{content:"\F185E"}.mdi-radioactive-off::before{content:"\F0EC1"}.mdi-radiobox-blank::before{content:"\F043D"}.mdi-radiobox-indeterminate-variant::before{content:"\F1C5E"}.mdi-radiobox-marked::before{content:"\F043E"}.mdi-radiology-box::before{content:"\F14C5"}.mdi-radiology-box-outline::before{content:"\F14C6"}.mdi-radius::before{content:"\F0CC0"}.mdi-radius-outline::before{content:"\F0CC1"}.mdi-railroad-light::before{content:"\F0F1E"}.mdi-rake::before{content:"\F1544"}.mdi-raspberry-pi::before{content:"\F043F"}.mdi-raw::before{content:"\F1A0F"}.mdi-raw-off::before{content:"\F1A10"}.mdi-ray-end::before{content:"\F0440"}.mdi-ray-end-arrow::before{content:"\F0441"}.mdi-ray-start::before{content:"\F0442"}.mdi-ray-start-arrow::before{content:"\F0443"}.mdi-ray-start-end::before{content:"\F0444"}.mdi-ray-start-vertex-end::before{content:"\F15D8"}.mdi-ray-vertex::before{content:"\F0445"}.mdi-razor-double-edge::before{content:"\F1997"}.mdi-razor-single-edge::before{content:"\F1998"}.mdi-react::before{content:"\F0708"}.mdi-read::before{content:"\F0447"}.mdi-receipt::before{content:"\F0824"}.mdi-receipt-clock::before{content:"\F1C3E"}.mdi-receipt-clock-outline::before{content:"\F1C3F"}.mdi-receipt-outline::before{content:"\F04F7"}.mdi-receipt-send::before{content:"\F1C40"}.mdi-receipt-send-outline::before{content:"\F1C41"}.mdi-receipt-text::before{content:"\F0449"}.mdi-receipt-text-arrow-left::before{content:"\F1C42"}.mdi-receipt-text-arrow-left-outline::before{content:"\F1C43"}.mdi-receipt-text-arrow-right::before{content:"\F1C44"}.mdi-receipt-text-arrow-right-outline::before{content:"\F1C45"}.mdi-receipt-text-check::before{content:"\F1A63"}.mdi-receipt-text-check-outline::before{content:"\F1A64"}.mdi-receipt-text-clock::before{content:"\F1C46"}.mdi-receipt-text-clock-outline::before{content:"\F1C47"}.mdi-receipt-text-edit::before{content:"\F1C48"}.mdi-receipt-text-edit-outline::before{content:"\F1C49"}.mdi-receipt-text-minus::before{content:"\F1A65"}.mdi-receipt-text-minus-outline::before{content:"\F1A66"}.mdi-receipt-text-outline::before{content:"\F19DC"}.mdi-receipt-text-plus::before{content:"\F1A67"}.mdi-receipt-text-plus-outline::before{content:"\F1A68"}.mdi-receipt-text-remove::before{content:"\F1A69"}.mdi-receipt-text-remove-outline::before{content:"\F1A6A"}.mdi-receipt-text-send::before{content:"\F1C4A"}.mdi-receipt-text-send-outline::before{content:"\F1C4B"}.mdi-record::before{content:"\F044A"}.mdi-record-circle::before{content:"\F0EC2"}.mdi-record-circle-outline::before{content:"\F0EC3"}.mdi-record-player::before{content:"\F099A"}.mdi-record-rec::before{content:"\F044B"}.mdi-rectangle::before{content:"\F0E5E"}.mdi-rectangle-outline::before{content:"\F0E5F"}.mdi-recycle::before{content:"\F044C"}.mdi-recycle-variant::before{content:"\F139D"}.mdi-reddit::before{content:"\F044D"}.mdi-redhat::before{content:"\F111B"}.mdi-redo::before{content:"\F044E"}.mdi-redo-variant::before{content:"\F044F"}.mdi-reflect-horizontal::before{content:"\F0A0E"}.mdi-reflect-vertical::before{content:"\F0A0F"}.mdi-refresh::before{content:"\F0450"}.mdi-refresh-auto::before{content:"\F18F2"}.mdi-refresh-circle::before{content:"\F1377"}.mdi-regex::before{content:"\F0451"}.mdi-registered-trademark::before{content:"\F0A67"}.mdi-reiterate::before{content:"\F1588"}.mdi-relation-many-to-many::before{content:"\F1496"}.mdi-relation-many-to-one::before{content:"\F1497"}.mdi-relation-many-to-one-or-many::before{content:"\F1498"}.mdi-relation-many-to-only-one::before{content:"\F1499"}.mdi-relation-many-to-zero-or-many::before{content:"\F149A"}.mdi-relation-many-to-zero-or-one::before{content:"\F149B"}.mdi-relation-one-or-many-to-many::before{content:"\F149C"}.mdi-relation-one-or-many-to-one::before{content:"\F149D"}.mdi-relation-one-or-many-to-one-or-many::before{content:"\F149E"}.mdi-relation-one-or-many-to-only-one::before{content:"\F149F"}.mdi-relation-one-or-many-to-zero-or-many::before{content:"\F14A0"}.mdi-relation-one-or-many-to-zero-or-one::before{content:"\F14A1"}.mdi-relation-one-to-many::before{content:"\F14A2"}.mdi-relation-one-to-one::before{content:"\F14A3"}.mdi-relation-one-to-one-or-many::before{content:"\F14A4"}.mdi-relation-one-to-only-one::before{content:"\F14A5"}.mdi-relation-one-to-zero-or-many::before{content:"\F14A6"}.mdi-relation-one-to-zero-or-one::before{content:"\F14A7"}.mdi-relation-only-one-to-many::before{content:"\F14A8"}.mdi-relation-only-one-to-one::before{content:"\F14A9"}.mdi-relation-only-one-to-one-or-many::before{content:"\F14AA"}.mdi-relation-only-one-to-only-one::before{content:"\F14AB"}.mdi-relation-only-one-to-zero-or-many::before{content:"\F14AC"}.mdi-relation-only-one-to-zero-or-one::before{content:"\F14AD"}.mdi-relation-zero-or-many-to-many::before{content:"\F14AE"}.mdi-relation-zero-or-many-to-one::before{content:"\F14AF"}.mdi-relation-zero-or-many-to-one-or-many::before{content:"\F14B0"}.mdi-relation-zero-or-many-to-only-one::before{content:"\F14B1"}.mdi-relation-zero-or-many-to-zero-or-many::before{content:"\F14B2"}.mdi-relation-zero-or-many-to-zero-or-one::before{content:"\F14B3"}.mdi-relation-zero-or-one-to-many::before{content:"\F14B4"}.mdi-relation-zero-or-one-to-one::before{content:"\F14B5"}.mdi-relation-zero-or-one-to-one-or-many::before{content:"\F14B6"}.mdi-relation-zero-or-one-to-only-one::before{content:"\F14B7"}.mdi-relation-zero-or-one-to-zero-or-many::before{content:"\F14B8"}.mdi-relation-zero-or-one-to-zero-or-one::before{content:"\F14B9"}.mdi-relative-scale::before{content:"\F0452"}.mdi-reload::before{content:"\F0453"}.mdi-reload-alert::before{content:"\F110B"}.mdi-reminder::before{content:"\F088C"}.mdi-remote::before{content:"\F0454"}.mdi-remote-desktop::before{content:"\F08B9"}.mdi-remote-off::before{content:"\F0EC4"}.mdi-remote-tv::before{content:"\F0EC5"}.mdi-remote-tv-off::before{content:"\F0EC6"}.mdi-rename::before{content:"\F1C18"}.mdi-rename-box::before{content:"\F0455"}.mdi-rename-box-outline::before{content:"\F1C19"}.mdi-rename-outline::before{content:"\F1C1A"}.mdi-reorder-horizontal::before{content:"\F0688"}.mdi-reorder-vertical::before{content:"\F0689"}.mdi-repeat::before{content:"\F0456"}.mdi-repeat-off::before{content:"\F0457"}.mdi-repeat-once::before{content:"\F0458"}.mdi-repeat-variant::before{content:"\F0547"}.mdi-replay::before{content:"\F0459"}.mdi-reply::before{content:"\F045A"}.mdi-reply-all::before{content:"\F045B"}.mdi-reply-all-outline::before{content:"\F0F1F"}.mdi-reply-circle::before{content:"\F11AE"}.mdi-reply-outline::before{content:"\F0F20"}.mdi-reproduction::before{content:"\F045C"}.mdi-resistor::before{content:"\F0B44"}.mdi-resistor-nodes::before{content:"\F0B45"}.mdi-resize::before{content:"\F0A68"}.mdi-resize-bottom-right::before{content:"\F045D"}.mdi-responsive::before{content:"\F045E"}.mdi-restart::before{content:"\F0709"}.mdi-restart-alert::before{content:"\F110C"}.mdi-restart-off::before{content:"\F0D95"}.mdi-restore::before{content:"\F099B"}.mdi-restore-alert::before{content:"\F110D"}.mdi-rewind::before{content:"\F045F"}.mdi-rewind-10::before{content:"\F0D2A"}.mdi-rewind-15::before{content:"\F1946"}.mdi-rewind-30::before{content:"\F0D96"}.mdi-rewind-45::before{content:"\F1B13"}.mdi-rewind-5::before{content:"\F11F9"}.mdi-rewind-60::before{content:"\F160C"}.mdi-rewind-outline::before{content:"\F070A"}.mdi-rhombus::before{content:"\F070B"}.mdi-rhombus-medium::before{content:"\F0A10"}.mdi-rhombus-medium-outline::before{content:"\F14DC"}.mdi-rhombus-outline::before{content:"\F070C"}.mdi-rhombus-split::before{content:"\F0A11"}.mdi-rhombus-split-outline::before{content:"\F14DD"}.mdi-ribbon::before{content:"\F0460"}.mdi-rice::before{content:"\F07EA"}.mdi-rickshaw::before{content:"\F15BB"}.mdi-rickshaw-electric::before{content:"\F15BC"}.mdi-ring::before{content:"\F07EB"}.mdi-rivet::before{content:"\F0E60"}.mdi-road::before{content:"\F0461"}.mdi-road-variant::before{content:"\F0462"}.mdi-robber::before{content:"\F1058"}.mdi-robot::before{content:"\F06A9"}.mdi-robot-angry::before{content:"\F169D"}.mdi-robot-angry-outline::before{content:"\F169E"}.mdi-robot-confused::before{content:"\F169F"}.mdi-robot-confused-outline::before{content:"\F16A0"}.mdi-robot-dead::before{content:"\F16A1"}.mdi-robot-dead-outline::before{content:"\F16A2"}.mdi-robot-excited::before{content:"\F16A3"}.mdi-robot-excited-outline::before{content:"\F16A4"}.mdi-robot-happy::before{content:"\F1719"}.mdi-robot-happy-outline::before{content:"\F171A"}.mdi-robot-industrial::before{content:"\F0B46"}.mdi-robot-industrial-outline::before{content:"\F1A1A"}.mdi-robot-love::before{content:"\F16A5"}.mdi-robot-love-outline::before{content:"\F16A6"}.mdi-robot-mower::before{content:"\F11F7"}.mdi-robot-mower-outline::before{content:"\F11F3"}.mdi-robot-off::before{content:"\F16A7"}.mdi-robot-off-outline::before{content:"\F167B"}.mdi-robot-outline::before{content:"\F167A"}.mdi-robot-vacuum::before{content:"\F070D"}.mdi-robot-vacuum-alert::before{content:"\F1B5D"}.mdi-robot-vacuum-off::before{content:"\F1C01"}.mdi-robot-vacuum-variant::before{content:"\F0908"}.mdi-robot-vacuum-variant-alert::before{content:"\F1B5E"}.mdi-robot-vacuum-variant-off::before{content:"\F1C02"}.mdi-rocket::before{content:"\F0463"}.mdi-rocket-launch::before{content:"\F14DE"}.mdi-rocket-launch-outline::before{content:"\F14DF"}.mdi-rocket-outline::before{content:"\F13AF"}.mdi-rodent::before{content:"\F1327"}.mdi-roller-shade::before{content:"\F1A6B"}.mdi-roller-shade-closed::before{content:"\F1A6C"}.mdi-roller-skate::before{content:"\F0D2B"}.mdi-roller-skate-off::before{content:"\F0145"}.mdi-rollerblade::before{content:"\F0D2C"}.mdi-rollerblade-off::before{content:"\F002E"}.mdi-rollupjs::before{content:"\F0BC0"}.mdi-rolodex::before{content:"\F1AB9"}.mdi-rolodex-outline::before{content:"\F1ABA"}.mdi-roman-numeral-1::before{content:"\F1088"}.mdi-roman-numeral-10::before{content:"\F1091"}.mdi-roman-numeral-2::before{content:"\F1089"}.mdi-roman-numeral-3::before{content:"\F108A"}.mdi-roman-numeral-4::before{content:"\F108B"}.mdi-roman-numeral-5::before{content:"\F108C"}.mdi-roman-numeral-6::before{content:"\F108D"}.mdi-roman-numeral-7::before{content:"\F108E"}.mdi-roman-numeral-8::before{content:"\F108F"}.mdi-roman-numeral-9::before{content:"\F1090"}.mdi-room-service::before{content:"\F088D"}.mdi-room-service-outline::before{content:"\F0D97"}.mdi-rotate-360::before{content:"\F1999"}.mdi-rotate-3d::before{content:"\F0EC7"}.mdi-rotate-3d-variant::before{content:"\F0464"}.mdi-rotate-left::before{content:"\F0465"}.mdi-rotate-left-variant::before{content:"\F0466"}.mdi-rotate-orbit::before{content:"\F0D98"}.mdi-rotate-right::before{content:"\F0467"}.mdi-rotate-right-variant::before{content:"\F0468"}.mdi-rounded-corner::before{content:"\F0607"}.mdi-router::before{content:"\F11E2"}.mdi-router-network::before{content:"\F1087"}.mdi-router-network-wireless::before{content:"\F1C97"}.mdi-router-wireless::before{content:"\F0469"}.mdi-router-wireless-off::before{content:"\F15A3"}.mdi-router-wireless-settings::before{content:"\F0A69"}.mdi-routes::before{content:"\F046A"}.mdi-routes-clock::before{content:"\F1059"}.mdi-rowing::before{content:"\F0608"}.mdi-rss::before{content:"\F046B"}.mdi-rss-box::before{content:"\F046C"}.mdi-rss-off::before{content:"\F0F21"}.mdi-rug::before{content:"\F1475"}.mdi-rugby::before{content:"\F0D99"}.mdi-ruler::before{content:"\F046D"}.mdi-ruler-square::before{content:"\F0CC2"}.mdi-ruler-square-compass::before{content:"\F0EBE"}.mdi-run::before{content:"\F070E"}.mdi-run-fast::before{content:"\F046E"}.mdi-rv-truck::before{content:"\F11D4"}.mdi-sack::before{content:"\F0D2E"}.mdi-sack-outline::before{content:"\F1C4C"}.mdi-sack-percent::before{content:"\F0D2F"}.mdi-safe::before{content:"\F0A6A"}.mdi-safe-square::before{content:"\F127C"}.mdi-safe-square-outline::before{content:"\F127D"}.mdi-safety-goggles::before{content:"\F0D30"}.mdi-sail-boat::before{content:"\F0EC8"}.mdi-sail-boat-sink::before{content:"\F1AEF"}.mdi-sale::before{content:"\F046F"}.mdi-sale-outline::before{content:"\F1A06"}.mdi-salesforce::before{content:"\F088E"}.mdi-sass::before{content:"\F07EC"}.mdi-satellite::before{content:"\F0470"}.mdi-satellite-uplink::before{content:"\F0909"}.mdi-satellite-variant::before{content:"\F0471"}.mdi-sausage::before{content:"\F08BA"}.mdi-sausage-off::before{content:"\F1789"}.mdi-saw-blade::before{content:"\F0E61"}.mdi-sawtooth-wave::before{content:"\F147A"}.mdi-saxophone::before{content:"\F0609"}.mdi-scale::before{content:"\F0472"}.mdi-scale-balance::before{content:"\F05D1"}.mdi-scale-bathroom::before{content:"\F0473"}.mdi-scale-off::before{content:"\F105A"}.mdi-scale-unbalanced::before{content:"\F19B8"}.mdi-scan-helper::before{content:"\F13D8"}.mdi-scanner::before{content:"\F06AB"}.mdi-scanner-off::before{content:"\F090A"}.mdi-scatter-plot::before{content:"\F0EC9"}.mdi-scatter-plot-outline::before{content:"\F0ECA"}.mdi-scent::before{content:"\F1958"}.mdi-scent-off::before{content:"\F1959"}.mdi-school::before{content:"\F0474"}.mdi-school-outline::before{content:"\F1180"}.mdi-scissors-cutting::before{content:"\F0A6B"}.mdi-scooter::before{content:"\F15BD"}.mdi-scooter-electric::before{content:"\F15BE"}.mdi-scoreboard::before{content:"\F127E"}.mdi-scoreboard-outline::before{content:"\F127F"}.mdi-screen-rotation::before{content:"\F0475"}.mdi-screen-rotation-lock::before{content:"\F0478"}.mdi-screw-flat-top::before{content:"\F0DF3"}.mdi-screw-lag::before{content:"\F0DF4"}.mdi-screw-machine-flat-top::before{content:"\F0DF5"}.mdi-screw-machine-round-top::before{content:"\F0DF6"}.mdi-screw-round-top::before{content:"\F0DF7"}.mdi-screwdriver::before{content:"\F0476"}.mdi-script::before{content:"\F0BC1"}.mdi-script-outline::before{content:"\F0477"}.mdi-script-text::before{content:"\F0BC2"}.mdi-script-text-key::before{content:"\F1725"}.mdi-script-text-key-outline::before{content:"\F1726"}.mdi-script-text-outline::before{content:"\F0BC3"}.mdi-script-text-play::before{content:"\F1727"}.mdi-script-text-play-outline::before{content:"\F1728"}.mdi-sd::before{content:"\F0479"}.mdi-seal::before{content:"\F047A"}.mdi-seal-variant::before{content:"\F0FD9"}.mdi-search-web::before{content:"\F070F"}.mdi-seat::before{content:"\F0CC3"}.mdi-seat-flat::before{content:"\F047B"}.mdi-seat-flat-angled::before{content:"\F047C"}.mdi-seat-individual-suite::before{content:"\F047D"}.mdi-seat-legroom-extra::before{content:"\F047E"}.mdi-seat-legroom-normal::before{content:"\F047F"}.mdi-seat-legroom-reduced::before{content:"\F0480"}.mdi-seat-outline::before{content:"\F0CC4"}.mdi-seat-passenger::before{content:"\F1249"}.mdi-seat-recline-extra::before{content:"\F0481"}.mdi-seat-recline-normal::before{content:"\F0482"}.mdi-seatbelt::before{content:"\F0CC5"}.mdi-security::before{content:"\F0483"}.mdi-security-network::before{content:"\F0484"}.mdi-seed::before{content:"\F0E62"}.mdi-seed-off::before{content:"\F13FD"}.mdi-seed-off-outline::before{content:"\F13FE"}.mdi-seed-outline::before{content:"\F0E63"}.mdi-seed-plus::before{content:"\F1A6D"}.mdi-seed-plus-outline::before{content:"\F1A6E"}.mdi-seesaw::before{content:"\F15A4"}.mdi-segment::before{content:"\F0ECB"}.mdi-select::before{content:"\F0485"}.mdi-select-all::before{content:"\F0486"}.mdi-select-arrow-down::before{content:"\F1B59"}.mdi-select-arrow-up::before{content:"\F1B58"}.mdi-select-color::before{content:"\F0D31"}.mdi-select-compare::before{content:"\F0AD9"}.mdi-select-drag::before{content:"\F0A6C"}.mdi-select-group::before{content:"\F0F82"}.mdi-select-inverse::before{content:"\F0487"}.mdi-select-marker::before{content:"\F1280"}.mdi-select-multiple::before{content:"\F1281"}.mdi-select-multiple-marker::before{content:"\F1282"}.mdi-select-off::before{content:"\F0488"}.mdi-select-place::before{content:"\F0FDA"}.mdi-select-remove::before{content:"\F17C1"}.mdi-select-search::before{content:"\F1204"}.mdi-selection::before{content:"\F0489"}.mdi-selection-drag::before{content:"\F0A6D"}.mdi-selection-ellipse::before{content:"\F0D32"}.mdi-selection-ellipse-arrow-inside::before{content:"\F0F22"}.mdi-selection-ellipse-remove::before{content:"\F17C2"}.mdi-selection-marker::before{content:"\F1283"}.mdi-selection-multiple::before{content:"\F1285"}.mdi-selection-multiple-marker::before{content:"\F1284"}.mdi-selection-off::before{content:"\F0777"}.mdi-selection-remove::before{content:"\F17C3"}.mdi-selection-search::before{content:"\F1205"}.mdi-semantic-web::before{content:"\F1316"}.mdi-send::before{content:"\F048A"}.mdi-send-check::before{content:"\F1161"}.mdi-send-check-outline::before{content:"\F1162"}.mdi-send-circle::before{content:"\F0DF8"}.mdi-send-circle-outline::before{content:"\F0DF9"}.mdi-send-clock::before{content:"\F1163"}.mdi-send-clock-outline::before{content:"\F1164"}.mdi-send-lock::before{content:"\F07ED"}.mdi-send-lock-outline::before{content:"\F1166"}.mdi-send-outline::before{content:"\F1165"}.mdi-send-variant::before{content:"\F1C4D"}.mdi-send-variant-clock::before{content:"\F1C7E"}.mdi-send-variant-clock-outline::before{content:"\F1C7F"}.mdi-send-variant-outline::before{content:"\F1C4E"}.mdi-serial-port::before{content:"\F065C"}.mdi-server::before{content:"\F048B"}.mdi-server-minus::before{content:"\F048C"}.mdi-server-minus-outline::before{content:"\F1C98"}.mdi-server-network::before{content:"\F048D"}.mdi-server-network-off::before{content:"\F048E"}.mdi-server-network-outline::before{content:"\F1C99"}.mdi-server-off::before{content:"\F048F"}.mdi-server-outline::before{content:"\F1C9A"}.mdi-server-plus::before{content:"\F0490"}.mdi-server-plus-outline::before{content:"\F1C9B"}.mdi-server-remove::before{content:"\F0491"}.mdi-server-security::before{content:"\F0492"}.mdi-set-all::before{content:"\F0778"}.mdi-set-center::before{content:"\F0779"}.mdi-set-center-right::before{content:"\F077A"}.mdi-set-left::before{content:"\F077B"}.mdi-set-left-center::before{content:"\F077C"}.mdi-set-left-right::before{content:"\F077D"}.mdi-set-merge::before{content:"\F14E0"}.mdi-set-none::before{content:"\F077E"}.mdi-set-right::before{content:"\F077F"}.mdi-set-split::before{content:"\F14E1"}.mdi-set-square::before{content:"\F145D"}.mdi-set-top-box::before{content:"\F099F"}.mdi-settings-helper::before{content:"\F0A6E"}.mdi-shaker::before{content:"\F110E"}.mdi-shaker-outline::before{content:"\F110F"}.mdi-shape::before{content:"\F0831"}.mdi-shape-circle-plus::before{content:"\F065D"}.mdi-shape-outline::before{content:"\F0832"}.mdi-shape-oval-plus::before{content:"\F11FA"}.mdi-shape-plus::before{content:"\F0495"}.mdi-shape-plus-outline::before{content:"\F1C4F"}.mdi-shape-polygon-plus::before{content:"\F065E"}.mdi-shape-rectangle-plus::before{content:"\F065F"}.mdi-shape-square-plus::before{content:"\F0660"}.mdi-shape-square-rounded-plus::before{content:"\F14FA"}.mdi-share::before{content:"\F0496"}.mdi-share-all::before{content:"\F11F4"}.mdi-share-all-outline::before{content:"\F11F5"}.mdi-share-circle::before{content:"\F11AD"}.mdi-share-off::before{content:"\F0F23"}.mdi-share-off-outline::before{content:"\F0F24"}.mdi-share-outline::before{content:"\F0932"}.mdi-share-variant::before{content:"\F0497"}.mdi-share-variant-outline::before{content:"\F1514"}.mdi-shark::before{content:"\F18BA"}.mdi-shark-fin::before{content:"\F1673"}.mdi-shark-fin-outline::before{content:"\F1674"}.mdi-shark-off::before{content:"\F18BB"}.mdi-sheep::before{content:"\F0CC6"}.mdi-shield::before{content:"\F0498"}.mdi-shield-account::before{content:"\F088F"}.mdi-shield-account-outline::before{content:"\F0A12"}.mdi-shield-account-variant::before{content:"\F15A7"}.mdi-shield-account-variant-outline::before{content:"\F15A8"}.mdi-shield-airplane::before{content:"\F06BB"}.mdi-shield-airplane-outline::before{content:"\F0CC7"}.mdi-shield-alert::before{content:"\F0ECC"}.mdi-shield-alert-outline::before{content:"\F0ECD"}.mdi-shield-bug::before{content:"\F13DA"}.mdi-shield-bug-outline::before{content:"\F13DB"}.mdi-shield-car::before{content:"\F0F83"}.mdi-shield-check::before{content:"\F0565"}.mdi-shield-check-outline::before{content:"\F0CC8"}.mdi-shield-cross::before{content:"\F0CC9"}.mdi-shield-cross-outline::before{content:"\F0CCA"}.mdi-shield-crown::before{content:"\F18BC"}.mdi-shield-crown-outline::before{content:"\F18BD"}.mdi-shield-edit::before{content:"\F11A0"}.mdi-shield-edit-outline::before{content:"\F11A1"}.mdi-shield-half::before{content:"\F1360"}.mdi-shield-half-full::before{content:"\F0780"}.mdi-shield-home::before{content:"\F068A"}.mdi-shield-home-outline::before{content:"\F0CCB"}.mdi-shield-key::before{content:"\F0BC4"}.mdi-shield-key-outline::before{content:"\F0BC5"}.mdi-shield-link-variant::before{content:"\F0D33"}.mdi-shield-link-variant-outline::before{content:"\F0D34"}.mdi-shield-lock::before{content:"\F099D"}.mdi-shield-lock-open::before{content:"\F199A"}.mdi-shield-lock-open-outline::before{content:"\F199B"}.mdi-shield-lock-outline::before{content:"\F0CCC"}.mdi-shield-moon::before{content:"\F1828"}.mdi-shield-moon-outline::before{content:"\F1829"}.mdi-shield-off::before{content:"\F099E"}.mdi-shield-off-outline::before{content:"\F099C"}.mdi-shield-outline::before{content:"\F0499"}.mdi-shield-plus::before{content:"\F0ADA"}.mdi-shield-plus-outline::before{content:"\F0ADB"}.mdi-shield-refresh::before{content:"\F00AA"}.mdi-shield-refresh-outline::before{content:"\F01E0"}.mdi-shield-remove::before{content:"\F0ADC"}.mdi-shield-remove-outline::before{content:"\F0ADD"}.mdi-shield-search::before{content:"\F0D9A"}.mdi-shield-star::before{content:"\F113B"}.mdi-shield-star-outline::before{content:"\F113C"}.mdi-shield-sun::before{content:"\F105D"}.mdi-shield-sun-outline::before{content:"\F105E"}.mdi-shield-sword::before{content:"\F18BE"}.mdi-shield-sword-outline::before{content:"\F18BF"}.mdi-shield-sync::before{content:"\F11A2"}.mdi-shield-sync-outline::before{content:"\F11A3"}.mdi-shimmer::before{content:"\F1545"}.mdi-ship-wheel::before{content:"\F0833"}.mdi-shipping-pallet::before{content:"\F184E"}.mdi-shoe-ballet::before{content:"\F15CA"}.mdi-shoe-cleat::before{content:"\F15C7"}.mdi-shoe-formal::before{content:"\F0B47"}.mdi-shoe-heel::before{content:"\F0B48"}.mdi-shoe-print::before{content:"\F0DFA"}.mdi-shoe-sneaker::before{content:"\F15C8"}.mdi-shopping::before{content:"\F049A"}.mdi-shopping-music::before{content:"\F049B"}.mdi-shopping-outline::before{content:"\F11D5"}.mdi-shopping-search::before{content:"\F0F84"}.mdi-shopping-search-outline::before{content:"\F1A6F"}.mdi-shore::before{content:"\F14F9"}.mdi-shovel::before{content:"\F0710"}.mdi-shovel-off::before{content:"\F0711"}.mdi-shower::before{content:"\F09A0"}.mdi-shower-head::before{content:"\F09A1"}.mdi-shredder::before{content:"\F049C"}.mdi-shuffle::before{content:"\F049D"}.mdi-shuffle-disabled::before{content:"\F049E"}.mdi-shuffle-variant::before{content:"\F049F"}.mdi-shuriken::before{content:"\F137F"}.mdi-sickle::before{content:"\F18C0"}.mdi-sigma::before{content:"\F04A0"}.mdi-sigma-lower::before{content:"\F062B"}.mdi-sign-caution::before{content:"\F04A1"}.mdi-sign-direction::before{content:"\F0781"}.mdi-sign-direction-minus::before{content:"\F1000"}.mdi-sign-direction-plus::before{content:"\F0FDC"}.mdi-sign-direction-remove::before{content:"\F0FDD"}.mdi-sign-language::before{content:"\F1B4D"}.mdi-sign-language-outline::before{content:"\F1B4E"}.mdi-sign-pole::before{content:"\F14F8"}.mdi-sign-real-estate::before{content:"\F1118"}.mdi-sign-text::before{content:"\F0782"}.mdi-sign-yield::before{content:"\F1BAF"}.mdi-signal::before{content:"\F04A2"}.mdi-signal-2g::before{content:"\F0712"}.mdi-signal-3g::before{content:"\F0713"}.mdi-signal-4g::before{content:"\F0714"}.mdi-signal-5g::before{content:"\F0A6F"}.mdi-signal-cellular-1::before{content:"\F08BC"}.mdi-signal-cellular-2::before{content:"\F08BD"}.mdi-signal-cellular-3::before{content:"\F08BE"}.mdi-signal-cellular-outline::before{content:"\F08BF"}.mdi-signal-distance-variant::before{content:"\F0E64"}.mdi-signal-hspa::before{content:"\F0715"}.mdi-signal-hspa-plus::before{content:"\F0716"}.mdi-signal-off::before{content:"\F0783"}.mdi-signal-variant::before{content:"\F060A"}.mdi-signature::before{content:"\F0DFB"}.mdi-signature-freehand::before{content:"\F0DFC"}.mdi-signature-image::before{content:"\F0DFD"}.mdi-signature-text::before{content:"\F0DFE"}.mdi-silo::before{content:"\F1B9F"}.mdi-silo-outline::before{content:"\F0B49"}.mdi-silverware::before{content:"\F04A3"}.mdi-silverware-clean::before{content:"\F0FDE"}.mdi-silverware-fork::before{content:"\F04A4"}.mdi-silverware-fork-knife::before{content:"\F0A70"}.mdi-silverware-spoon::before{content:"\F04A5"}.mdi-silverware-variant::before{content:"\F04A6"}.mdi-sim::before{content:"\F04A7"}.mdi-sim-alert::before{content:"\F04A8"}.mdi-sim-alert-outline::before{content:"\F15D3"}.mdi-sim-off::before{content:"\F04A9"}.mdi-sim-off-outline::before{content:"\F15D4"}.mdi-sim-outline::before{content:"\F15D5"}.mdi-simple-icons::before{content:"\F131D"}.mdi-sina-weibo::before{content:"\F0ADF"}.mdi-sine-wave::before{content:"\F095B"}.mdi-sitemap::before{content:"\F04AA"}.mdi-sitemap-outline::before{content:"\F199C"}.mdi-size-l::before{content:"\F13A6"}.mdi-size-m::before{content:"\F13A5"}.mdi-size-s::before{content:"\F13A4"}.mdi-size-xl::before{content:"\F13A7"}.mdi-size-xs::before{content:"\F13A3"}.mdi-size-xxl::before{content:"\F13A8"}.mdi-size-xxs::before{content:"\F13A2"}.mdi-size-xxxl::before{content:"\F13A9"}.mdi-skate::before{content:"\F0D35"}.mdi-skate-off::before{content:"\F0699"}.mdi-skateboard::before{content:"\F14C2"}.mdi-skateboarding::before{content:"\F0501"}.mdi-skew-less::before{content:"\F0D36"}.mdi-skew-more::before{content:"\F0D37"}.mdi-ski::before{content:"\F1304"}.mdi-ski-cross-country::before{content:"\F1305"}.mdi-ski-water::before{content:"\F1306"}.mdi-skip-backward::before{content:"\F04AB"}.mdi-skip-backward-outline::before{content:"\F0F25"}.mdi-skip-forward::before{content:"\F04AC"}.mdi-skip-forward-outline::before{content:"\F0F26"}.mdi-skip-next::before{content:"\F04AD"}.mdi-skip-next-circle::before{content:"\F0661"}.mdi-skip-next-circle-outline::before{content:"\F0662"}.mdi-skip-next-outline::before{content:"\F0F27"}.mdi-skip-previous::before{content:"\F04AE"}.mdi-skip-previous-circle::before{content:"\F0663"}.mdi-skip-previous-circle-outline::before{content:"\F0664"}.mdi-skip-previous-outline::before{content:"\F0F28"}.mdi-skull::before{content:"\F068C"}.mdi-skull-crossbones::before{content:"\F0BC6"}.mdi-skull-crossbones-outline::before{content:"\F0BC7"}.mdi-skull-outline::before{content:"\F0BC8"}.mdi-skull-scan::before{content:"\F14C7"}.mdi-skull-scan-outline::before{content:"\F14C8"}.mdi-skype::before{content:"\F04AF"}.mdi-skype-business::before{content:"\F04B0"}.mdi-slack::before{content:"\F04B1"}.mdi-slash-forward::before{content:"\F0FDF"}.mdi-slash-forward-box::before{content:"\F0FE0"}.mdi-sledding::before{content:"\F041B"}.mdi-sleep::before{content:"\F04B2"}.mdi-sleep-off::before{content:"\F04B3"}.mdi-slide::before{content:"\F15A5"}.mdi-slope-downhill::before{content:"\F0DFF"}.mdi-slope-uphill::before{content:"\F0E00"}.mdi-slot-machine::before{content:"\F1114"}.mdi-slot-machine-outline::before{content:"\F1115"}.mdi-smart-card::before{content:"\F10BD"}.mdi-smart-card-off::before{content:"\F18F7"}.mdi-smart-card-off-outline::before{content:"\F18F8"}.mdi-smart-card-outline::before{content:"\F10BE"}.mdi-smart-card-reader::before{content:"\F10BF"}.mdi-smart-card-reader-outline::before{content:"\F10C0"}.mdi-smog::before{content:"\F0A71"}.mdi-smoke::before{content:"\F1799"}.mdi-smoke-detector::before{content:"\F0392"}.mdi-smoke-detector-alert::before{content:"\F192E"}.mdi-smoke-detector-alert-outline::before{content:"\F192F"}.mdi-smoke-detector-off::before{content:"\F1809"}.mdi-smoke-detector-off-outline::before{content:"\F180A"}.mdi-smoke-detector-outline::before{content:"\F1808"}.mdi-smoke-detector-variant::before{content:"\F180B"}.mdi-smoke-detector-variant-alert::before{content:"\F1930"}.mdi-smoke-detector-variant-off::before{content:"\F180C"}.mdi-smoking::before{content:"\F04B4"}.mdi-smoking-off::before{content:"\F04B5"}.mdi-smoking-pipe::before{content:"\F140D"}.mdi-smoking-pipe-off::before{content:"\F1428"}.mdi-snail::before{content:"\F1677"}.mdi-snake::before{content:"\F150E"}.mdi-snapchat::before{content:"\F04B6"}.mdi-snowboard::before{content:"\F1307"}.mdi-snowflake::before{content:"\F0717"}.mdi-snowflake-alert::before{content:"\F0F29"}.mdi-snowflake-check::before{content:"\F1A70"}.mdi-snowflake-melt::before{content:"\F12CB"}.mdi-snowflake-off::before{content:"\F14E3"}.mdi-snowflake-thermometer::before{content:"\F1A71"}.mdi-snowflake-variant::before{content:"\F0F2A"}.mdi-snowman::before{content:"\F04B7"}.mdi-snowmobile::before{content:"\F06DD"}.mdi-snowshoeing::before{content:"\F1A72"}.mdi-soccer::before{content:"\F04B8"}.mdi-soccer-field::before{content:"\F0834"}.mdi-social-distance-2-meters::before{content:"\F1579"}.mdi-social-distance-6-feet::before{content:"\F157A"}.mdi-sofa::before{content:"\F04B9"}.mdi-sofa-outline::before{content:"\F156D"}.mdi-sofa-single::before{content:"\F156E"}.mdi-sofa-single-outline::before{content:"\F156F"}.mdi-solar-panel::before{content:"\F0D9B"}.mdi-solar-panel-large::before{content:"\F0D9C"}.mdi-solar-power::before{content:"\F0A72"}.mdi-solar-power-variant::before{content:"\F1A73"}.mdi-solar-power-variant-outline::before{content:"\F1A74"}.mdi-soldering-iron::before{content:"\F1092"}.mdi-solid::before{content:"\F068D"}.mdi-sony-playstation::before{content:"\F0414"}.mdi-sort::before{content:"\F04BA"}.mdi-sort-alphabetical-ascending::before{content:"\F05BD"}.mdi-sort-alphabetical-ascending-variant::before{content:"\F1148"}.mdi-sort-alphabetical-descending::before{content:"\F05BF"}.mdi-sort-alphabetical-descending-variant::before{content:"\F1149"}.mdi-sort-alphabetical-variant::before{content:"\F04BB"}.mdi-sort-ascending::before{content:"\F04BC"}.mdi-sort-bool-ascending::before{content:"\F1385"}.mdi-sort-bool-ascending-variant::before{content:"\F1386"}.mdi-sort-bool-descending::before{content:"\F1387"}.mdi-sort-bool-descending-variant::before{content:"\F1388"}.mdi-sort-calendar-ascending::before{content:"\F1547"}.mdi-sort-calendar-descending::before{content:"\F1548"}.mdi-sort-clock-ascending::before{content:"\F1549"}.mdi-sort-clock-ascending-outline::before{content:"\F154A"}.mdi-sort-clock-descending::before{content:"\F154B"}.mdi-sort-clock-descending-outline::before{content:"\F154C"}.mdi-sort-descending::before{content:"\F04BD"}.mdi-sort-numeric-ascending::before{content:"\F1389"}.mdi-sort-numeric-ascending-variant::before{content:"\F090D"}.mdi-sort-numeric-descending::before{content:"\F138A"}.mdi-sort-numeric-descending-variant::before{content:"\F0AD2"}.mdi-sort-numeric-variant::before{content:"\F04BE"}.mdi-sort-reverse-variant::before{content:"\F033C"}.mdi-sort-variant::before{content:"\F04BF"}.mdi-sort-variant-lock::before{content:"\F0CCD"}.mdi-sort-variant-lock-open::before{content:"\F0CCE"}.mdi-sort-variant-off::before{content:"\F1ABB"}.mdi-sort-variant-remove::before{content:"\F1147"}.mdi-soundbar::before{content:"\F17DB"}.mdi-soundcloud::before{content:"\F04C0"}.mdi-source-branch::before{content:"\F062C"}.mdi-source-branch-check::before{content:"\F14CF"}.mdi-source-branch-minus::before{content:"\F14CB"}.mdi-source-branch-plus::before{content:"\F14CA"}.mdi-source-branch-refresh::before{content:"\F14CD"}.mdi-source-branch-remove::before{content:"\F14CC"}.mdi-source-branch-sync::before{content:"\F14CE"}.mdi-source-commit::before{content:"\F0718"}.mdi-source-commit-end::before{content:"\F0719"}.mdi-source-commit-end-local::before{content:"\F071A"}.mdi-source-commit-local::before{content:"\F071B"}.mdi-source-commit-next-local::before{content:"\F071C"}.mdi-source-commit-start::before{content:"\F071D"}.mdi-source-commit-start-next-local::before{content:"\F071E"}.mdi-source-fork::before{content:"\F04C1"}.mdi-source-merge::before{content:"\F062D"}.mdi-source-pull::before{content:"\F04C2"}.mdi-source-repository::before{content:"\F0CCF"}.mdi-source-repository-multiple::before{content:"\F0CD0"}.mdi-soy-sauce::before{content:"\F07EE"}.mdi-soy-sauce-off::before{content:"\F13FC"}.mdi-spa::before{content:"\F0CD1"}.mdi-spa-outline::before{content:"\F0CD2"}.mdi-space-invaders::before{content:"\F0BC9"}.mdi-space-station::before{content:"\F1383"}.mdi-spade::before{content:"\F0E65"}.mdi-speaker::before{content:"\F04C3"}.mdi-speaker-bluetooth::before{content:"\F09A2"}.mdi-speaker-message::before{content:"\F1B11"}.mdi-speaker-multiple::before{content:"\F0D38"}.mdi-speaker-off::before{content:"\F04C4"}.mdi-speaker-pause::before{content:"\F1B73"}.mdi-speaker-play::before{content:"\F1B72"}.mdi-speaker-stop::before{content:"\F1B74"}.mdi-speaker-wireless::before{content:"\F071F"}.mdi-spear::before{content:"\F1845"}.mdi-speedometer::before{content:"\F04C5"}.mdi-speedometer-medium::before{content:"\F0F85"}.mdi-speedometer-slow::before{content:"\F0F86"}.mdi-spellcheck::before{content:"\F04C6"}.mdi-sphere::before{content:"\F1954"}.mdi-sphere-off::before{content:"\F1955"}.mdi-spider::before{content:"\F11EA"}.mdi-spider-outline::before{content:"\F1C75"}.mdi-spider-thread::before{content:"\F11EB"}.mdi-spider-web::before{content:"\F0BCA"}.mdi-spirit-level::before{content:"\F14F1"}.mdi-spoon-sugar::before{content:"\F1429"}.mdi-spotify::before{content:"\F04C7"}.mdi-spotlight::before{content:"\F04C8"}.mdi-spotlight-beam::before{content:"\F04C9"}.mdi-spray::before{content:"\F0665"}.mdi-spray-bottle::before{content:"\F0AE0"}.mdi-sprinkler::before{content:"\F105F"}.mdi-sprinkler-fire::before{content:"\F199D"}.mdi-sprinkler-variant::before{content:"\F1060"}.mdi-sprout::before{content:"\F0E66"}.mdi-sprout-outline::before{content:"\F0E67"}.mdi-square::before{content:"\F0764"}.mdi-square-circle::before{content:"\F1500"}.mdi-square-circle-outline::before{content:"\F1C50"}.mdi-square-edit-outline::before{content:"\F090C"}.mdi-square-medium::before{content:"\F0A13"}.mdi-square-medium-outline::before{content:"\F0A14"}.mdi-square-off::before{content:"\F12EE"}.mdi-square-off-outline::before{content:"\F12EF"}.mdi-square-opacity::before{content:"\F1854"}.mdi-square-outline::before{content:"\F0763"}.mdi-square-root::before{content:"\F0784"}.mdi-square-root-box::before{content:"\F09A3"}.mdi-square-rounded::before{content:"\F14FB"}.mdi-square-rounded-badge::before{content:"\F1A07"}.mdi-square-rounded-badge-outline::before{content:"\F1A08"}.mdi-square-rounded-outline::before{content:"\F14FC"}.mdi-square-small::before{content:"\F0A15"}.mdi-square-wave::before{content:"\F147B"}.mdi-squeegee::before{content:"\F0AE1"}.mdi-ssh::before{content:"\F08C0"}.mdi-stack-exchange::before{content:"\F060B"}.mdi-stack-overflow::before{content:"\F04CC"}.mdi-stackpath::before{content:"\F0359"}.mdi-stadium::before{content:"\F0FF9"}.mdi-stadium-outline::before{content:"\F1B03"}.mdi-stadium-variant::before{content:"\F0720"}.mdi-stairs::before{content:"\F04CD"}.mdi-stairs-box::before{content:"\F139E"}.mdi-stairs-down::before{content:"\F12BE"}.mdi-stairs-up::before{content:"\F12BD"}.mdi-stamper::before{content:"\F0D39"}.mdi-standard-definition::before{content:"\F07EF"}.mdi-star::before{content:"\F04CE"}.mdi-star-box::before{content:"\F0A73"}.mdi-star-box-multiple::before{content:"\F1286"}.mdi-star-box-multiple-outline::before{content:"\F1287"}.mdi-star-box-outline::before{content:"\F0A74"}.mdi-star-check::before{content:"\F1566"}.mdi-star-check-outline::before{content:"\F156A"}.mdi-star-circle::before{content:"\F04CF"}.mdi-star-circle-outline::before{content:"\F09A4"}.mdi-star-cog::before{content:"\F1668"}.mdi-star-cog-outline::before{content:"\F1669"}.mdi-star-crescent::before{content:"\F0979"}.mdi-star-david::before{content:"\F097A"}.mdi-star-face::before{content:"\F09A5"}.mdi-star-four-points::before{content:"\F0AE2"}.mdi-star-four-points-box::before{content:"\F1C51"}.mdi-star-four-points-box-outline::before{content:"\F1C52"}.mdi-star-four-points-circle::before{content:"\F1C53"}.mdi-star-four-points-circle-outline::before{content:"\F1C54"}.mdi-star-four-points-outline::before{content:"\F0AE3"}.mdi-star-four-points-small::before{content:"\F1C55"}.mdi-star-half::before{content:"\F0246"}.mdi-star-half-full::before{content:"\F04D0"}.mdi-star-minus::before{content:"\F1564"}.mdi-star-minus-outline::before{content:"\F1568"}.mdi-star-off::before{content:"\F04D1"}.mdi-star-off-outline::before{content:"\F155B"}.mdi-star-outline::before{content:"\F04D2"}.mdi-star-plus::before{content:"\F1563"}.mdi-star-plus-outline::before{content:"\F1567"}.mdi-star-remove::before{content:"\F1565"}.mdi-star-remove-outline::before{content:"\F1569"}.mdi-star-settings::before{content:"\F166A"}.mdi-star-settings-outline::before{content:"\F166B"}.mdi-star-shooting::before{content:"\F1741"}.mdi-star-shooting-outline::before{content:"\F1742"}.mdi-star-three-points::before{content:"\F0AE4"}.mdi-star-three-points-outline::before{content:"\F0AE5"}.mdi-state-machine::before{content:"\F11EF"}.mdi-steam::before{content:"\F04D3"}.mdi-steering::before{content:"\F04D4"}.mdi-steering-off::before{content:"\F090E"}.mdi-step-backward::before{content:"\F04D5"}.mdi-step-backward-2::before{content:"\F04D6"}.mdi-step-forward::before{content:"\F04D7"}.mdi-step-forward-2::before{content:"\F04D8"}.mdi-stethoscope::before{content:"\F04D9"}.mdi-sticker::before{content:"\F1364"}.mdi-sticker-alert::before{content:"\F1365"}.mdi-sticker-alert-outline::before{content:"\F1366"}.mdi-sticker-check::before{content:"\F1367"}.mdi-sticker-check-outline::before{content:"\F1368"}.mdi-sticker-circle-outline::before{content:"\F05D0"}.mdi-sticker-emoji::before{content:"\F0785"}.mdi-sticker-minus::before{content:"\F1369"}.mdi-sticker-minus-outline::before{content:"\F136A"}.mdi-sticker-outline::before{content:"\F136B"}.mdi-sticker-plus::before{content:"\F136C"}.mdi-sticker-plus-outline::before{content:"\F136D"}.mdi-sticker-remove::before{content:"\F136E"}.mdi-sticker-remove-outline::before{content:"\F136F"}.mdi-sticker-text::before{content:"\F178E"}.mdi-sticker-text-outline::before{content:"\F178F"}.mdi-stocking::before{content:"\F04DA"}.mdi-stomach::before{content:"\F1093"}.mdi-stool::before{content:"\F195D"}.mdi-stool-outline::before{content:"\F195E"}.mdi-stop::before{content:"\F04DB"}.mdi-stop-circle::before{content:"\F0666"}.mdi-stop-circle-outline::before{content:"\F0667"}.mdi-storage-tank::before{content:"\F1A75"}.mdi-storage-tank-outline::before{content:"\F1A76"}.mdi-store::before{content:"\F04DC"}.mdi-store-24-hour::before{content:"\F04DD"}.mdi-store-alert::before{content:"\F18C1"}.mdi-store-alert-outline::before{content:"\F18C2"}.mdi-store-check::before{content:"\F18C3"}.mdi-store-check-outline::before{content:"\F18C4"}.mdi-store-clock::before{content:"\F18C5"}.mdi-store-clock-outline::before{content:"\F18C6"}.mdi-store-cog::before{content:"\F18C7"}.mdi-store-cog-outline::before{content:"\F18C8"}.mdi-store-edit::before{content:"\F18C9"}.mdi-store-edit-outline::before{content:"\F18CA"}.mdi-store-marker::before{content:"\F18CB"}.mdi-store-marker-outline::before{content:"\F18CC"}.mdi-store-minus::before{content:"\F165E"}.mdi-store-minus-outline::before{content:"\F18CD"}.mdi-store-off::before{content:"\F18CE"}.mdi-store-off-outline::before{content:"\F18CF"}.mdi-store-outline::before{content:"\F1361"}.mdi-store-plus::before{content:"\F165F"}.mdi-store-plus-outline::before{content:"\F18D0"}.mdi-store-remove::before{content:"\F1660"}.mdi-store-remove-outline::before{content:"\F18D1"}.mdi-store-search::before{content:"\F18D2"}.mdi-store-search-outline::before{content:"\F18D3"}.mdi-store-settings::before{content:"\F18D4"}.mdi-store-settings-outline::before{content:"\F18D5"}.mdi-storefront::before{content:"\F07C7"}.mdi-storefront-check::before{content:"\F1B7D"}.mdi-storefront-check-outline::before{content:"\F1B7E"}.mdi-storefront-edit::before{content:"\F1B7F"}.mdi-storefront-edit-outline::before{content:"\F1B80"}.mdi-storefront-minus::before{content:"\F1B83"}.mdi-storefront-minus-outline::before{content:"\F1B84"}.mdi-storefront-outline::before{content:"\F10C1"}.mdi-storefront-plus::before{content:"\F1B81"}.mdi-storefront-plus-outline::before{content:"\F1B82"}.mdi-storefront-remove::before{content:"\F1B85"}.mdi-storefront-remove-outline::before{content:"\F1B86"}.mdi-stove::before{content:"\F04DE"}.mdi-strategy::before{content:"\F11D6"}.mdi-stretch-to-page::before{content:"\F0F2B"}.mdi-stretch-to-page-outline::before{content:"\F0F2C"}.mdi-string-lights::before{content:"\F12BA"}.mdi-string-lights-off::before{content:"\F12BB"}.mdi-subdirectory-arrow-left::before{content:"\F060C"}.mdi-subdirectory-arrow-right::before{content:"\F060D"}.mdi-submarine::before{content:"\F156C"}.mdi-subtitles::before{content:"\F0A16"}.mdi-subtitles-outline::before{content:"\F0A17"}.mdi-subway::before{content:"\F06AC"}.mdi-subway-alert-variant::before{content:"\F0D9D"}.mdi-subway-variant::before{content:"\F04DF"}.mdi-summit::before{content:"\F0786"}.mdi-sun-angle::before{content:"\F1B27"}.mdi-sun-angle-outline::before{content:"\F1B28"}.mdi-sun-clock::before{content:"\F1A77"}.mdi-sun-clock-outline::before{content:"\F1A78"}.mdi-sun-compass::before{content:"\F19A5"}.mdi-sun-snowflake::before{content:"\F1796"}.mdi-sun-snowflake-variant::before{content:"\F1A79"}.mdi-sun-thermometer::before{content:"\F18D6"}.mdi-sun-thermometer-outline::before{content:"\F18D7"}.mdi-sun-wireless::before{content:"\F17FE"}.mdi-sun-wireless-outline::before{content:"\F17FF"}.mdi-sunglasses::before{content:"\F04E0"}.mdi-surfing::before{content:"\F1746"}.mdi-surround-sound::before{content:"\F05C5"}.mdi-surround-sound-2-0::before{content:"\F07F0"}.mdi-surround-sound-2-1::before{content:"\F1729"}.mdi-surround-sound-3-1::before{content:"\F07F1"}.mdi-surround-sound-5-1::before{content:"\F07F2"}.mdi-surround-sound-5-1-2::before{content:"\F172A"}.mdi-surround-sound-7-1::before{content:"\F07F3"}.mdi-svg::before{content:"\F0721"}.mdi-swap-horizontal::before{content:"\F04E1"}.mdi-swap-horizontal-bold::before{content:"\F0BCD"}.mdi-swap-horizontal-circle::before{content:"\F0FE1"}.mdi-swap-horizontal-circle-outline::before{content:"\F0FE2"}.mdi-swap-horizontal-hidden::before{content:"\F1D0E"}.mdi-swap-horizontal-variant::before{content:"\F08C1"}.mdi-swap-vertical::before{content:"\F04E2"}.mdi-swap-vertical-bold::before{content:"\F0BCE"}.mdi-swap-vertical-circle::before{content:"\F0FE3"}.mdi-swap-vertical-circle-outline::before{content:"\F0FE4"}.mdi-swap-vertical-variant::before{content:"\F08C2"}.mdi-swim::before{content:"\F04E3"}.mdi-switch::before{content:"\F04E4"}.mdi-sword::before{content:"\F04E5"}.mdi-sword-cross::before{content:"\F0787"}.mdi-syllabary-hangul::before{content:"\F1333"}.mdi-syllabary-hiragana::before{content:"\F1334"}.mdi-syllabary-katakana::before{content:"\F1335"}.mdi-syllabary-katakana-halfwidth::before{content:"\F1336"}.mdi-symbol::before{content:"\F1501"}.mdi-symfony::before{content:"\F0AE6"}.mdi-synagogue::before{content:"\F1B04"}.mdi-synagogue-outline::before{content:"\F1B05"}.mdi-sync::before{content:"\F04E6"}.mdi-sync-alert::before{content:"\F04E7"}.mdi-sync-circle::before{content:"\F1378"}.mdi-sync-off::before{content:"\F04E8"}.mdi-tab::before{content:"\F04E9"}.mdi-tab-minus::before{content:"\F0B4B"}.mdi-tab-plus::before{content:"\F075C"}.mdi-tab-remove::before{content:"\F0B4C"}.mdi-tab-search::before{content:"\F199E"}.mdi-tab-unselected::before{content:"\F04EA"}.mdi-table::before{content:"\F04EB"}.mdi-table-account::before{content:"\F13B9"}.mdi-table-alert::before{content:"\F13BA"}.mdi-table-arrow-down::before{content:"\F13BB"}.mdi-table-arrow-left::before{content:"\F13BC"}.mdi-table-arrow-right::before{content:"\F13BD"}.mdi-table-arrow-up::before{content:"\F13BE"}.mdi-table-border::before{content:"\F0A18"}.mdi-table-cancel::before{content:"\F13BF"}.mdi-table-chair::before{content:"\F1061"}.mdi-table-check::before{content:"\F13C0"}.mdi-table-clock::before{content:"\F13C1"}.mdi-table-cog::before{content:"\F13C2"}.mdi-table-column::before{content:"\F0835"}.mdi-table-column-plus-after::before{content:"\F04EC"}.mdi-table-column-plus-before::before{content:"\F04ED"}.mdi-table-column-remove::before{content:"\F04EE"}.mdi-table-column-width::before{content:"\F04EF"}.mdi-table-edit::before{content:"\F04F0"}.mdi-table-eye::before{content:"\F1094"}.mdi-table-eye-off::before{content:"\F13C3"}.mdi-table-filter::before{content:"\F1B8C"}.mdi-table-furniture::before{content:"\F05BC"}.mdi-table-headers-eye::before{content:"\F121D"}.mdi-table-headers-eye-off::before{content:"\F121E"}.mdi-table-heart::before{content:"\F13C4"}.mdi-table-key::before{content:"\F13C5"}.mdi-table-large::before{content:"\F04F1"}.mdi-table-large-plus::before{content:"\F0F87"}.mdi-table-large-remove::before{content:"\F0F88"}.mdi-table-lock::before{content:"\F13C6"}.mdi-table-merge-cells::before{content:"\F09A6"}.mdi-table-minus::before{content:"\F13C7"}.mdi-table-multiple::before{content:"\F13C8"}.mdi-table-network::before{content:"\F13C9"}.mdi-table-of-contents::before{content:"\F0836"}.mdi-table-off::before{content:"\F13CA"}.mdi-table-picnic::before{content:"\F1743"}.mdi-table-pivot::before{content:"\F183C"}.mdi-table-plus::before{content:"\F0A75"}.mdi-table-question::before{content:"\F1B21"}.mdi-table-refresh::before{content:"\F13A0"}.mdi-table-remove::before{content:"\F0A76"}.mdi-table-row::before{content:"\F0837"}.mdi-table-row-height::before{content:"\F04F2"}.mdi-table-row-plus-after::before{content:"\F04F3"}.mdi-table-row-plus-before::before{content:"\F04F4"}.mdi-table-row-remove::before{content:"\F04F5"}.mdi-table-search::before{content:"\F090F"}.mdi-table-settings::before{content:"\F0838"}.mdi-table-split-cell::before{content:"\F142A"}.mdi-table-star::before{content:"\F13CB"}.mdi-table-sync::before{content:"\F13A1"}.mdi-table-tennis::before{content:"\F0E68"}.mdi-tablet::before{content:"\F04F6"}.mdi-tablet-cellphone::before{content:"\F09A7"}.mdi-tablet-dashboard::before{content:"\F0ECE"}.mdi-taco::before{content:"\F0762"}.mdi-tag::before{content:"\F04F9"}.mdi-tag-arrow-down::before{content:"\F172B"}.mdi-tag-arrow-down-outline::before{content:"\F172C"}.mdi-tag-arrow-left::before{content:"\F172D"}.mdi-tag-arrow-left-outline::before{content:"\F172E"}.mdi-tag-arrow-right::before{content:"\F172F"}.mdi-tag-arrow-right-outline::before{content:"\F1730"}.mdi-tag-arrow-up::before{content:"\F1731"}.mdi-tag-arrow-up-outline::before{content:"\F1732"}.mdi-tag-check::before{content:"\F1A7A"}.mdi-tag-check-outline::before{content:"\F1A7B"}.mdi-tag-edit::before{content:"\F1C9C"}.mdi-tag-edit-outline::before{content:"\F1C9D"}.mdi-tag-faces::before{content:"\F04FA"}.mdi-tag-heart::before{content:"\F068B"}.mdi-tag-heart-outline::before{content:"\F0BCF"}.mdi-tag-hidden::before{content:"\F1C76"}.mdi-tag-minus::before{content:"\F0910"}.mdi-tag-minus-outline::before{content:"\F121F"}.mdi-tag-multiple::before{content:"\F04FB"}.mdi-tag-multiple-outline::before{content:"\F12F7"}.mdi-tag-off::before{content:"\F1220"}.mdi-tag-off-outline::before{content:"\F1221"}.mdi-tag-outline::before{content:"\F04FC"}.mdi-tag-plus::before{content:"\F0722"}.mdi-tag-plus-outline::before{content:"\F1222"}.mdi-tag-remove::before{content:"\F0723"}.mdi-tag-remove-outline::before{content:"\F1223"}.mdi-tag-search::before{content:"\F1907"}.mdi-tag-search-outline::before{content:"\F1908"}.mdi-tag-text::before{content:"\F1224"}.mdi-tag-text-outline::before{content:"\F04FD"}.mdi-tailwind::before{content:"\F13FF"}.mdi-tally-mark-1::before{content:"\F1ABC"}.mdi-tally-mark-2::before{content:"\F1ABD"}.mdi-tally-mark-3::before{content:"\F1ABE"}.mdi-tally-mark-4::before{content:"\F1ABF"}.mdi-tally-mark-5::before{content:"\F1AC0"}.mdi-tangram::before{content:"\F04F8"}.mdi-tank::before{content:"\F0D3A"}.mdi-tanker-truck::before{content:"\F0FE5"}.mdi-tape-drive::before{content:"\F16DF"}.mdi-tape-measure::before{content:"\F0B4D"}.mdi-target::before{content:"\F04FE"}.mdi-target-account::before{content:"\F0BD0"}.mdi-target-variant::before{content:"\F0A77"}.mdi-taxi::before{content:"\F04FF"}.mdi-tea::before{content:"\F0D9E"}.mdi-tea-outline::before{content:"\F0D9F"}.mdi-teamviewer::before{content:"\F0500"}.mdi-teddy-bear::before{content:"\F18FB"}.mdi-telescope::before{content:"\F0B4E"}.mdi-television::before{content:"\F0502"}.mdi-television-ambient-light::before{content:"\F1356"}.mdi-television-box::before{content:"\F0839"}.mdi-television-classic::before{content:"\F07F4"}.mdi-television-classic-off::before{content:"\F083A"}.mdi-television-guide::before{content:"\F0503"}.mdi-television-off::before{content:"\F083B"}.mdi-television-pause::before{content:"\F0F89"}.mdi-television-play::before{content:"\F0ECF"}.mdi-television-shimmer::before{content:"\F1110"}.mdi-television-speaker::before{content:"\F1B1B"}.mdi-television-speaker-off::before{content:"\F1B1C"}.mdi-television-stop::before{content:"\F0F8A"}.mdi-temperature-celsius::before{content:"\F0504"}.mdi-temperature-fahrenheit::before{content:"\F0505"}.mdi-temperature-kelvin::before{content:"\F0506"}.mdi-temple-buddhist::before{content:"\F1B06"}.mdi-temple-buddhist-outline::before{content:"\F1B07"}.mdi-temple-hindu::before{content:"\F1B08"}.mdi-temple-hindu-outline::before{content:"\F1B09"}.mdi-tennis::before{content:"\F0DA0"}.mdi-tennis-ball::before{content:"\F0507"}.mdi-tennis-ball-outline::before{content:"\F1C5F"}.mdi-tent::before{content:"\F0508"}.mdi-terraform::before{content:"\F1062"}.mdi-terrain::before{content:"\F0509"}.mdi-test-tube::before{content:"\F0668"}.mdi-test-tube-empty::before{content:"\F0911"}.mdi-test-tube-off::before{content:"\F0912"}.mdi-text::before{content:"\F09A8"}.mdi-text-account::before{content:"\F1570"}.mdi-text-box::before{content:"\F021A"}.mdi-text-box-check::before{content:"\F0EA6"}.mdi-text-box-check-outline::before{content:"\F0EA7"}.mdi-text-box-edit::before{content:"\F1A7C"}.mdi-text-box-edit-outline::before{content:"\F1A7D"}.mdi-text-box-minus::before{content:"\F0EA8"}.mdi-text-box-minus-outline::before{content:"\F0EA9"}.mdi-text-box-multiple::before{content:"\F0AB7"}.mdi-text-box-multiple-outline::before{content:"\F0AB8"}.mdi-text-box-outline::before{content:"\F09ED"}.mdi-text-box-plus::before{content:"\F0EAA"}.mdi-text-box-plus-outline::before{content:"\F0EAB"}.mdi-text-box-remove::before{content:"\F0EAC"}.mdi-text-box-remove-outline::before{content:"\F0EAD"}.mdi-text-box-search::before{content:"\F0EAE"}.mdi-text-box-search-outline::before{content:"\F0EAF"}.mdi-text-long::before{content:"\F09AA"}.mdi-text-recognition::before{content:"\F113D"}.mdi-text-search::before{content:"\F13B8"}.mdi-text-search-variant::before{content:"\F1A7E"}.mdi-text-shadow::before{content:"\F0669"}.mdi-text-short::before{content:"\F09A9"}.mdi-texture::before{content:"\F050C"}.mdi-texture-box::before{content:"\F0FE6"}.mdi-theater::before{content:"\F050D"}.mdi-theme-light-dark::before{content:"\F050E"}.mdi-thermometer::before{content:"\F050F"}.mdi-thermometer-alert::before{content:"\F0E01"}.mdi-thermometer-auto::before{content:"\F1B0F"}.mdi-thermometer-bluetooth::before{content:"\F1895"}.mdi-thermometer-check::before{content:"\F1A7F"}.mdi-thermometer-chevron-down::before{content:"\F0E02"}.mdi-thermometer-chevron-up::before{content:"\F0E03"}.mdi-thermometer-high::before{content:"\F10C2"}.mdi-thermometer-lines::before{content:"\F0510"}.mdi-thermometer-low::before{content:"\F10C3"}.mdi-thermometer-minus::before{content:"\F0E04"}.mdi-thermometer-off::before{content:"\F1531"}.mdi-thermometer-plus::before{content:"\F0E05"}.mdi-thermometer-probe::before{content:"\F1B2B"}.mdi-thermometer-probe-off::before{content:"\F1B2C"}.mdi-thermometer-water::before{content:"\F1A80"}.mdi-thermostat::before{content:"\F0393"}.mdi-thermostat-auto::before{content:"\F1B17"}.mdi-thermostat-box::before{content:"\F0891"}.mdi-thermostat-box-auto::before{content:"\F1B18"}.mdi-thermostat-cog::before{content:"\F1C80"}.mdi-thought-bubble::before{content:"\F07F6"}.mdi-thought-bubble-outline::before{content:"\F07F7"}.mdi-thumb-down::before{content:"\F0511"}.mdi-thumb-down-outline::before{content:"\F0512"}.mdi-thumb-up::before{content:"\F0513"}.mdi-thumb-up-outline::before{content:"\F0514"}.mdi-thumbs-up-down::before{content:"\F0515"}.mdi-thumbs-up-down-outline::before{content:"\F1914"}.mdi-ticket::before{content:"\F0516"}.mdi-ticket-account::before{content:"\F0517"}.mdi-ticket-confirmation::before{content:"\F0518"}.mdi-ticket-confirmation-outline::before{content:"\F13AA"}.mdi-ticket-outline::before{content:"\F0913"}.mdi-ticket-percent::before{content:"\F0724"}.mdi-ticket-percent-outline::before{content:"\F142B"}.mdi-tie::before{content:"\F0519"}.mdi-tilde::before{content:"\F0725"}.mdi-tilde-off::before{content:"\F18F3"}.mdi-timelapse::before{content:"\F051A"}.mdi-timeline::before{content:"\F0BD1"}.mdi-timeline-alert::before{content:"\F0F95"}.mdi-timeline-alert-outline::before{content:"\F0F98"}.mdi-timeline-check::before{content:"\F1532"}.mdi-timeline-check-outline::before{content:"\F1533"}.mdi-timeline-clock::before{content:"\F11FB"}.mdi-timeline-clock-outline::before{content:"\F11FC"}.mdi-timeline-minus::before{content:"\F1534"}.mdi-timeline-minus-outline::before{content:"\F1535"}.mdi-timeline-outline::before{content:"\F0BD2"}.mdi-timeline-plus::before{content:"\F0F96"}.mdi-timeline-plus-outline::before{content:"\F0F97"}.mdi-timeline-question::before{content:"\F0F99"}.mdi-timeline-question-outline::before{content:"\F0F9A"}.mdi-timeline-remove::before{content:"\F1536"}.mdi-timeline-remove-outline::before{content:"\F1537"}.mdi-timeline-text::before{content:"\F0BD3"}.mdi-timeline-text-outline::before{content:"\F0BD4"}.mdi-timer::before{content:"\F13AB"}.mdi-timer-10::before{content:"\F051C"}.mdi-timer-3::before{content:"\F051D"}.mdi-timer-alert::before{content:"\F1ACC"}.mdi-timer-alert-outline::before{content:"\F1ACD"}.mdi-timer-cancel::before{content:"\F1ACE"}.mdi-timer-cancel-outline::before{content:"\F1ACF"}.mdi-timer-check::before{content:"\F1AD0"}.mdi-timer-check-outline::before{content:"\F1AD1"}.mdi-timer-cog::before{content:"\F1925"}.mdi-timer-cog-outline::before{content:"\F1926"}.mdi-timer-edit::before{content:"\F1AD2"}.mdi-timer-edit-outline::before{content:"\F1AD3"}.mdi-timer-lock::before{content:"\F1AD4"}.mdi-timer-lock-open::before{content:"\F1AD5"}.mdi-timer-lock-open-outline::before{content:"\F1AD6"}.mdi-timer-lock-outline::before{content:"\F1AD7"}.mdi-timer-marker::before{content:"\F1AD8"}.mdi-timer-marker-outline::before{content:"\F1AD9"}.mdi-timer-minus::before{content:"\F1ADA"}.mdi-timer-minus-outline::before{content:"\F1ADB"}.mdi-timer-music::before{content:"\F1ADC"}.mdi-timer-music-outline::before{content:"\F1ADD"}.mdi-timer-off::before{content:"\F13AC"}.mdi-timer-off-outline::before{content:"\F051E"}.mdi-timer-outline::before{content:"\F051B"}.mdi-timer-pause::before{content:"\F1ADE"}.mdi-timer-pause-outline::before{content:"\F1ADF"}.mdi-timer-play::before{content:"\F1AE0"}.mdi-timer-play-outline::before{content:"\F1AE1"}.mdi-timer-plus::before{content:"\F1AE2"}.mdi-timer-plus-outline::before{content:"\F1AE3"}.mdi-timer-refresh::before{content:"\F1AE4"}.mdi-timer-refresh-outline::before{content:"\F1AE5"}.mdi-timer-remove::before{content:"\F1AE6"}.mdi-timer-remove-outline::before{content:"\F1AE7"}.mdi-timer-sand::before{content:"\F051F"}.mdi-timer-sand-complete::before{content:"\F199F"}.mdi-timer-sand-empty::before{content:"\F06AD"}.mdi-timer-sand-full::before{content:"\F078C"}.mdi-timer-sand-paused::before{content:"\F19A0"}.mdi-timer-settings::before{content:"\F1923"}.mdi-timer-settings-outline::before{content:"\F1924"}.mdi-timer-star::before{content:"\F1AE8"}.mdi-timer-star-outline::before{content:"\F1AE9"}.mdi-timer-stop::before{content:"\F1AEA"}.mdi-timer-stop-outline::before{content:"\F1AEB"}.mdi-timer-sync::before{content:"\F1AEC"}.mdi-timer-sync-outline::before{content:"\F1AED"}.mdi-timetable::before{content:"\F0520"}.mdi-tire::before{content:"\F1896"}.mdi-toaster::before{content:"\F1063"}.mdi-toaster-off::before{content:"\F11B7"}.mdi-toaster-oven::before{content:"\F0CD3"}.mdi-toggle-switch::before{content:"\F0521"}.mdi-toggle-switch-off::before{content:"\F0522"}.mdi-toggle-switch-off-outline::before{content:"\F0A19"}.mdi-toggle-switch-outline::before{content:"\F0A1A"}.mdi-toggle-switch-variant::before{content:"\F1A25"}.mdi-toggle-switch-variant-off::before{content:"\F1A26"}.mdi-toilet::before{content:"\F09AB"}.mdi-toolbox::before{content:"\F09AC"}.mdi-toolbox-outline::before{content:"\F09AD"}.mdi-tools::before{content:"\F1064"}.mdi-tooltip::before{content:"\F0523"}.mdi-tooltip-account::before{content:"\F000C"}.mdi-tooltip-cellphone::before{content:"\F183B"}.mdi-tooltip-check::before{content:"\F155C"}.mdi-tooltip-check-outline::before{content:"\F155D"}.mdi-tooltip-edit::before{content:"\F0524"}.mdi-tooltip-edit-outline::before{content:"\F12C5"}.mdi-tooltip-image::before{content:"\F0525"}.mdi-tooltip-image-outline::before{content:"\F0BD5"}.mdi-tooltip-minus::before{content:"\F155E"}.mdi-tooltip-minus-outline::before{content:"\F155F"}.mdi-tooltip-outline::before{content:"\F0526"}.mdi-tooltip-plus::before{content:"\F0BD6"}.mdi-tooltip-plus-outline::before{content:"\F0527"}.mdi-tooltip-question::before{content:"\F1BBA"}.mdi-tooltip-question-outline::before{content:"\F1BBB"}.mdi-tooltip-remove::before{content:"\F1560"}.mdi-tooltip-remove-outline::before{content:"\F1561"}.mdi-tooltip-text::before{content:"\F0528"}.mdi-tooltip-text-outline::before{content:"\F0BD7"}.mdi-tooth::before{content:"\F08C3"}.mdi-tooth-outline::before{content:"\F0529"}.mdi-toothbrush::before{content:"\F1129"}.mdi-toothbrush-electric::before{content:"\F112C"}.mdi-toothbrush-paste::before{content:"\F112A"}.mdi-torch::before{content:"\F1606"}.mdi-tortoise::before{content:"\F0D3B"}.mdi-toslink::before{content:"\F12B8"}.mdi-touch-text-outline::before{content:"\F1C60"}.mdi-tournament::before{content:"\F09AE"}.mdi-tow-truck::before{content:"\F083C"}.mdi-tower-beach::before{content:"\F0681"}.mdi-tower-fire::before{content:"\F0682"}.mdi-town-hall::before{content:"\F1875"}.mdi-toy-brick::before{content:"\F1288"}.mdi-toy-brick-marker::before{content:"\F1289"}.mdi-toy-brick-marker-outline::before{content:"\F128A"}.mdi-toy-brick-minus::before{content:"\F128B"}.mdi-toy-brick-minus-outline::before{content:"\F128C"}.mdi-toy-brick-outline::before{content:"\F128D"}.mdi-toy-brick-plus::before{content:"\F128E"}.mdi-toy-brick-plus-outline::before{content:"\F128F"}.mdi-toy-brick-remove::before{content:"\F1290"}.mdi-toy-brick-remove-outline::before{content:"\F1291"}.mdi-toy-brick-search::before{content:"\F1292"}.mdi-toy-brick-search-outline::before{content:"\F1293"}.mdi-track-light::before{content:"\F0914"}.mdi-track-light-off::before{content:"\F1B01"}.mdi-trackpad::before{content:"\F07F8"}.mdi-trackpad-lock::before{content:"\F0933"}.mdi-tractor::before{content:"\F0892"}.mdi-tractor-variant::before{content:"\F14C4"}.mdi-trademark::before{content:"\F0A78"}.mdi-traffic-cone::before{content:"\F137C"}.mdi-traffic-light::before{content:"\F052B"}.mdi-traffic-light-outline::before{content:"\F182A"}.mdi-train::before{content:"\F052C"}.mdi-train-bus::before{content:"\F1CC7"}.mdi-train-car::before{content:"\F0BD8"}.mdi-train-car-autorack::before{content:"\F1B2D"}.mdi-train-car-box::before{content:"\F1B2E"}.mdi-train-car-box-full::before{content:"\F1B2F"}.mdi-train-car-box-open::before{content:"\F1B30"}.mdi-train-car-caboose::before{content:"\F1B31"}.mdi-train-car-centerbeam::before{content:"\F1B32"}.mdi-train-car-centerbeam-full::before{content:"\F1B33"}.mdi-train-car-container::before{content:"\F1B34"}.mdi-train-car-flatbed::before{content:"\F1B35"}.mdi-train-car-flatbed-car::before{content:"\F1B36"}.mdi-train-car-flatbed-tank::before{content:"\F1B37"}.mdi-train-car-gondola::before{content:"\F1B38"}.mdi-train-car-gondola-full::before{content:"\F1B39"}.mdi-train-car-hopper::before{content:"\F1B3A"}.mdi-train-car-hopper-covered::before{content:"\F1B3B"}.mdi-train-car-hopper-full::before{content:"\F1B3C"}.mdi-train-car-intermodal::before{content:"\F1B3D"}.mdi-train-car-passenger::before{content:"\F1733"}.mdi-train-car-passenger-door::before{content:"\F1734"}.mdi-train-car-passenger-door-open::before{content:"\F1735"}.mdi-train-car-passenger-variant::before{content:"\F1736"}.mdi-train-car-tank::before{content:"\F1B3E"}.mdi-train-variant::before{content:"\F08C4"}.mdi-tram::before{content:"\F052D"}.mdi-tram-side::before{content:"\F0FE7"}.mdi-transcribe::before{content:"\F052E"}.mdi-transcribe-close::before{content:"\F052F"}.mdi-transfer::before{content:"\F1065"}.mdi-transfer-down::before{content:"\F0DA1"}.mdi-transfer-left::before{content:"\F0DA2"}.mdi-transfer-right::before{content:"\F0530"}.mdi-transfer-up::before{content:"\F0DA3"}.mdi-transit-connection::before{content:"\F0D3C"}.mdi-transit-connection-horizontal::before{content:"\F1546"}.mdi-transit-connection-variant::before{content:"\F0D3D"}.mdi-transit-detour::before{content:"\F0F8B"}.mdi-transit-skip::before{content:"\F1515"}.mdi-transit-transfer::before{content:"\F06AE"}.mdi-transition::before{content:"\F0915"}.mdi-transition-masked::before{content:"\F0916"}.mdi-translate::before{content:"\F05CA"}.mdi-translate-off::before{content:"\F0E06"}.mdi-translate-variant::before{content:"\F1B99"}.mdi-transmission-tower::before{content:"\F0D3E"}.mdi-transmission-tower-export::before{content:"\F192C"}.mdi-transmission-tower-import::before{content:"\F192D"}.mdi-transmission-tower-off::before{content:"\F19DD"}.mdi-trash-can::before{content:"\F0A79"}.mdi-trash-can-outline::before{content:"\F0A7A"}.mdi-tray::before{content:"\F1294"}.mdi-tray-alert::before{content:"\F1295"}.mdi-tray-arrow-down::before{content:"\F0120"}.mdi-tray-arrow-up::before{content:"\F011D"}.mdi-tray-full::before{content:"\F1296"}.mdi-tray-minus::before{content:"\F1297"}.mdi-tray-plus::before{content:"\F1298"}.mdi-tray-remove::before{content:"\F1299"}.mdi-treasure-chest::before{content:"\F0726"}.mdi-treasure-chest-outline::before{content:"\F1C77"}.mdi-tree::before{content:"\F0531"}.mdi-tree-outline::before{content:"\F0E69"}.mdi-trello::before{content:"\F0532"}.mdi-trending-down::before{content:"\F0533"}.mdi-trending-neutral::before{content:"\F0534"}.mdi-trending-up::before{content:"\F0535"}.mdi-triangle::before{content:"\F0536"}.mdi-triangle-down::before{content:"\F1C56"}.mdi-triangle-down-outline::before{content:"\F1C57"}.mdi-triangle-outline::before{content:"\F0537"}.mdi-triangle-small-down::before{content:"\F1A09"}.mdi-triangle-small-up::before{content:"\F1A0A"}.mdi-triangle-wave::before{content:"\F147C"}.mdi-triforce::before{content:"\F0BD9"}.mdi-trophy::before{content:"\F0538"}.mdi-trophy-award::before{content:"\F0539"}.mdi-trophy-broken::before{content:"\F0DA4"}.mdi-trophy-outline::before{content:"\F053A"}.mdi-trophy-variant::before{content:"\F053B"}.mdi-trophy-variant-outline::before{content:"\F053C"}.mdi-truck::before{content:"\F053D"}.mdi-truck-alert::before{content:"\F19DE"}.mdi-truck-alert-outline::before{content:"\F19DF"}.mdi-truck-cargo-container::before{content:"\F18D8"}.mdi-truck-check::before{content:"\F0CD4"}.mdi-truck-check-outline::before{content:"\F129A"}.mdi-truck-delivery::before{content:"\F053E"}.mdi-truck-delivery-outline::before{content:"\F129B"}.mdi-truck-fast::before{content:"\F0788"}.mdi-truck-fast-outline::before{content:"\F129C"}.mdi-truck-flatbed::before{content:"\F1891"}.mdi-truck-minus::before{content:"\F19AE"}.mdi-truck-minus-outline::before{content:"\F19BD"}.mdi-truck-off-road::before{content:"\F1C9E"}.mdi-truck-off-road-off::before{content:"\F1C9F"}.mdi-truck-outline::before{content:"\F129D"}.mdi-truck-plus::before{content:"\F19AD"}.mdi-truck-plus-outline::before{content:"\F19BC"}.mdi-truck-remove::before{content:"\F19AF"}.mdi-truck-remove-outline::before{content:"\F19BE"}.mdi-truck-snowflake::before{content:"\F19A6"}.mdi-truck-trailer::before{content:"\F0727"}.mdi-trumpet::before{content:"\F1096"}.mdi-tshirt-crew::before{content:"\F0A7B"}.mdi-tshirt-crew-outline::before{content:"\F053F"}.mdi-tshirt-v::before{content:"\F0A7C"}.mdi-tshirt-v-outline::before{content:"\F0540"}.mdi-tsunami::before{content:"\F1A81"}.mdi-tumble-dryer::before{content:"\F0917"}.mdi-tumble-dryer-alert::before{content:"\F11BA"}.mdi-tumble-dryer-off::before{content:"\F11BB"}.mdi-tune::before{content:"\F062E"}.mdi-tune-variant::before{content:"\F1542"}.mdi-tune-vertical::before{content:"\F066A"}.mdi-tune-vertical-variant::before{content:"\F1543"}.mdi-tunnel::before{content:"\F183D"}.mdi-tunnel-outline::before{content:"\F183E"}.mdi-turbine::before{content:"\F1A82"}.mdi-turkey::before{content:"\F171B"}.mdi-turnstile::before{content:"\F0CD5"}.mdi-turnstile-outline::before{content:"\F0CD6"}.mdi-turtle::before{content:"\F0CD7"}.mdi-twitch::before{content:"\F0543"}.mdi-twitter::before{content:"\F0544"}.mdi-two-factor-authentication::before{content:"\F09AF"}.mdi-typewriter::before{content:"\F0F2D"}.mdi-ubisoft::before{content:"\F0BDA"}.mdi-ubuntu::before{content:"\F0548"}.mdi-ufo::before{content:"\F10C4"}.mdi-ufo-outline::before{content:"\F10C5"}.mdi-ultra-high-definition::before{content:"\F07F9"}.mdi-umbraco::before{content:"\F0549"}.mdi-umbrella::before{content:"\F054A"}.mdi-umbrella-beach::before{content:"\F188A"}.mdi-umbrella-beach-outline::before{content:"\F188B"}.mdi-umbrella-closed::before{content:"\F09B0"}.mdi-umbrella-closed-outline::before{content:"\F13E2"}.mdi-umbrella-closed-variant::before{content:"\F13E1"}.mdi-umbrella-outline::before{content:"\F054B"}.mdi-underwear-outline::before{content:"\F1D0F"}.mdi-undo::before{content:"\F054C"}.mdi-undo-variant::before{content:"\F054D"}.mdi-unfold-less-horizontal::before{content:"\F054E"}.mdi-unfold-less-vertical::before{content:"\F0760"}.mdi-unfold-more-horizontal::before{content:"\F054F"}.mdi-unfold-more-vertical::before{content:"\F0761"}.mdi-ungroup::before{content:"\F0550"}.mdi-unicode::before{content:"\F0ED0"}.mdi-unicorn::before{content:"\F15C2"}.mdi-unicorn-variant::before{content:"\F15C3"}.mdi-unicycle::before{content:"\F15E5"}.mdi-unity::before{content:"\F06AF"}.mdi-unreal::before{content:"\F09B1"}.mdi-update::before{content:"\F06B0"}.mdi-upload::before{content:"\F0552"}.mdi-upload-box::before{content:"\F1D10"}.mdi-upload-box-outline::before{content:"\F1D11"}.mdi-upload-circle::before{content:"\F1D12"}.mdi-upload-circle-outline::before{content:"\F1D13"}.mdi-upload-lock::before{content:"\F1373"}.mdi-upload-lock-outline::before{content:"\F1374"}.mdi-upload-multiple::before{content:"\F083D"}.mdi-upload-multiple-outline::before{content:"\F1D14"}.mdi-upload-network::before{content:"\F06F6"}.mdi-upload-network-outline::before{content:"\F0CD8"}.mdi-upload-off::before{content:"\F10C6"}.mdi-upload-off-outline::before{content:"\F10C7"}.mdi-upload-outline::before{content:"\F0E07"}.mdi-usb::before{content:"\F0553"}.mdi-usb-c-port::before{content:"\F1CBF"}.mdi-usb-flash-drive::before{content:"\F129E"}.mdi-usb-flash-drive-outline::before{content:"\F129F"}.mdi-usb-port::before{content:"\F11F0"}.mdi-vacuum::before{content:"\F19A1"}.mdi-vacuum-outline::before{content:"\F19A2"}.mdi-valve::before{content:"\F1066"}.mdi-valve-closed::before{content:"\F1067"}.mdi-valve-open::before{content:"\F1068"}.mdi-van-passenger::before{content:"\F07FA"}.mdi-van-utility::before{content:"\F07FB"}.mdi-vanish::before{content:"\F07FC"}.mdi-vanish-quarter::before{content:"\F1554"}.mdi-vanity-light::before{content:"\F11E1"}.mdi-variable::before{content:"\F0AE7"}.mdi-variable-box::before{content:"\F1111"}.mdi-vector-arrange-above::before{content:"\F0554"}.mdi-vector-arrange-below::before{content:"\F0555"}.mdi-vector-bezier::before{content:"\F0AE8"}.mdi-vector-circle::before{content:"\F0556"}.mdi-vector-circle-variant::before{content:"\F0557"}.mdi-vector-combine::before{content:"\F0558"}.mdi-vector-curve::before{content:"\F0559"}.mdi-vector-difference::before{content:"\F055A"}.mdi-vector-difference-ab::before{content:"\F055B"}.mdi-vector-difference-ba::before{content:"\F055C"}.mdi-vector-ellipse::before{content:"\F0893"}.mdi-vector-intersection::before{content:"\F055D"}.mdi-vector-line::before{content:"\F055E"}.mdi-vector-link::before{content:"\F0FE8"}.mdi-vector-point::before{content:"\F01C4"}.mdi-vector-point-edit::before{content:"\F09E8"}.mdi-vector-point-minus::before{content:"\F1B78"}.mdi-vector-point-plus::before{content:"\F1B79"}.mdi-vector-point-select::before{content:"\F055F"}.mdi-vector-polygon::before{content:"\F0560"}.mdi-vector-polygon-variant::before{content:"\F1856"}.mdi-vector-polyline::before{content:"\F0561"}.mdi-vector-polyline-edit::before{content:"\F1225"}.mdi-vector-polyline-minus::before{content:"\F1226"}.mdi-vector-polyline-plus::before{content:"\F1227"}.mdi-vector-polyline-remove::before{content:"\F1228"}.mdi-vector-radius::before{content:"\F074A"}.mdi-vector-rectangle::before{content:"\F05C6"}.mdi-vector-selection::before{content:"\F0562"}.mdi-vector-square::before{content:"\F0001"}.mdi-vector-square-close::before{content:"\F1857"}.mdi-vector-square-edit::before{content:"\F18D9"}.mdi-vector-square-minus::before{content:"\F18DA"}.mdi-vector-square-open::before{content:"\F1858"}.mdi-vector-square-plus::before{content:"\F18DB"}.mdi-vector-square-remove::before{content:"\F18DC"}.mdi-vector-triangle::before{content:"\F0563"}.mdi-vector-union::before{content:"\F0564"}.mdi-vhs::before{content:"\F0A1B"}.mdi-vibrate::before{content:"\F0566"}.mdi-vibrate-off::before{content:"\F0CD9"}.mdi-video::before{content:"\F0567"}.mdi-video-2d::before{content:"\F1A1C"}.mdi-video-3d::before{content:"\F07FD"}.mdi-video-3d-off::before{content:"\F13D9"}.mdi-video-3d-variant::before{content:"\F0ED1"}.mdi-video-4k-box::before{content:"\F083E"}.mdi-video-account::before{content:"\F0919"}.mdi-video-box::before{content:"\F00FD"}.mdi-video-box-off::before{content:"\F00FE"}.mdi-video-check::before{content:"\F1069"}.mdi-video-check-outline::before{content:"\F106A"}.mdi-video-high-definition::before{content:"\F152E"}.mdi-video-image::before{content:"\F091A"}.mdi-video-input-antenna::before{content:"\F083F"}.mdi-video-input-component::before{content:"\F0840"}.mdi-video-input-hdmi::before{content:"\F0841"}.mdi-video-input-scart::before{content:"\F0F8C"}.mdi-video-input-svideo::before{content:"\F0842"}.mdi-video-marker::before{content:"\F19A9"}.mdi-video-marker-outline::before{content:"\F19AA"}.mdi-video-minus::before{content:"\F09B2"}.mdi-video-minus-outline::before{content:"\F02BA"}.mdi-video-off::before{content:"\F0568"}.mdi-video-off-outline::before{content:"\F0BDB"}.mdi-video-outline::before{content:"\F0BDC"}.mdi-video-plus::before{content:"\F09B3"}.mdi-video-plus-outline::before{content:"\F01D3"}.mdi-video-stabilization::before{content:"\F091B"}.mdi-video-standard-definition::before{content:"\F1CA0"}.mdi-video-switch::before{content:"\F0569"}.mdi-video-switch-outline::before{content:"\F0790"}.mdi-video-vintage::before{content:"\F0A1C"}.mdi-video-wireless::before{content:"\F0ED2"}.mdi-video-wireless-outline::before{content:"\F0ED3"}.mdi-view-agenda::before{content:"\F056A"}.mdi-view-agenda-outline::before{content:"\F11D8"}.mdi-view-array::before{content:"\F056B"}.mdi-view-array-outline::before{content:"\F1485"}.mdi-view-carousel::before{content:"\F056C"}.mdi-view-carousel-outline::before{content:"\F1486"}.mdi-view-column::before{content:"\F056D"}.mdi-view-column-outline::before{content:"\F1487"}.mdi-view-comfy::before{content:"\F0E6A"}.mdi-view-comfy-outline::before{content:"\F1488"}.mdi-view-compact::before{content:"\F0E6B"}.mdi-view-compact-outline::before{content:"\F0E6C"}.mdi-view-dashboard::before{content:"\F056E"}.mdi-view-dashboard-edit::before{content:"\F1947"}.mdi-view-dashboard-edit-outline::before{content:"\F1948"}.mdi-view-dashboard-outline::before{content:"\F0A1D"}.mdi-view-dashboard-variant::before{content:"\F0843"}.mdi-view-dashboard-variant-outline::before{content:"\F1489"}.mdi-view-day::before{content:"\F056F"}.mdi-view-day-outline::before{content:"\F148A"}.mdi-view-gallery::before{content:"\F1888"}.mdi-view-gallery-outline::before{content:"\F1889"}.mdi-view-grid::before{content:"\F0570"}.mdi-view-grid-compact::before{content:"\F1C61"}.mdi-view-grid-outline::before{content:"\F11D9"}.mdi-view-grid-plus::before{content:"\F0F8D"}.mdi-view-grid-plus-outline::before{content:"\F11DA"}.mdi-view-headline::before{content:"\F0571"}.mdi-view-list::before{content:"\F0572"}.mdi-view-list-outline::before{content:"\F148B"}.mdi-view-module::before{content:"\F0573"}.mdi-view-module-outline::before{content:"\F148C"}.mdi-view-parallel::before{content:"\F0728"}.mdi-view-parallel-outline::before{content:"\F148D"}.mdi-view-quilt::before{content:"\F0574"}.mdi-view-quilt-outline::before{content:"\F148E"}.mdi-view-sequential::before{content:"\F0729"}.mdi-view-sequential-outline::before{content:"\F148F"}.mdi-view-split-horizontal::before{content:"\F0BCB"}.mdi-view-split-vertical::before{content:"\F0BCC"}.mdi-view-stream::before{content:"\F0575"}.mdi-view-stream-outline::before{content:"\F1490"}.mdi-view-week::before{content:"\F0576"}.mdi-view-week-outline::before{content:"\F1491"}.mdi-vimeo::before{content:"\F0577"}.mdi-violin::before{content:"\F060F"}.mdi-virtual-reality::before{content:"\F0894"}.mdi-virus::before{content:"\F13B6"}.mdi-virus-off::before{content:"\F18E1"}.mdi-virus-off-outline::before{content:"\F18E2"}.mdi-virus-outline::before{content:"\F13B7"}.mdi-vlc::before{content:"\F057C"}.mdi-voicemail::before{content:"\F057D"}.mdi-volcano::before{content:"\F1A83"}.mdi-volcano-outline::before{content:"\F1A84"}.mdi-volleyball::before{content:"\F09B4"}.mdi-volume-equal::before{content:"\F1B10"}.mdi-volume-high::before{content:"\F057E"}.mdi-volume-low::before{content:"\F057F"}.mdi-volume-medium::before{content:"\F0580"}.mdi-volume-minus::before{content:"\F075E"}.mdi-volume-mute::before{content:"\F075F"}.mdi-volume-off::before{content:"\F0581"}.mdi-volume-plus::before{content:"\F075D"}.mdi-volume-source::before{content:"\F1120"}.mdi-volume-variant-off::before{content:"\F0E08"}.mdi-volume-vibrate::before{content:"\F1121"}.mdi-vote::before{content:"\F0A1F"}.mdi-vote-outline::before{content:"\F0A20"}.mdi-vpn::before{content:"\F0582"}.mdi-vuejs::before{content:"\F0844"}.mdi-vuetify::before{content:"\F0E6D"}.mdi-walk::before{content:"\F0583"}.mdi-wall::before{content:"\F07FE"}.mdi-wall-fire::before{content:"\F1A11"}.mdi-wall-sconce::before{content:"\F091C"}.mdi-wall-sconce-flat::before{content:"\F091D"}.mdi-wall-sconce-flat-outline::before{content:"\F17C9"}.mdi-wall-sconce-flat-variant::before{content:"\F041C"}.mdi-wall-sconce-flat-variant-outline::before{content:"\F17CA"}.mdi-wall-sconce-outline::before{content:"\F17CB"}.mdi-wall-sconce-round::before{content:"\F0748"}.mdi-wall-sconce-round-outline::before{content:"\F17CC"}.mdi-wall-sconce-round-variant::before{content:"\F091E"}.mdi-wall-sconce-round-variant-outline::before{content:"\F17CD"}.mdi-wallet::before{content:"\F0584"}.mdi-wallet-bifold::before{content:"\F1C58"}.mdi-wallet-bifold-outline::before{content:"\F1C59"}.mdi-wallet-giftcard::before{content:"\F0585"}.mdi-wallet-membership::before{content:"\F0586"}.mdi-wallet-outline::before{content:"\F0BDD"}.mdi-wallet-plus::before{content:"\F0F8E"}.mdi-wallet-plus-outline::before{content:"\F0F8F"}.mdi-wallet-travel::before{content:"\F0587"}.mdi-wallpaper::before{content:"\F0E09"}.mdi-wan::before{content:"\F0588"}.mdi-wardrobe::before{content:"\F0F90"}.mdi-wardrobe-outline::before{content:"\F0F91"}.mdi-warehouse::before{content:"\F0F81"}.mdi-washing-machine::before{content:"\F072A"}.mdi-washing-machine-alert::before{content:"\F11BC"}.mdi-washing-machine-off::before{content:"\F11BD"}.mdi-watch::before{content:"\F0589"}.mdi-watch-export::before{content:"\F058A"}.mdi-watch-export-variant::before{content:"\F0895"}.mdi-watch-import::before{content:"\F058B"}.mdi-watch-import-variant::before{content:"\F0896"}.mdi-watch-variant::before{content:"\F0897"}.mdi-watch-vibrate::before{content:"\F06B1"}.mdi-watch-vibrate-off::before{content:"\F0CDA"}.mdi-water::before{content:"\F058C"}.mdi-water-alert::before{content:"\F1502"}.mdi-water-alert-outline::before{content:"\F1503"}.mdi-water-boiler::before{content:"\F0F92"}.mdi-water-boiler-alert::before{content:"\F11B3"}.mdi-water-boiler-auto::before{content:"\F1B98"}.mdi-water-boiler-off::before{content:"\F11B4"}.mdi-water-check::before{content:"\F1504"}.mdi-water-check-outline::before{content:"\F1505"}.mdi-water-circle::before{content:"\F1806"}.mdi-water-minus::before{content:"\F1506"}.mdi-water-minus-outline::before{content:"\F1507"}.mdi-water-off::before{content:"\F058D"}.mdi-water-off-outline::before{content:"\F1508"}.mdi-water-opacity::before{content:"\F1855"}.mdi-water-outline::before{content:"\F0E0A"}.mdi-water-percent::before{content:"\F058E"}.mdi-water-percent-alert::before{content:"\F1509"}.mdi-water-plus::before{content:"\F150A"}.mdi-water-plus-outline::before{content:"\F150B"}.mdi-water-polo::before{content:"\F12A0"}.mdi-water-pump::before{content:"\F058F"}.mdi-water-pump-off::before{content:"\F0F93"}.mdi-water-remove::before{content:"\F150C"}.mdi-water-remove-outline::before{content:"\F150D"}.mdi-water-sync::before{content:"\F17C6"}.mdi-water-thermometer::before{content:"\F1A85"}.mdi-water-thermometer-outline::before{content:"\F1A86"}.mdi-water-well::before{content:"\F106B"}.mdi-water-well-outline::before{content:"\F106C"}.mdi-waterfall::before{content:"\F1849"}.mdi-watering-can::before{content:"\F1481"}.mdi-watering-can-outline::before{content:"\F1482"}.mdi-watermark::before{content:"\F0612"}.mdi-wave::before{content:"\F0F2E"}.mdi-wave-arrow-down::before{content:"\F1CB0"}.mdi-wave-arrow-up::before{content:"\F1CB1"}.mdi-wave-undercurrent::before{content:"\F1CC0"}.mdi-waveform::before{content:"\F147D"}.mdi-waves::before{content:"\F078D"}.mdi-waves-arrow-left::before{content:"\F1859"}.mdi-waves-arrow-right::before{content:"\F185A"}.mdi-waves-arrow-up::before{content:"\F185B"}.mdi-waze::before{content:"\F0BDE"}.mdi-weather-cloudy::before{content:"\F0590"}.mdi-weather-cloudy-alert::before{content:"\F0F2F"}.mdi-weather-cloudy-arrow-right::before{content:"\F0E6E"}.mdi-weather-cloudy-clock::before{content:"\F18F6"}.mdi-weather-dust::before{content:"\F1B5A"}.mdi-weather-fog::before{content:"\F0591"}.mdi-weather-hail::before{content:"\F0592"}.mdi-weather-hazy::before{content:"\F0F30"}.mdi-weather-hurricane::before{content:"\F0898"}.mdi-weather-hurricane-outline::before{content:"\F1C78"}.mdi-weather-lightning::before{content:"\F0593"}.mdi-weather-lightning-rainy::before{content:"\F067E"}.mdi-weather-moonset::before{content:"\F1D15"}.mdi-weather-moonset-down::before{content:"\F1D16"}.mdi-weather-moonset-up::before{content:"\F1D17"}.mdi-weather-night::before{content:"\F0594"}.mdi-weather-night-partly-cloudy::before{content:"\F0F31"}.mdi-weather-partly-cloudy::before{content:"\F0595"}.mdi-weather-partly-lightning::before{content:"\F0F32"}.mdi-weather-partly-rainy::before{content:"\F0F33"}.mdi-weather-partly-snowy::before{content:"\F0F34"}.mdi-weather-partly-snowy-rainy::before{content:"\F0F35"}.mdi-weather-pouring::before{content:"\F0596"}.mdi-weather-rainy::before{content:"\F0597"}.mdi-weather-snowy::before{content:"\F0598"}.mdi-weather-snowy-heavy::before{content:"\F0F36"}.mdi-weather-snowy-rainy::before{content:"\F067F"}.mdi-weather-sunny::before{content:"\F0599"}.mdi-weather-sunny-alert::before{content:"\F0F37"}.mdi-weather-sunny-off::before{content:"\F14E4"}.mdi-weather-sunset::before{content:"\F059A"}.mdi-weather-sunset-down::before{content:"\F059B"}.mdi-weather-sunset-up::before{content:"\F059C"}.mdi-weather-tornado::before{content:"\F0F38"}.mdi-weather-windy::before{content:"\F059D"}.mdi-weather-windy-variant::before{content:"\F059E"}.mdi-web::before{content:"\F059F"}.mdi-web-box::before{content:"\F0F94"}.mdi-web-cancel::before{content:"\F1790"}.mdi-web-check::before{content:"\F0789"}.mdi-web-clock::before{content:"\F124A"}.mdi-web-minus::before{content:"\F10A0"}.mdi-web-off::before{content:"\F0A8E"}.mdi-web-plus::before{content:"\F0033"}.mdi-web-refresh::before{content:"\F1791"}.mdi-web-remove::before{content:"\F0551"}.mdi-web-sync::before{content:"\F1792"}.mdi-webcam::before{content:"\F05A0"}.mdi-webcam-off::before{content:"\F1737"}.mdi-webhook::before{content:"\F062F"}.mdi-webpack::before{content:"\F072B"}.mdi-webrtc::before{content:"\F1248"}.mdi-wechat::before{content:"\F0611"}.mdi-weight::before{content:"\F05A1"}.mdi-weight-gram::before{content:"\F0D3F"}.mdi-weight-kilogram::before{content:"\F05A2"}.mdi-weight-lifter::before{content:"\F115D"}.mdi-weight-pound::before{content:"\F09B5"}.mdi-whatsapp::before{content:"\F05A3"}.mdi-wheel-barrow::before{content:"\F14F2"}.mdi-wheelchair::before{content:"\F1A87"}.mdi-wheelchair-accessibility::before{content:"\F05A4"}.mdi-whistle::before{content:"\F09B6"}.mdi-whistle-outline::before{content:"\F12BC"}.mdi-white-balance-auto::before{content:"\F05A5"}.mdi-white-balance-incandescent::before{content:"\F05A6"}.mdi-white-balance-iridescent::before{content:"\F05A7"}.mdi-white-balance-sunny::before{content:"\F05A8"}.mdi-widgets::before{content:"\F072C"}.mdi-widgets-outline::before{content:"\F1355"}.mdi-wifi::before{content:"\F05A9"}.mdi-wifi-alert::before{content:"\F16B5"}.mdi-wifi-arrow-down::before{content:"\F16B6"}.mdi-wifi-arrow-left::before{content:"\F16B7"}.mdi-wifi-arrow-left-right::before{content:"\F16B8"}.mdi-wifi-arrow-right::before{content:"\F16B9"}.mdi-wifi-arrow-up::before{content:"\F16BA"}.mdi-wifi-arrow-up-down::before{content:"\F16BB"}.mdi-wifi-cancel::before{content:"\F16BC"}.mdi-wifi-check::before{content:"\F16BD"}.mdi-wifi-cog::before{content:"\F16BE"}.mdi-wifi-lock::before{content:"\F16BF"}.mdi-wifi-lock-open::before{content:"\F16C0"}.mdi-wifi-marker::before{content:"\F16C1"}.mdi-wifi-minus::before{content:"\F16C2"}.mdi-wifi-off::before{content:"\F05AA"}.mdi-wifi-plus::before{content:"\F16C3"}.mdi-wifi-refresh::before{content:"\F16C4"}.mdi-wifi-remove::before{content:"\F16C5"}.mdi-wifi-settings::before{content:"\F16C6"}.mdi-wifi-star::before{content:"\F0E0B"}.mdi-wifi-strength-1::before{content:"\F091F"}.mdi-wifi-strength-1-alert::before{content:"\F0920"}.mdi-wifi-strength-1-lock::before{content:"\F0921"}.mdi-wifi-strength-1-lock-open::before{content:"\F16CB"}.mdi-wifi-strength-2::before{content:"\F0922"}.mdi-wifi-strength-2-alert::before{content:"\F0923"}.mdi-wifi-strength-2-lock::before{content:"\F0924"}.mdi-wifi-strength-2-lock-open::before{content:"\F16CC"}.mdi-wifi-strength-3::before{content:"\F0925"}.mdi-wifi-strength-3-alert::before{content:"\F0926"}.mdi-wifi-strength-3-lock::before{content:"\F0927"}.mdi-wifi-strength-3-lock-open::before{content:"\F16CD"}.mdi-wifi-strength-4::before{content:"\F0928"}.mdi-wifi-strength-4-alert::before{content:"\F0929"}.mdi-wifi-strength-4-lock::before{content:"\F092A"}.mdi-wifi-strength-4-lock-open::before{content:"\F16CE"}.mdi-wifi-strength-alert-outline::before{content:"\F092B"}.mdi-wifi-strength-lock-open-outline::before{content:"\F16CF"}.mdi-wifi-strength-lock-outline::before{content:"\F092C"}.mdi-wifi-strength-off::before{content:"\F092D"}.mdi-wifi-strength-off-outline::before{content:"\F092E"}.mdi-wifi-strength-outline::before{content:"\F092F"}.mdi-wifi-sync::before{content:"\F16C7"}.mdi-wikipedia::before{content:"\F05AC"}.mdi-wind-power::before{content:"\F1A88"}.mdi-wind-power-outline::before{content:"\F1A89"}.mdi-wind-turbine::before{content:"\F0DA5"}.mdi-wind-turbine-alert::before{content:"\F19AB"}.mdi-wind-turbine-check::before{content:"\F19AC"}.mdi-window-close::before{content:"\F05AD"}.mdi-window-closed::before{content:"\F05AE"}.mdi-window-closed-variant::before{content:"\F11DB"}.mdi-window-maximize::before{content:"\F05AF"}.mdi-window-minimize::before{content:"\F05B0"}.mdi-window-open::before{content:"\F05B1"}.mdi-window-open-variant::before{content:"\F11DC"}.mdi-window-restore::before{content:"\F05B2"}.mdi-window-shutter::before{content:"\F111C"}.mdi-window-shutter-alert::before{content:"\F111D"}.mdi-window-shutter-auto::before{content:"\F1BA3"}.mdi-window-shutter-cog::before{content:"\F1A8A"}.mdi-window-shutter-open::before{content:"\F111E"}.mdi-window-shutter-settings::before{content:"\F1A8B"}.mdi-windsock::before{content:"\F15FA"}.mdi-wiper::before{content:"\F0AE9"}.mdi-wiper-wash::before{content:"\F0DA6"}.mdi-wiper-wash-alert::before{content:"\F18DF"}.mdi-wizard-hat::before{content:"\F1477"}.mdi-wordpress::before{content:"\F05B4"}.mdi-wrap::before{content:"\F05B6"}.mdi-wrap-disabled::before{content:"\F0BDF"}.mdi-wrench::before{content:"\F05B7"}.mdi-wrench-check::before{content:"\F1B8F"}.mdi-wrench-check-outline::before{content:"\F1B90"}.mdi-wrench-clock::before{content:"\F19A3"}.mdi-wrench-clock-outline::before{content:"\F1B93"}.mdi-wrench-cog::before{content:"\F1B91"}.mdi-wrench-cog-outline::before{content:"\F1B92"}.mdi-wrench-outline::before{content:"\F0BE0"}.mdi-xamarin::before{content:"\F0845"}.mdi-xml::before{content:"\F05C0"}.mdi-xmpp::before{content:"\F07FF"}.mdi-yahoo::before{content:"\F0B4F"}.mdi-yeast::before{content:"\F05C1"}.mdi-yin-yang::before{content:"\F0680"}.mdi-yoga::before{content:"\F117C"}.mdi-youtube::before{content:"\F05C3"}.mdi-youtube-gaming::before{content:"\F0848"}.mdi-youtube-studio::before{content:"\F0847"}.mdi-youtube-subscription::before{content:"\F0D40"}.mdi-youtube-tv::before{content:"\F0448"}.mdi-yurt::before{content:"\F1516"}.mdi-z-wave::before{content:"\F0AEA"}.mdi-zend::before{content:"\F0AEB"}.mdi-zigbee::before{content:"\F0D41"}.mdi-zip-box::before{content:"\F05C4"}.mdi-zip-box-outline::before{content:"\F0FFA"}.mdi-zip-disk::before{content:"\F0A23"}.mdi-zodiac-aquarius::before{content:"\F0A7D"}.mdi-zodiac-aries::before{content:"\F0A7E"}.mdi-zodiac-cancer::before{content:"\F0A7F"}.mdi-zodiac-capricorn::before{content:"\F0A80"}.mdi-zodiac-gemini::before{content:"\F0A81"}.mdi-zodiac-leo::before{content:"\F0A82"}.mdi-zodiac-libra::before{content:"\F0A83"}.mdi-zodiac-pisces::before{content:"\F0A84"}.mdi-zodiac-sagittarius::before{content:"\F0A85"}.mdi-zodiac-scorpio::before{content:"\F0A86"}.mdi-zodiac-taurus::before{content:"\F0A87"}.mdi-zodiac-virgo::before{content:"\F0A88"}.mdi-blank::before{content:"\F68C";visibility:hidden}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:rgba(0,0,0,0.54)}.mdi-dark.mdi-inactive:before{color:rgba(0,0,0,0.26)}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:rgba(255,255,255,0.3)}.mdi-rotate-45:before{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.mdi-rotate-90:before{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.mdi-rotate-135:before{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg)}.mdi-rotate-180:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.mdi-rotate-225:before{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);transform:rotate(225deg)}.mdi-rotate-270:before{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.mdi-rotate-315:before{-webkit-transform:rotate(315deg);-ms-transform:rotate(315deg);transform:rotate(315deg)}.mdi-flip-h:before{-webkit-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.mdi-flip-v:before{-webkit-transform:scaleY(-1);transform:scaleY(-1);filter:FlipV;-ms-filter:"FlipV"}.mdi-spin:before{-webkit-animation:mdi-spin 2s infinite linear;animation:mdi-spin 2s infinite linear}@-webkit-keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}} + +/*# sourceMappingURL=materialdesignicons.css.map */ \ No newline at end of file diff --git a/web/scripts/api.js b/web/scripts/api.js index 8c8155be6..39f0a9bb2 100644 --- a/web/scripts/api.js +++ b/web/scripts/api.js @@ -327,7 +327,7 @@ class ComfyApi extends EventTarget { /** * Gets user configuration data and where data should be stored - * @returns { Promise<{ storage: "server" | "browser", users?: Promise, migrated?: boolean }> } + * @returns { Promise<{ storage: "server" | "browser", users?: Promise, migrated?: boolean }> } */ async getUserConfig() { return (await this.fetchApi("/users")).json(); @@ -335,7 +335,7 @@ class ComfyApi extends EventTarget { /** * Creates a new user - * @param { string } username + * @param { string } username * @returns The fetch response */ createUser(username) { @@ -394,7 +394,7 @@ class ComfyApi extends EventTarget { * Gets a user data file for the current user * @param { string } file The name of the userdata file to load * @param { RequestInit } [options] - * @returns { Promise } The fetch response object + * @returns { Promise } The fetch response object */ async getUserData(file, options) { return this.fetchApi(`/userdata/${encodeURIComponent(file)}`, options); @@ -404,18 +404,75 @@ class ComfyApi extends EventTarget { * Stores a user data file for the current user * @param { string } file The name of the userdata file to save * @param { unknown } data The data to save to the file - * @param { RequestInit & { stringify?: boolean, throwOnError?: boolean } } [options] - * @returns { Promise } + * @param { RequestInit & { overwrite?: boolean, stringify?: boolean, throwOnError?: boolean } } [options] + * @returns { Promise } */ - async storeUserData(file, data, options = { stringify: true, throwOnError: true }) { - const resp = await this.fetchApi(`/userdata/${encodeURIComponent(file)}`, { + async storeUserData(file, data, options = { overwrite: true, stringify: true, throwOnError: true }) { + const resp = await this.fetchApi(`/userdata/${encodeURIComponent(file)}?overwrite=${options?.overwrite}`, { method: "POST", body: options?.stringify ? JSON.stringify(data) : data, ...options, - }); - if (resp.status !== 200) { + }); + if (resp.status !== 200 && options?.throwOnError !== false) { throw new Error(`Error storing user data file '${file}': ${resp.status} ${(await resp).statusText}`); } + return resp; + } + + /** + * Deletes a user data file for the current user + * @param { string } file The name of the userdata file to delete + */ + async deleteUserData(file) { + const resp = await this.fetchApi(`/userdata/${encodeURIComponent(file)}`, { + method: "DELETE", + }); + if (resp.status !== 204) { + throw new Error(`Error removing user data file '${file}': ${resp.status} ${(resp).statusText}`); + } + } + + /** + * Move a user data file for the current user + * @param { string } source The userdata file to move + * @param { string } dest The destination for the file + */ + async moveUserData(source, dest, options = { overwrite: false }) { + const resp = await this.fetchApi(`/userdata/${encodeURIComponent(source)}/move/${encodeURIComponent(dest)}?overwrite=${options?.overwrite}`, { + method: "POST", + }); + return resp; + } + + /** + * @overload + * Lists user data files for the current user + * @param { string } dir The directory in which to list files + * @param { boolean } [recurse] If the listing should be recursive + * @param { true } [split] If the paths should be split based on the os path separator + * @returns { Promise> } The list of split file paths in the format [fullPath, ...splitPath] + */ + /** + * @overload + * Lists user data files for the current user + * @param { string } dir The directory in which to list files + * @param { boolean } [recurse] If the listing should be recursive + * @param { false | undefined } [split] If the paths should be split based on the os path separator + * @returns { Promise> } The list of files + */ + async listUserData(dir, recurse, split) { + const resp = await this.fetchApi( + `/userdata?${new URLSearchParams({ + recurse, + dir, + split, + })}` + ); + if (resp.status === 404) return []; + if (resp.status !== 200) { + throw new Error(`Error getting user data list '${dir}': ${resp.status} ${resp.statusText}`); + } + return resp.json(); } } diff --git a/web/scripts/app.js b/web/scripts/app.js index 58fb765c4..725538563 100644 --- a/web/scripts/app.js +++ b/web/scripts/app.js @@ -5,9 +5,11 @@ import { api } from "./api.js"; import { defaultGraph } from "./defaultGraph.js"; import { getPngMetadata, getWebpMetadata, importA1111, getLatentMetadata } from "./pnginfo.js"; import { addDomClippingSetting } from "./domWidget.js"; -import { createImageHost, calculateImageGrid } from "./ui/imagePreview.js" - -export const ANIM_PREVIEW_WIDGET = "$$comfy_animation_preview" +import { createImageHost, calculateImageGrid } from "./ui/imagePreview.js"; +import { ComfyAppMenu } from "./ui/menu/index.js"; +import { getStorageValue, setStorageValue } from "./utils.js"; +import { ComfyWorkflowManager } from "./workflows.js"; +export const ANIM_PREVIEW_WIDGET = "$$comfy_animation_preview"; function sanitizeNodeName(string) { let entityMap = { @@ -52,6 +54,12 @@ export class ComfyApp { constructor() { this.ui = new ComfyUI(this); this.logging = new ComfyLogging(this); + this.workflowManager = new ComfyWorkflowManager(this); + this.bodyTop = $el("div.comfyui-body-top", { parent: document.body }); + this.bodyLeft = $el("div.comfyui-body-left", { parent: document.body }); + this.bodyRight = $el("div.comfyui-body-right", { parent: document.body }); + this.bodyBottom = $el("div.comfyui-body-bottom", { parent: document.body }); + this.menu = new ComfyAppMenu(this); /** * List of extensions that are registered with the app @@ -1313,11 +1321,15 @@ export class ComfyApp { }); api.addEventListener("progress", ({ detail }) => { + if (this.workflowManager.activePrompt?.workflow + && this.workflowManager.activePrompt.workflow !== this.workflowManager.activeWorkflow) return; this.progress = detail; this.graph.setDirtyCanvas(true, false); }); api.addEventListener("executing", ({ detail }) => { + if (this.workflowManager.activePrompt ?.workflow + && this.workflowManager.activePrompt.workflow !== this.workflowManager.activeWorkflow) return; this.progress = null; this.runningNodeId = detail; this.graph.setDirtyCanvas(true, false); @@ -1325,6 +1337,8 @@ export class ComfyApp { }); api.addEventListener("executed", ({ detail }) => { + if (this.workflowManager.activePrompt ?.workflow + && this.workflowManager.activePrompt.workflow !== this.workflowManager.activeWorkflow) return; const output = this.nodeOutputs[detail.node]; if (detail.merge && output) { for (const k in detail.output ?? {}) { @@ -1433,6 +1447,11 @@ export class ComfyApp { }); await Promise.all(extensionPromises); + try { + this.menu.workflows.registerExtension(this); + } catch (error) { + console.error(error); + } } async #migrateSettings() { @@ -1520,15 +1539,17 @@ export class ComfyApp { */ async setup() { await this.#setUser(); - await this.ui.settings.load(); - await this.#loadExtensions(); // Create and mount the LiteGraph in the DOM const mainCanvas = document.createElement("canvas") mainCanvas.style.touchAction = "none" const canvasEl = (this.canvasEl = Object.assign(mainCanvas, { id: "graph-canvas" })); canvasEl.tabIndex = "1"; - document.body.prepend(canvasEl); + document.body.append(canvasEl); + this.resizeCanvas(); + + await Promise.all([this.workflowManager.loadWorkflows(), this.ui.settings.load()]); + await this.#loadExtensions(); addDomClippingSetting(); this.#addProcessMouseHandler(); @@ -1541,7 +1562,7 @@ export class ComfyApp { this.#addAfterConfigureHandler(); - const canvas = (this.canvas = new LGraphCanvas(canvasEl, this.graph)); + this.canvas = new LGraphCanvas(canvasEl, this.graph); this.ctx = canvasEl.getContext("2d"); LiteGraph.release_link_on_empty_shows_menu = true; @@ -1549,19 +1570,14 @@ export class ComfyApp { this.graph.start(); - function resizeCanvas() { - // Limit minimal scale to 1, see https://github.com/comfyanonymous/ComfyUI/pull/845 - const scale = Math.max(window.devicePixelRatio, 1); - const { width, height } = canvasEl.getBoundingClientRect(); - canvasEl.width = Math.round(width * scale); - canvasEl.height = Math.round(height * scale); - canvasEl.getContext("2d").scale(scale, scale); - canvas.draw(true, true); - } - // Ensure the canvas fills the window - resizeCanvas(); - window.addEventListener("resize", resizeCanvas); + this.resizeCanvas(); + window.addEventListener("resize", () => this.resizeCanvas()); + const ro = new ResizeObserver(() => this.resizeCanvas()); + ro.observe(this.bodyTop); + ro.observe(this.bodyLeft); + ro.observe(this.bodyRight); + ro.observe(this.bodyBottom); await this.#invokeExtensionsAsync("init"); await this.registerNodes(); @@ -1573,7 +1589,8 @@ export class ComfyApp { const loadWorkflow = async (json) => { if (json) { const workflow = JSON.parse(json); - await this.loadGraphData(workflow); + const workflowName = getStorageValue("Comfy.PreviousWorkflow"); + await this.loadGraphData(workflow, true, workflowName); return true; } }; @@ -1609,6 +1626,19 @@ export class ComfyApp { await this.#invokeExtensionsAsync("setup"); } + resizeCanvas() { + // Limit minimal scale to 1, see https://github.com/comfyanonymous/ComfyUI/pull/845 + const scale = Math.max(window.devicePixelRatio, 1); + + // Clear fixed width and height while calculating rect so it uses 100% instead + this.canvasEl.height = this.canvasEl.width = ""; + const { width, height } = this.canvasEl.getBoundingClientRect(); + this.canvasEl.width = Math.round(width * scale); + this.canvasEl.height = Math.round(height * scale); + this.canvasEl.getContext("2d").scale(scale, scale); + this.canvas?.draw(true, true); + } + /** * Registers nodes with the graph */ @@ -1795,12 +1825,29 @@ export class ComfyApp { }); } + async changeWorkflow(callback, workflow = null) { + try { + this.workflowManager.activeWorkflow?.changeTracker?.store() + } catch (error) { + console.error(error); + } + await callback(); + try { + this.workflowManager.setWorkflow(workflow); + this.workflowManager.activeWorkflow?.track() + } catch (error) { + console.error(error); + } + } + /** * Populates the graph with the specified workflow data * @param {*} graphData A serialized graph object * @param { boolean } clean If the graph state, e.g. images, should be cleared + * @param { boolean } restore_view If the graph position should be restored + * @param { import("./workflows.js").ComfyWorkflowInstance | null } workflow The workflow */ - async loadGraphData(graphData, clean = true, restore_view = true) { + async loadGraphData(graphData, clean = true, restore_view = true, workflow = null) { if (clean !== false) { this.clean(); } @@ -1818,6 +1865,12 @@ export class ComfyApp { { graphData = structuredClone(graphData); } + + try { + this.workflowManager.setWorkflow(workflow); + } catch (error) { + console.error(error); + } const missingNodeTypes = []; await this.#invokeExtensionsAsync("beforeConfigureGraph", graphData, missingNodeTypes); @@ -1840,6 +1893,11 @@ export class ComfyApp { this.canvas.ds.offset = graphData.extra.ds.offset; this.canvas.ds.scale = graphData.extra.ds.scale; } + + try { + this.workflowManager.activeWorkflow?.track() + } catch (error) { + } } catch (error) { let errorHint = []; // Try extracting filename to see if it was caused by an extension script @@ -1927,14 +1985,17 @@ export class ComfyApp { this.showMissingNodesError(missingNodeTypes); } await this.#invokeExtensionsAsync("afterConfigureGraph", missingNodeTypes); + requestAnimationFrame(() => { + this.graph.setDirtyCanvas(true, true); + }); } /** * Converts the current graph workflow for sending to the API * @returns The workflow and node links */ - async graphToPrompt() { - for (const outerNode of this.graph.computeExecutionOrder(false)) { + async graphToPrompt(graph = this.graph, clean = true) { + for (const outerNode of graph.computeExecutionOrder(false)) { if (outerNode.widgets) { for (const widget of outerNode.widgets) { // Allow widgets to run callbacks before a prompt has been queued @@ -1954,10 +2015,10 @@ export class ComfyApp { } } - const workflow = this.graph.serialize(); + const workflow = graph.serialize(); const output = {}; // Process nodes in order of execution - for (const outerNode of this.graph.computeExecutionOrder(false)) { + for (const outerNode of graph.computeExecutionOrder(false)) { const skipNode = outerNode.mode === 2 || outerNode.mode === 4; const innerNodes = (!skipNode && outerNode.getInnerNodes) ? outerNode.getInnerNodes() : [outerNode]; for (const node of innerNodes) { @@ -2049,13 +2110,14 @@ export class ComfyApp { } // Remove inputs connected to removed nodes - - for (const o in output) { - for (const i in output[o].inputs) { - if (Array.isArray(output[o].inputs[i]) - && output[o].inputs[i].length === 2 - && !output[output[o].inputs[i][0]]) { - delete output[o].inputs[i]; + if(clean) { + for (const o in output) { + for (const i in output[o].inputs) { + if (Array.isArray(output[o].inputs[i]) + && output[o].inputs[i].length === 2 + && !output[output[o].inputs[i][0]]) { + delete output[o].inputs[i]; + } } } } @@ -2123,6 +2185,14 @@ export class ComfyApp { this.lastNodeErrors = res.node_errors; if (this.lastNodeErrors.length > 0) { this.canvas.draw(true, true); + } else { + try { + this.workflowManager.storePrompt({ + id: res.prompt_id, + nodes: Object.keys(p.output) + }); + } catch (error) { + } } } catch (error) { const formattedError = this.#formatPromptError(error) @@ -2155,6 +2225,7 @@ export class ComfyApp { this.#processingQueue = false; } api.dispatchEvent(new CustomEvent("promptQueued", { detail: { number, batchCount } })); + return !this.lastNodeErrors; } showErrorOnFileLoad(file) { @@ -2170,14 +2241,24 @@ export class ComfyApp { * @param {File} file */ async handleFile(file) { + const removeExt = f => { + if(!f) return f; + const p = f.lastIndexOf("."); + if(p === -1) return f; + return f.substring(0, p); + }; + + const fileName = removeExt(file.name); if (file.type === "image/png") { const pngInfo = await getPngMetadata(file); if (pngInfo?.workflow) { - await this.loadGraphData(JSON.parse(pngInfo.workflow)); + await this.loadGraphData(JSON.parse(pngInfo.workflow), true, true, fileName); } else if (pngInfo?.prompt) { - this.loadApiJson(JSON.parse(pngInfo.prompt)); + this.loadApiJson(JSON.parse(pngInfo.prompt), fileName); } else if (pngInfo?.parameters) { - importA1111(this.graph, pngInfo.parameters); + this.changeWorkflow(() => { + importA1111(this.graph, pngInfo.parameters); + }, fileName) } else { this.showErrorOnFileLoad(file); } @@ -2188,9 +2269,9 @@ export class ComfyApp { const prompt = pngInfo?.prompt || pngInfo?.Prompt; if (workflow) { - this.loadGraphData(JSON.parse(workflow)); + this.loadGraphData(JSON.parse(workflow), true, true, fileName); } else if (prompt) { - this.loadApiJson(JSON.parse(prompt)); + this.loadApiJson(JSON.parse(prompt), fileName); } else { this.showErrorOnFileLoad(file); } @@ -2201,16 +2282,16 @@ export class ComfyApp { if (jsonContent?.templates) { this.loadTemplateData(jsonContent); } else if(this.isApiJson(jsonContent)) { - this.loadApiJson(jsonContent); + this.loadApiJson(jsonContent, fileName); } else { - await this.loadGraphData(jsonContent); + await this.loadGraphData(jsonContent, true, fileName); } }; reader.readAsText(file); } else if (file.name?.endsWith(".latent") || file.name?.endsWith(".safetensors")) { const info = await getLatentMetadata(file); if (info.workflow) { - await this.loadGraphData(JSON.parse(info.workflow)); + await this.loadGraphData(JSON.parse(info.workflow), true, fileName); } else if (info.prompt) { this.loadApiJson(JSON.parse(info.prompt)); } else { @@ -2225,7 +2306,7 @@ export class ComfyApp { return Object.values(data).every((v) => v.class_type); } - loadApiJson(apiData) { + loadApiJson(apiData, fileName) { const missingNodeTypes = Object.values(apiData).filter((n) => !LiteGraph.registered_node_types[n.class_type]); if (missingNodeTypes.length) { this.showMissingNodesError(missingNodeTypes.map(t => t.class_type), false); @@ -2240,40 +2321,42 @@ export class ComfyApp { node.id = isNaN(+id) ? id : +id; node.title = data._meta?.title ?? node.title app.graph.add(node); + graph.add(node); } - for (const id of ids) { - const data = apiData[id]; - const node = app.graph.getNodeById(id); - for (const input in data.inputs ?? {}) { - const value = data.inputs[input]; - if (value instanceof Array) { - const [fromId, fromSlot] = value; - const fromNode = app.graph.getNodeById(fromId); - let toSlot = node.inputs?.findIndex((inp) => inp.name === input); - if (toSlot == null || toSlot === -1) { - try { - // Target has no matching input, most likely a converted widget - const widget = node.widgets?.find((w) => w.name === input); - if (widget && node.convertWidgetToInput?.(widget)) { - toSlot = node.inputs?.length - 1; - } - } catch (error) {} - } - if (toSlot != null || toSlot !== -1) { - fromNode.connect(fromSlot, node, toSlot); - } - } else { - const widget = node.widgets?.find((w) => w.name === input); - if (widget) { - widget.value = value; - widget.callback?.(value); + this.changeWorkflow(() => { + for (const id of ids) { + const data = apiData[id]; + const node = app.graph.getNodeById(id); + for (const input in data.inputs ?? {}) { + const value = data.inputs[input]; + if (value instanceof Array) { + const [fromId, fromSlot] = value; + const fromNode = app.graph.getNodeById(fromId); + let toSlot = node.inputs?.findIndex((inp) => inp.name === input); + if (toSlot == null || toSlot === -1) { + try { + // Target has no matching input, most likely a converted widget + const widget = node.widgets?.find((w) => w.name === input); + if (widget && node.convertWidgetToInput?.(widget)) { + toSlot = node.inputs?.length - 1; + } + } catch (error) {} + } + if (toSlot != null || toSlot !== -1) { + fromNode.connect(fromSlot, node, toSlot); + } + } else { + const widget = node.widgets?.find((w) => w.name === input); + if (widget) { + widget.value = value; + widget.callback?.(value); + } } } } - } - - app.graph.arrange(); + app.graph.arrange(); + }, fileName); } /** diff --git a/web/scripts/changeTracker.js b/web/scripts/changeTracker.js new file mode 100644 index 000000000..59901d5fc --- /dev/null +++ b/web/scripts/changeTracker.js @@ -0,0 +1,242 @@ +// @ts-check + +import { api } from "./api.js"; +import { clone } from "./utils.js"; + + +export class ChangeTracker { + static MAX_HISTORY = 50; + #app; + undo = []; + redo = []; + activeState = null; + isOurLoad = false; + /** @type { import("./workflows").ComfyWorkflow | null } */ + workflow; + + ds; + nodeOutputs; + + get app() { + return this.#app ?? this.workflow.manager.app; + } + + constructor(workflow) { + this.workflow = workflow; + } + + #setApp(app) { + this.#app = app; + } + + store() { + this.ds = { scale: this.app.canvas.ds.scale, offset: [...this.app.canvas.ds.offset] }; + } + + restore() { + if (this.ds) { + this.app.canvas.ds.scale = this.ds.scale; + this.app.canvas.ds.offset = this.ds.offset; + } + if (this.nodeOutputs) { + this.app.nodeOutputs = this.nodeOutputs; + } + } + + checkState() { + if (!this.app.graph) return; + + const currentState = this.app.graph.serialize(); + if (!this.activeState) { + this.activeState = clone(currentState); + return; + } + if (!ChangeTracker.graphEqual(this.activeState, currentState)) { + this.undo.push(this.activeState); + if (this.undo.length > ChangeTracker.MAX_HISTORY) { + this.undo.shift(); + } + this.activeState = clone(currentState); + this.redo.length = 0; + this.workflow.unsaved = true; + api.dispatchEvent(new CustomEvent("graphChanged", { detail: this.activeState })); + } + } + + async updateState(source, target) { + const prevState = source.pop(); + if (prevState) { + target.push(this.activeState); + this.isOurLoad = true; + await this.app.loadGraphData(prevState, false, false, this.workflow); + this.activeState = prevState; + } + } + + async undoRedo(e) { + if (e.ctrlKey || e.metaKey) { + if (e.key === "y") { + this.updateState(this.redo, this.undo); + return true; + } else if (e.key === "z") { + this.updateState(this.undo, this.redo); + return true; + } + } + } + + /** @param { import("./app.js").ComfyApp } app */ + static init(app) { + const changeTracker = () => app.workflowManager.activeWorkflow?.changeTracker ?? globalTracker; + globalTracker.#setApp(app); + + const loadGraphData = app.loadGraphData; + app.loadGraphData = async function () { + const v = await loadGraphData.apply(this, arguments); + const ct = changeTracker(); + if (ct.isOurLoad) { + ct.isOurLoad = false; + } else { + ct.checkState(); + } + return v; + }; + + let keyIgnored = false; + window.addEventListener( + "keydown", + (e) => { + requestAnimationFrame(async () => { + let activeEl; + // If we are auto queue in change mode then we do want to trigger on inputs + if (!app.ui.autoQueueEnabled || app.ui.autoQueueMode === "instant") { + activeEl = document.activeElement; + if (activeEl?.tagName === "INPUT" || activeEl?.["type"] === "textarea") { + // Ignore events on inputs, they have their native history + return; + } + } + + keyIgnored = e.key === "Control" || e.key === "Shift" || e.key === "Alt" || e.key === "Meta"; + if (keyIgnored) return; + + // Check if this is a ctrl+z ctrl+y + if (await changeTracker().undoRedo(e)) return; + + // If our active element is some type of input then handle changes after they're done + if (ChangeTracker.bindInput(activeEl)) return; + changeTracker().checkState(); + }); + }, + true + ); + + window.addEventListener("keyup", (e) => { + if (keyIgnored) { + keyIgnored = false; + changeTracker().checkState(); + } + }); + + // Handle clicking DOM elements (e.g. widgets) + window.addEventListener("mouseup", () => { + changeTracker().checkState(); + }); + + // Handle prompt queue event for dynamic widget changes + api.addEventListener("promptQueued", () => { + changeTracker().checkState(); + }); + + // Handle litegraph clicks + const processMouseUp = LGraphCanvas.prototype.processMouseUp; + LGraphCanvas.prototype.processMouseUp = function (e) { + const v = processMouseUp.apply(this, arguments); + changeTracker().checkState(); + return v; + }; + const processMouseDown = LGraphCanvas.prototype.processMouseDown; + LGraphCanvas.prototype.processMouseDown = function (e) { + const v = processMouseDown.apply(this, arguments); + changeTracker().checkState(); + return v; + }; + + // Handle litegraph context menu for COMBO widgets + const close = LiteGraph.ContextMenu.prototype.close; + LiteGraph.ContextMenu.prototype.close = function (e) { + const v = close.apply(this, arguments); + changeTracker().checkState(); + return v; + }; + + // Store node outputs + api.addEventListener("executed", ({ detail }) => { + const prompt = app.workflowManager.queuedPrompts[detail.prompt_id]; + if (!prompt?.workflow) return; + const nodeOutputs = (prompt.workflow.changeTracker.nodeOutputs ??= {}); + const output = nodeOutputs[detail.node]; + if (detail.merge && output) { + for (const k in detail.output ?? {}) { + const v = output[k]; + if (v instanceof Array) { + output[k] = v.concat(detail.output[k]); + } else { + output[k] = detail.output[k]; + } + } + } else { + nodeOutputs[detail.node] = detail.output; + } + }); + } + + static bindInput(app, activeEl) { + if (activeEl && activeEl.tagName !== "CANVAS" && activeEl.tagName !== "BODY") { + for (const evt of ["change", "input", "blur"]) { + if (`on${evt}` in activeEl) { + const listener = () => { + app.workflowManager.activeWorkflow.changeTracker.checkState(); + activeEl.removeEventListener(evt, listener); + }; + activeEl.addEventListener(evt, listener); + return true; + } + } + } + } + + static graphEqual(a, b, path = "") { + if (a === b) return true; + + if (typeof a == "object" && a && typeof b == "object" && b) { + const keys = Object.getOwnPropertyNames(a); + + if (keys.length != Object.getOwnPropertyNames(b).length) { + return false; + } + + for (const key of keys) { + let av = a[key]; + let bv = b[key]; + if (!path && key === "nodes") { + // Nodes need to be sorted as the order changes when selecting nodes + av = [...av].sort((a, b) => a.id - b.id); + bv = [...bv].sort((a, b) => a.id - b.id); + } else if (path === "extra.ds") { + // Ignore view changes + continue; + } + if (!ChangeTracker.graphEqual(av, bv, path + (path ? "." : "") + key)) { + return false; + } + } + + return true; + } + + return false; + } +} + +const globalTracker = new ChangeTracker({}); \ No newline at end of file diff --git a/web/scripts/domWidget.js b/web/scripts/domWidget.js index b7f437ad2..d97122f9d 100644 --- a/web/scripts/domWidget.js +++ b/web/scripts/domWidget.js @@ -34,8 +34,8 @@ function getClipPath(node, element) { } const widgetRect = element.getBoundingClientRect(); - const clipX = intersection[0] - widgetRect.x / scale + "px"; - const clipY = intersection[1] - widgetRect.y / scale + "px"; + const clipX = elRect.left + intersection[0] - widgetRect.x / scale + "px"; + const clipY = elRect.top + intersection[1] - widgetRect.y / scale + "px"; const clipWidth = intersection[2] + "px"; const clipHeight = intersection[3] + "px"; const path = `polygon(0% 0%, 0% 100%, ${clipX} 100%, ${clipX} ${clipY}, calc(${clipX} + ${clipWidth}) ${clipY}, calc(${clipX} + ${clipWidth}) calc(${clipY} + ${clipHeight}), ${clipX} calc(${clipY} + ${clipHeight}), ${clipX} 100%, 100% 100%, 100% 0%)`; @@ -210,7 +210,9 @@ LGraphNode.prototype.addDOMWidget = function (name, type, element, options) { if (!element.parentElement) { document.body.append(element); } - + element.hidden = true; + element.style.display = "none"; + let mouseDownHandler; if (element.blur) { mouseDownHandler = (event) => { @@ -254,15 +256,15 @@ LGraphNode.prototype.addDOMWidget = function (name, type, element, options) { const transform = new DOMMatrix() .scaleSelf(elRect.width / ctx.canvas.width, elRect.height / ctx.canvas.height) .multiplySelf(ctx.getTransform()) - .translateSelf(margin, margin + y); + .translateSelf(margin, margin + y ); const scale = new DOMMatrix().scaleSelf(transform.a, transform.d); Object.assign(element.style, { transformOrigin: "0 0", transform: scale, - left: `${transform.a + transform.e}px`, - top: `${transform.d + transform.f}px`, + left: `${transform.a + transform.e + elRect.left}px`, + top: `${transform.d + transform.f + elRect.top}px`, width: `${widgetWidth - margin * 2}px`, height: `${(widget.computedHeight ?? 50) - margin * 2}px`, position: "absolute", diff --git a/web/scripts/ui.js b/web/scripts/ui.js index 72e43d357..87b4887eb 100644 --- a/web/scripts/ui.js +++ b/web/scripts/ui.js @@ -6,17 +6,22 @@ import { ComfySettingsDialog } from "./ui/settings.js"; export const ComfyDialog = _ComfyDialog; /** - * - * @param { string } tag HTML Element Tag and optional classes e.g. div.class1.class2 - * @param { string | Element | Element[] | { + * @template { string | (keyof HTMLElementTagNameMap) } K + * @typedef { K extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[K] : HTMLElement } ElementType + */ + +/** + * @template { string | (keyof HTMLElementTagNameMap) } K + * @param { K } tag HTML Element Tag and optional classes e.g. div.class1.class2 + * @param { string | Element | Element[] | ({ * parent?: Element, - * $?: (el: Element) => void, + * $?: (el: ElementType) => void, * dataset?: DOMStringMap, - * style?: CSSStyleDeclaration, + * style?: Partial, * for?: string - * } | undefined } propsOrChildren - * @param { Element[] | undefined } [children] - * @returns + * } & Omit>, "style">) | undefined } [propsOrChildren] + * @param { string | Element | Element[] | undefined } [children] + * @returns { ElementType } */ export function $el(tag, propsOrChildren, children) { const split = tag.split("."); @@ -54,7 +59,7 @@ export function $el(tag, propsOrChildren, children) { Object.assign(element, propsOrChildren); if (children) { - element.append(...(children instanceof Array ? children : [children])); + element.append(...(children instanceof Array ? children.filter(Boolean) : [children])); } if (parent) { @@ -102,6 +107,8 @@ function dragElement(dragEl, settings) { } function positionElement() { + if(dragEl.style.display === "none") return; + const halfWidth = document.body.clientWidth / 2; const anchorRight = newPosX + dragEl.clientWidth / 2 > halfWidth; @@ -191,6 +198,8 @@ function dragElement(dragEl, settings) { document.onmouseup = null; document.onmousemove = null; } + + return restorePos; } class ComfyList { @@ -372,6 +381,8 @@ export class ComfyUI { }, }); + this.loadFile = () => fileInput.click(); + const autoQueueModeEl = toggleSwitch( "autoQueueMode", [ @@ -592,6 +603,7 @@ export class ComfyUI { onclick: () => app.refreshComboInNodes() }), $el("button", {id: "comfy-clipspace-button", textContent: "Clipspace", onclick: () => app.openClipspace()}), + $el("button", {id: "comfy-reset-view-button", textContent: "Reset View", onclick: () => app.resetView()}), $el("button", { id: "comfy-clear-button", textContent: "Clear", onclick: () => { if (!confirmClear.value || confirm("Clear workflow?")) { @@ -621,10 +633,10 @@ export class ComfyUI { name: "Enable Dev mode Options", type: "boolean", defaultValue: false, - onChange: function(value) { document.getElementById("comfy-dev-save-api-button").style.display = value ? "block" : "none"}, + onChange: function(value) { document.getElementById("comfy-dev-save-api-button").style.display = value ? "flex" : "none"}, }); - dragElement(this.menuContainer, this.settings); + this.restoreMenuPosition = dragElement(this.menuContainer, this.settings); this.setStatus({exec_info: {queue_remaining: "X"}}); } diff --git a/web/scripts/ui/components/asyncDialog.js b/web/scripts/ui/components/asyncDialog.js new file mode 100644 index 000000000..434ce4b30 --- /dev/null +++ b/web/scripts/ui/components/asyncDialog.js @@ -0,0 +1,64 @@ +import { ComfyDialog } from "../dialog.js"; +import { $el } from "../../ui.js"; + +export class ComfyAsyncDialog extends ComfyDialog { + #resolve; + + constructor(actions) { + super( + "dialog.comfy-dialog.comfyui-dialog", + actions?.map((opt) => { + if (typeof opt === "string") { + opt = { text: opt }; + } + return $el("button.comfyui-button", { + type: "button", + textContent: opt.text, + onclick: () => this.close(opt.value ?? opt.text), + }); + }) + ); + } + + show(html) { + this.element.addEventListener("close", () => { + this.close(); + }); + + super.show(html); + + return new Promise((resolve) => { + this.#resolve = resolve; + }); + } + + showModal(html) { + this.element.addEventListener("close", () => { + this.close(); + }); + + super.show(html); + this.element.showModal(); + + return new Promise((resolve) => { + this.#resolve = resolve; + }); + } + + close(result = null) { + this.#resolve(result); + this.element.close(); + super.close(); + } + + static async prompt({ title = null, message, actions }) { + const dialog = new ComfyAsyncDialog(actions); + const content = [$el("span", message)]; + if (title) { + content.unshift($el("h3", title)); + } + const res = await dialog.showModal(content); + dialog.element.remove(); + return res; + } +} diff --git a/web/scripts/ui/components/button.js b/web/scripts/ui/components/button.js new file mode 100644 index 000000000..25e5aeebd --- /dev/null +++ b/web/scripts/ui/components/button.js @@ -0,0 +1,163 @@ +// @ts-check + +import { $el } from "../../ui.js"; +import { applyClasses, toggleElement } from "../utils.js"; +import { prop } from "../../utils.js"; + +/** + * @typedef {{ + * icon?: string; + * overIcon?: string; + * iconSize?: number; + * content?: string | HTMLElement; + * tooltip?: string; + * enabled?: boolean; + * action?: (e: Event, btn: ComfyButton) => void, + * classList?: import("../utils.js").ClassList, + * visibilitySetting?: { id: string, showValue: any }, + * app?: import("../../app.js").ComfyApp + * }} ComfyButtonProps + */ +export class ComfyButton { + #over = 0; + #popupOpen = false; + isOver = false; + iconElement = $el("i.mdi"); + contentElement = $el("span"); + /** + * @type {import("./popup.js").ComfyPopup} + */ + popup; + + /** + * @param {ComfyButtonProps} opts + */ + constructor({ + icon, + overIcon, + iconSize, + content, + tooltip, + action, + classList = "comfyui-button", + visibilitySetting, + app, + enabled = true, + }) { + this.element = $el("button", { + onmouseenter: () => { + this.isOver = true; + if(this.overIcon) { + this.updateIcon(); + } + }, + onmouseleave: () => { + this.isOver = false; + if(this.overIcon) { + this.updateIcon(); + } + } + + }, [this.iconElement, this.contentElement]); + + this.icon = prop(this, "icon", icon, toggleElement(this.iconElement, { onShow: this.updateIcon })); + this.overIcon = prop(this, "overIcon", overIcon, () => { + if(this.isOver) { + this.updateIcon(); + } + }); + this.iconSize = prop(this, "iconSize", iconSize, this.updateIcon); + this.content = prop( + this, + "content", + content, + toggleElement(this.contentElement, { + onShow: (el, v) => { + if (typeof v === "string") { + el.textContent = v; + } else { + el.replaceChildren(v); + } + }, + }) + ); + + this.tooltip = prop(this, "tooltip", tooltip, (v) => { + if (v) { + this.element.title = v; + } else { + this.element.removeAttribute("title"); + } + }); + this.classList = prop(this, "classList", classList, this.updateClasses); + this.hidden = prop(this, "hidden", false, this.updateClasses); + this.enabled = prop(this, "enabled", enabled, () => { + this.updateClasses(); + this.element.disabled = !this.enabled; + }); + this.action = prop(this, "action", action); + this.element.addEventListener("click", (e) => { + if (this.popup) { + // we are either a touch device or triggered by click not hover + if (!this.#over) { + this.popup.toggle(); + } + } + this.action?.(e, this); + }); + + if (visibilitySetting?.id) { + const settingUpdated = () => { + this.hidden = app.ui.settings.getSettingValue(visibilitySetting.id) !== visibilitySetting.showValue; + }; + app.ui.settings.addEventListener(visibilitySetting.id + ".change", settingUpdated); + settingUpdated(); + } + } + + updateIcon = () => (this.iconElement.className = `mdi mdi-${(this.isOver && this.overIcon) || this.icon}${this.iconSize ? " mdi-" + this.iconSize + "px" : ""}`); + updateClasses = () => { + const internalClasses = []; + if (this.hidden) { + internalClasses.push("hidden"); + } + if (!this.enabled) { + internalClasses.push("disabled"); + } + if (this.popup) { + if (this.#popupOpen) { + internalClasses.push("popup-open"); + } else { + internalClasses.push("popup-closed"); + } + } + applyClasses(this.element, this.classList, ...internalClasses); + }; + + /** + * + * @param { import("./popup.js").ComfyPopup } popup + * @param { "click" | "hover" } mode + */ + withPopup(popup, mode = "click") { + this.popup = popup; + + if (mode === "hover") { + for (const el of [this.element, this.popup.element]) { + el.addEventListener("mouseenter", () => { + this.popup.open = !!++this.#over; + }); + el.addEventListener("mouseleave", () => { + this.popup.open = !!--this.#over; + }); + } + } + + popup.addEventListener("change", () => { + this.#popupOpen = popup.open; + this.updateClasses(); + }); + + return this; + } +} diff --git a/web/scripts/ui/components/buttonGroup.js b/web/scripts/ui/components/buttonGroup.js new file mode 100644 index 000000000..573572fd0 --- /dev/null +++ b/web/scripts/ui/components/buttonGroup.js @@ -0,0 +1,45 @@ +// @ts-check + +import { $el } from "../../ui.js"; +import { ComfyButton } from "./button.js"; +import { prop } from "../../utils.js"; + +export class ComfyButtonGroup { + element = $el("div.comfyui-button-group"); + + /** @param {Array} buttons */ + constructor(...buttons) { + this.buttons = prop(this, "buttons", buttons, () => this.update()); + } + + /** + * @param {ComfyButton} button + * @param {number} index + */ + insert(button, index) { + this.buttons.splice(index, 0, button); + this.update(); + } + + /** @param {ComfyButton} button */ + append(button) { + this.buttons.push(button); + this.update(); + } + + /** @param {ComfyButton|number} indexOrButton */ + remove(indexOrButton) { + if (typeof indexOrButton !== "number") { + indexOrButton = this.buttons.indexOf(indexOrButton); + } + if (indexOrButton > -1) { + const r = this.buttons.splice(indexOrButton, 1); + this.update(); + return r; + } + } + + update() { + this.element.replaceChildren(...this.buttons.map((b) => b["element"] ?? b)); + } +} diff --git a/web/scripts/ui/components/popup.js b/web/scripts/ui/components/popup.js new file mode 100644 index 000000000..ee59b35d9 --- /dev/null +++ b/web/scripts/ui/components/popup.js @@ -0,0 +1,128 @@ +// @ts-check + +import { prop } from "../../utils.js"; +import { $el } from "../../ui.js"; +import { applyClasses } from "../utils.js"; + +export class ComfyPopup extends EventTarget { + element = $el("div.comfyui-popup"); + + /** + * @param {{ + * target: HTMLElement, + * container?: HTMLElement, + * classList?: import("../utils.js").ClassList, + * ignoreTarget?: boolean, + * closeOnEscape?: boolean, + * position?: "absolute" | "relative", + * horizontal?: "left" | "right" + * }} param0 + * @param {...HTMLElement} children + */ + constructor( + { + target, + container = document.body, + classList = "", + ignoreTarget = true, + closeOnEscape = true, + position = "absolute", + horizontal = "left", + }, + ...children + ) { + super(); + this.target = target; + this.ignoreTarget = ignoreTarget; + this.container = container; + this.position = position; + this.closeOnEscape = closeOnEscape; + this.horizontal = horizontal; + + container.append(this.element); + + this.children = prop(this, "children", children, () => { + this.element.replaceChildren(...this.children); + this.update(); + }); + this.classList = prop(this, "classList", classList, () => applyClasses(this.element, this.classList, "comfyui-popup", horizontal)); + this.open = prop(this, "open", false, (v, o) => { + if (v === o) return; + if (v) { + this.#show(); + } else { + this.#hide(); + } + }); + } + + toggle() { + this.open = !this.open; + } + + #hide() { + this.element.classList.remove("open"); + window.removeEventListener("resize", this.update); + window.removeEventListener("click", this.#clickHandler, { capture: true }); + window.removeEventListener("keydown", this.#escHandler, { capture: true }); + + this.dispatchEvent(new CustomEvent("close")); + this.dispatchEvent(new CustomEvent("change")); + } + + #show() { + this.element.classList.add("open"); + this.update(); + + window.addEventListener("resize", this.update); + window.addEventListener("click", this.#clickHandler, { capture: true }); + if (this.closeOnEscape) { + window.addEventListener("keydown", this.#escHandler, { capture: true }); + } + + this.dispatchEvent(new CustomEvent("open")); + this.dispatchEvent(new CustomEvent("change")); + } + + #escHandler = (e) => { + if (e.key === "Escape") { + this.open = false; + e.preventDefault(); + e.stopImmediatePropagation(); + } + }; + + #clickHandler = (e) => { + /** @type {any} */ + const target = e.target; + if (!this.element.contains(target) && this.ignoreTarget && !this.target.contains(target)) { + this.open = false; + } + }; + + update = () => { + const rect = this.target.getBoundingClientRect(); + this.element.style.setProperty("--bottom", "unset"); + if (this.position === "absolute") { + if (this.horizontal === "left") { + this.element.style.setProperty("--left", rect.left + "px"); + } else { + this.element.style.setProperty("--left", rect.right - this.element.clientWidth + "px"); + } + this.element.style.setProperty("--top", rect.bottom + "px"); + this.element.style.setProperty("--limit", rect.bottom + "px"); + } else { + this.element.style.setProperty("--left", 0 + "px"); + this.element.style.setProperty("--top", rect.height + "px"); + this.element.style.setProperty("--limit", rect.height + "px"); + } + + const thisRect = this.element.getBoundingClientRect(); + if (thisRect.height < 30) { + // Move up instead + this.element.style.setProperty("--top", "unset"); + this.element.style.setProperty("--bottom", rect.height + 5 + "px"); + this.element.style.setProperty("--limit", rect.height + 5 + "px"); + } + }; +} diff --git a/web/scripts/ui/components/splitButton.js b/web/scripts/ui/components/splitButton.js new file mode 100644 index 000000000..2b4e6d9f8 --- /dev/null +++ b/web/scripts/ui/components/splitButton.js @@ -0,0 +1,43 @@ +// @ts-check + +import { $el } from "../../ui.js"; +import { ComfyButton } from "./button.js"; +import { prop } from "../../utils.js"; +import { ComfyPopup } from "./popup.js"; + +export class ComfySplitButton { + /** + * @param {{ + * primary: ComfyButton, + * mode?: "hover" | "click", + * horizontal?: "left" | "right", + * position?: "relative" | "absolute" + * }} param0 + * @param {Array | Array} items + */ + constructor({ primary, mode, horizontal = "left", position = "relative" }, ...items) { + this.arrow = new ComfyButton({ + icon: "chevron-down", + }); + this.element = $el("div.comfyui-split-button" + (mode === "hover" ? ".hover" : ""), [ + $el("div.comfyui-split-primary", primary.element), + $el("div.comfyui-split-arrow", this.arrow.element), + ]); + this.popup = new ComfyPopup({ + target: this.element, + container: position === "relative" ? this.element : document.body, + classList: "comfyui-split-button-popup" + (mode === "hover" ? " hover" : ""), + closeOnEscape: mode === "click", + position, + horizontal, + }); + + this.arrow.withPopup(this.popup, mode); + + this.items = prop(this, "items", items, () => this.update()); + } + + update() { + this.popup.element.replaceChildren(...this.items.map((b) => b.element ?? b)); + } +} diff --git a/web/scripts/ui/dialog.js b/web/scripts/ui/dialog.js index aee93b3c8..803a97a2b 100644 --- a/web/scripts/ui/dialog.js +++ b/web/scripts/ui/dialog.js @@ -1,20 +1,26 @@ import { $el } from "../ui.js"; -export class ComfyDialog { - constructor() { - this.element = $el("div.comfy-modal", { parent: document.body }, [ +export class ComfyDialog extends EventTarget { + #buttons; + + constructor(type = "div", buttons = null) { + super(); + this.#buttons = buttons; + this.element = $el(type + ".comfy-modal", { parent: document.body }, [ $el("div.comfy-modal-content", [$el("p", { $: (p) => (this.textElement = p) }), ...this.createButtons()]), ]); } createButtons() { - return [ - $el("button", { - type: "button", - textContent: "Close", - onclick: () => this.close(), - }), - ]; + return ( + this.#buttons ?? [ + $el("button", { + type: "button", + textContent: "Close", + onclick: () => this.close(), + }), + ] + ); } close() { @@ -25,7 +31,7 @@ export class ComfyDialog { if (typeof html === "string") { this.textElement.innerHTML = html; } else { - this.textElement.replaceChildren(html); + this.textElement.replaceChildren(...(html instanceof Array ? html : [html])); } this.element.style.display = "flex"; } diff --git a/web/scripts/ui/menu/index.js b/web/scripts/ui/menu/index.js new file mode 100644 index 000000000..1e00b3d22 --- /dev/null +++ b/web/scripts/ui/menu/index.js @@ -0,0 +1,302 @@ +// @ts-check + +import { $el } from "../../ui.js"; +import { downloadBlob } from "../../utils.js"; +import { ComfyButton } from "../components/button.js"; +import { ComfyButtonGroup } from "../components/buttonGroup.js"; +import { ComfySplitButton } from "../components/splitButton.js"; +import { ComfyViewHistoryButton } from "./viewHistory.js"; +import { ComfyQueueButton } from "./queueButton.js"; +import { ComfyWorkflowsMenu } from "./workflows.js"; +import { ComfyViewQueueButton } from "./viewQueue.js"; +import { getInteruptButton } from "./interruptButton.js"; + +const collapseOnMobile = (t) => { + (t.element ?? t).classList.add("comfyui-menu-mobile-collapse"); + return t; +}; +const showOnMobile = (t) => { + (t.element ?? t).classList.add("lt-lg-show"); + return t; +}; + +export class ComfyAppMenu { + #sizeBreak = "lg"; + #lastSizeBreaks = { + lg: null, + md: null, + sm: null, + xs: null, + }; + #sizeBreaks = Object.keys(this.#lastSizeBreaks); + #cachedInnerSize = null; + #cacheTimeout = null; + + /** + * @param { import("../../app.js").ComfyApp } app + */ + constructor(app) { + this.app = app; + + this.workflows = new ComfyWorkflowsMenu(app); + const getSaveButton = (t) => + new ComfyButton({ + icon: "content-save", + tooltip: "Save the current workflow", + action: () => app.workflowManager.activeWorkflow.save(), + content: t, + }); + + this.logo = $el("h1.comfyui-logo.nlg-hide", { title: "ComfyUI" }, "ComfyUI"); + this.saveButton = new ComfySplitButton( + { + primary: getSaveButton(), + mode: "hover", + position: "absolute", + }, + getSaveButton("Save"), + new ComfyButton({ + icon: "content-save-edit", + content: "Save As", + tooltip: "Save the current graph as a new workflow", + action: () => app.workflowManager.activeWorkflow.save(true), + }), + new ComfyButton({ + icon: "download", + content: "Export", + tooltip: "Export the current workflow as JSON", + action: () => this.exportWorkflow("workflow", "workflow"), + }), + new ComfyButton({ + icon: "api", + content: "Export (API Format)", + tooltip: "Export the current workflow as JSON for use with the ComfyUI API", + action: () => this.exportWorkflow("workflow_api", "output"), + visibilitySetting: { id: "Comfy.DevMode", showValue: true }, + app, + }) + ); + this.actionsGroup = new ComfyButtonGroup( + new ComfyButton({ + icon: "refresh", + content: "Refresh", + tooltip: "Refresh widgets in nodes to find new models or files", + action: () => app.refreshComboInNodes(), + }), + new ComfyButton({ + icon: "clipboard-edit-outline", + content: "Clipspace", + tooltip: "Open Clipspace window", + action: () => app["openClipspace"](), + }), + new ComfyButton({ + icon: "fit-to-page-outline", + content: "Reset View", + tooltip: "Reset the canvas view", + action: () => app.resetView(), + }), + new ComfyButton({ + icon: "cancel", + content: "Clear", + tooltip: "Clears current workflow", + action: () => { + if (!app.ui.settings.getSettingValue("Comfy.ConfirmClear", true) || confirm("Clear workflow?")) { + app.clean(); + app.graph.clear(); + } + }, + }) + ); + this.settingsGroup = new ComfyButtonGroup( + new ComfyButton({ + icon: "cog", + content: "Settings", + tooltip: "Open settings", + action: () => { + app.ui.settings.show(); + }, + }) + ); + this.viewGroup = new ComfyButtonGroup( + new ComfyViewHistoryButton(app).element, + new ComfyViewQueueButton(app).element, + getInteruptButton("nlg-hide").element + ); + this.mobileMenuButton = new ComfyButton({ + icon: "menu", + action: (_, btn) => { + btn.icon = this.element.classList.toggle("expanded") ? "menu-open" : "menu"; + window.dispatchEvent(new Event("resize")); + }, + classList: "comfyui-button comfyui-menu-button", + }); + + this.element = $el("nav.comfyui-menu.lg", { style: { display: "none" } }, [ + this.logo, + this.workflows.element, + this.saveButton.element, + collapseOnMobile(this.actionsGroup).element, + $el("section.comfyui-menu-push"), + collapseOnMobile(this.settingsGroup).element, + collapseOnMobile(this.viewGroup).element, + + getInteruptButton("lt-lg-show").element, + new ComfyQueueButton(app).element, + showOnMobile(this.mobileMenuButton).element, + ]); + + let resizeHandler; + this.menuPositionSetting = app.ui.settings.addSetting({ + id: "Comfy.UseNewMenu", + defaultValue: "Disabled", + name: "[Beta] Use new menu and workflow management. Note: On small screens the menu will always be at the top.", + type: "combo", + options: ["Disabled", "Top", "Bottom"], + onChange: async (v) => { + if (v && v !== "Disabled") { + if (!resizeHandler) { + resizeHandler = () => { + this.calculateSizeBreak(); + }; + window.addEventListener("resize", resizeHandler); + } + this.updatePosition(v); + } else { + if (resizeHandler) { + window.removeEventListener("resize", resizeHandler); + resizeHandler = null; + } + document.body.style.removeProperty("display"); + app.ui.menuContainer.style.removeProperty("display"); + this.element.style.display = "none"; + app.ui.restoreMenuPosition(); + } + window.dispatchEvent(new Event("resize")); + }, + }); + } + + updatePosition(v) { + document.body.style.display = "grid"; + this.app.ui.menuContainer.style.display = "none"; + this.element.style.removeProperty("display"); + this.position = v; + if (v === "Bottom") { + this.app.bodyBottom.append(this.element); + } else { + this.app.bodyTop.prepend(this.element); + } + this.calculateSizeBreak(); + } + + updateSizeBreak(idx, prevIdx, direction) { + const newSize = this.#sizeBreaks[idx]; + if (newSize === this.#sizeBreak) return; + this.#cachedInnerSize = null; + clearTimeout(this.#cacheTimeout); + + this.#sizeBreak = this.#sizeBreaks[idx]; + for (let i = 0; i < this.#sizeBreaks.length; i++) { + const sz = this.#sizeBreaks[i]; + if (sz === this.#sizeBreak) { + this.element.classList.add(sz); + } else { + this.element.classList.remove(sz); + } + if (i < idx) { + this.element.classList.add("lt-" + sz); + } else { + this.element.classList.remove("lt-" + sz); + } + } + + if (idx) { + // We're on a small screen, force the menu at the top + if (this.position !== "Top") { + this.updatePosition("Top"); + } + } else if (this.position != this.menuPositionSetting.value) { + // Restore user position + this.updatePosition(this.menuPositionSetting.value); + } + + // Allow multiple updates, but prevent bouncing + if (!direction) { + direction = prevIdx - idx; + } else if (direction != prevIdx - idx) { + return; + } + this.calculateSizeBreak(direction); + } + + calculateSizeBreak(direction = 0) { + let idx = this.#sizeBreaks.indexOf(this.#sizeBreak); + const currIdx = idx; + const innerSize = this.calculateInnerSize(idx); + if (window.innerWidth >= this.#lastSizeBreaks[this.#sizeBreaks[idx - 1]]) { + if (idx > 0) { + idx--; + } + } else if (innerSize > this.element.clientWidth) { + this.#lastSizeBreaks[this.#sizeBreak] = Math.max(window.innerWidth, innerSize); + // We need to shrink + if (idx < this.#sizeBreaks.length - 1) { + idx++; + } + } + + this.updateSizeBreak(idx, currIdx, direction); + } + + calculateInnerSize(idx) { + // Cache the inner size to prevent too much calculation when resizing the window + clearTimeout(this.#cacheTimeout); + if (this.#cachedInnerSize) { + // Extend cache time + this.#cacheTimeout = setTimeout(() => (this.#cachedInnerSize = null), 100); + } else { + let innerSize = 0; + let count = 1; + for (const c of this.element.children) { + if (c.classList.contains("comfyui-menu-push")) continue; // ignore right push + if (idx && c.classList.contains("comfyui-menu-mobile-collapse")) continue; // ignore collapse items + innerSize += c.clientWidth; + count++; + } + innerSize += 8 * count; + this.#cachedInnerSize = innerSize; + this.#cacheTimeout = setTimeout(() => (this.#cachedInnerSize = null), 100); + } + return this.#cachedInnerSize; + } + + /** + * @param {string} defaultName + */ + getFilename(defaultName) { + if (this.app.ui.settings.getSettingValue("Comfy.PromptFilename", true)) { + defaultName = prompt("Save workflow as:", defaultName); + if (!defaultName) return; + if (!defaultName.toLowerCase().endsWith(".json")) { + defaultName += ".json"; + } + } + return defaultName; + } + + /** + * @param {string} [filename] + * @param { "workflow" | "output" } [promptProperty] + */ + async exportWorkflow(filename, promptProperty) { + if (this.app.workflowManager.activeWorkflow?.path) { + filename = this.app.workflowManager.activeWorkflow.name; + } + const p = await this.app.graphToPrompt(); + const json = JSON.stringify(p[promptProperty], null, 2); + const blob = new Blob([json], { type: "application/json" }); + const file = this.getFilename(filename); + if (!file) return; + downloadBlob(file, blob); + } +} diff --git a/web/scripts/ui/menu/interruptButton.js b/web/scripts/ui/menu/interruptButton.js new file mode 100644 index 000000000..4db3328db --- /dev/null +++ b/web/scripts/ui/menu/interruptButton.js @@ -0,0 +1,23 @@ +// @ts-check + +import { api } from "../../api.js"; +import { ComfyButton } from "../components/button.js"; + +export function getInteruptButton(visibility) { + const btn = new ComfyButton({ + icon: "close", + tooltip: "Cancel current generation", + enabled: false, + action: () => { + api.interrupt(); + }, + classList: ["comfyui-button", "comfyui-interrupt-button", visibility], + }); + + api.addEventListener("status", ({ detail }) => { + const sz = detail?.exec_info?.queue_remaining; + btn.enabled = sz > 0; + }); + + return btn; +} diff --git a/web/scripts/ui/menu/menu.css b/web/scripts/ui/menu/menu.css new file mode 100644 index 000000000..20eeab2cf --- /dev/null +++ b/web/scripts/ui/menu/menu.css @@ -0,0 +1,701 @@ +.relative { + position: relative; +} +.hidden { + display: none !important; +} +.mdi.rotate270::before { + transform: rotate(270deg); +} + +/* Generic */ +.comfyui-button { + display: flex; + align-items: center; + gap: 0.5em; + cursor: pointer; + border: none; + border-radius: 4px; + padding: 4px 8px; + box-sizing: border-box; + margin: 0; +} + +.comfyui-button:disabled { + opacity: 0.5; + cursor: not-allowed; +} +.primary .comfyui-button, +.primary.comfyui-button { + background-color: var(--primary-bg) !important; + color: var(--primary-fg) !important; +} + +.primary .comfyui-button:not(:disabled):hover, +.primary.comfyui-button:not(:disabled):hover { + background-color: var(--primary-hover-bg) !important; + color: var(--primary-hover-fg) !important; +} + +/* Popup */ +.comfyui-popup { + position: absolute; + left: var(--left); + right: var(--right); + top: var(--top); + bottom: var(--bottom); + z-index: 2000; + max-height: calc(100vh - var(--limit) - 10px); + box-shadow: 3px 3px 5px 0px rgba(0, 0, 0, 0.3); +} + +.comfyui-popup:not(.open) { + display: none; +} + +.comfyui-popup.right.open { + border-top-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + overflow: hidden; +} +/* Split button */ +.comfyui-split-button { + position: relative; + display: flex; +} + +.comfyui-split-primary { + flex: auto; +} + +.comfyui-split-primary .comfyui-button { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 1px solid var(--comfy-menu-bg); + width: 100%; +} + +.comfyui-split-arrow .comfyui-button { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + padding-left: 2px; + padding-right: 2px; +} + +.comfyui-split-button-popup { + white-space: nowrap; + background-color: var(--content-bg); + color: var(--content-fg); + display: flex; + flex-direction: column; + overflow: auto; +} + +.comfyui-split-button-popup.hover { + z-index: 2001; +} +.comfyui-split-button-popup > .comfyui-button { + border: none; + background-color: transparent; + color: var(--fg-color); + padding: 8px 12px 8px 8px; +} + +.comfyui-split-button-popup > .comfyui-button:not(:disabled):hover { + background-color: var(--comfy-input-bg); +} + +/* Button group */ +.comfyui-button-group { + display: flex; + border-radius: 4px; + overflow: hidden; +} + +.comfyui-button-group > .comfyui-button, +.comfyui-button-group > .comfyui-button-wrapper > .comfyui-button { + padding: 4px 10px; + border-radius: 0; +} + +/* Menu */ +.comfyui-menu { + width: 100vw; + background: var(--comfy-menu-bg); + color: var(--fg-color); + font-family: Arial, Helvetica, sans-serif; + font-size: 0.8em; + display: flex; + padding: 4px 8px; + align-items: center; + gap: 8px; + box-sizing: border-box; + z-index: 1000; + order: 0; + grid-column: 1/-1; + overflow: auto; + max-height: 90vh; +} + +.comfyui-menu>* { + flex-shrink: 0; +} +.comfyui-menu .mdi::before { + font-size: 18px; +} + +.comfyui-menu .comfyui-button { + background: var(--comfy-input-bg); + color: var(--fg-color); + white-space: nowrap; +} + +.comfyui-menu .comfyui-button:not(:disabled):hover { + background: var(--border-color); + color: var(--content-fg); +} + +.comfyui-menu .comfyui-split-button-popup > .comfyui-button { + border-radius: 0; + background-color: transparent; +} + +.comfyui-menu .comfyui-split-button-popup > .comfyui-button:not(:disabled):hover { + background-color: var(--comfy-input-bg); +} + +.comfyui-menu .comfyui-split-button-popup.left { + border-top-right-radius: 4px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +.comfyui-menu .comfyui-button.popup-open { + background-color: var(--content-bg); + color: var(--content-fg); +} + +.comfyui-menu-push { + margin-left: -0.8em; + flex: auto; +} + +.comfyui-logo { + font-size: 1.2em; + margin: 0; + user-select: none; + cursor: default; +} + +/* Workflows */ +.comfyui-workflows-button { + flex-direction: row-reverse; + max-width: 200px; + position: relative; + z-index: 0; +} + +.comfyui-workflows-button.popup-open { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +.comfyui-workflows-button.unsaved { + font-style: italic; +} +.comfyui-workflows-button-progress { + position: absolute; + top: 0; + left: 0; + background-color: green; + height: 100%; + border-radius: 4px; + z-index: -1; +} + +.comfyui-workflows-button > span { + flex: auto; + text-align: left; + overflow: hidden; +} +.comfyui-workflows-button-inner { + display: flex; + align-items: center; + gap: 7px; + width: 150px; +} +.comfyui-workflows-label { + overflow: hidden; + text-overflow: ellipsis; + direction: rtl; + flex: auto; + position: relative; +} + +.comfyui-workflows-button.unsaved .comfyui-workflows-label { + padding-left: 8px; +} + +.comfyui-workflows-button.unsaved .comfyui-workflows-label:after { + content: "*"; + position: absolute; + top: 0; + left: 0; +} +.comfyui-workflows-button-inner .mdi-graph::before { + transform: rotate(-90deg); +} + +.comfyui-workflows-popup { + font-family: Arial, Helvetica, sans-serif; + font-size: 0.8em; + padding: 10px; + overflow: auto; + background-color: var(--content-bg); + color: var(--content-fg); + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + z-index: 400; +} + +.comfyui-workflows-panel { + min-height: 150px; +} + +.comfyui-workflows-panel .lds-ring { + transform: translate(-50%); + position: absolute; + left: 50%; + top: 75px; +} + +.comfyui-workflows-panel h3 { + margin: 10px 0 10px 0; + font-size: 11px; + opacity: 0.8; +} + +.comfyui-workflows-panel section header { + display: flex; + justify-content: space-between; + align-items: center; +} +.comfy-ui-workflows-search .mdi { + position: relative; + top: 2px; + pointer-events: none; +} +.comfy-ui-workflows-search input { + background-color: var(--comfy-input-bg); + color: var(--input-text); + border: none; + border-radius: 4px; + padding: 4px 10px; + margin-left: -24px; + text-indent: 18px; +} +.comfy-ui-workflows-search input:placeholder-shown { + width: 10px; +} +.comfy-ui-workflows-search input:placeholder-shown:focus { + width: auto; +} +.comfyui-workflows-actions { + display: flex; + gap: 10px; + margin-bottom: 10px; +} + +.comfyui-workflows-actions .comfyui-button { + background: var(--comfy-input-bg); + color: var(--input-text); +} + +.comfyui-workflows-actions .comfyui-button:not(:disabled):hover { + background: var(--primary-bg); + color: var(--primary-fg); +} + +.comfyui-workflows-favorites, +.comfyui-workflows-open { + border-bottom: 1px solid var(--comfy-input-bg); + padding-bottom: 5px; + margin-bottom: 5px; +} + +.comfyui-workflows-open .active { + font-weight: bold; +} + +.comfyui-workflows-favorites:empty { + display: none; +} + +.comfyui-workflows-tree { + padding: 0; + margin: 0; +} + +.comfyui-workflows-tree:empty::after { + content: "No saved workflows"; + display: block; + text-align: center; +} +.comfyui-workflows-tree > ul { + padding: 0; +} + +.comfyui-workflows-tree > ul ul { + margin: 0; + padding: 0 0 0 25px; +} + +.comfyui-workflows-tree:not(.filtered) .closed > ul { + display: none; +} + +.comfyui-workflows-tree li, +.comfyui-workflows-tree-file { + --item-height: 32px; + list-style-type: none; + height: var(--item-height); + display: flex; + align-items: center; + gap: 5px; + cursor: pointer; + user-select: none; +} + +.comfyui-workflows-tree-file.active::before, +.comfyui-workflows-tree li:hover::before, +.comfyui-workflows-tree-file:hover::before { + content: ""; + position: absolute; + width: 100%; + left: 0; + height: var(--item-height); + background-color: var(--content-hover-bg); + color: var(--content-hover-fg); + z-index: -1; +} + +.comfyui-workflows-tree-file.active::before { + background-color: var(--primary-bg); + color: var(--primary-fg); +} + +.comfyui-workflows-tree-file.running:not(:hover)::before { + content: ""; + position: absolute; + width: var(--progress, 0); + left: 0; + height: var(--item-height); + background-color: green; + z-index: -1; +} + +.comfyui-workflows-tree-file.unsaved span { + font-style: italic; +} + +.comfyui-workflows-tree-file span { + flex: auto; +} + +.comfyui-workflows-tree-file span + .comfyui-workflows-file-action { + margin-left: 10px; +} + +.comfyui-workflows-tree-file .comfyui-workflows-file-action { + background-color: transparent; + color: var(--fg-color); + padding: 2px 4px; +} + +.lg ~ .comfyui-workflows-popup .comfyui-workflows-tree-file:not(:hover) .comfyui-workflows-file-action { + opacity: 0; +} + +.comfyui-workflows-tree-file .comfyui-workflows-file-action:hover { + background-color: var(--primary-bg); + color: var(--primary-fg); +} + +.comfyui-workflows-tree-file .comfyui-workflows-file-action-primary { + background-color: transparent; + color: var(--fg-color); + padding: 2px 4px; + margin: 0 -4px; +} + +.comfyui-workflows-file-action-favorite .mdi-star { + color: orange; +} + +/* View List */ +.comfyui-view-list-popup { + padding: 10px; + background-color: var(--content-bg); + color: var(--content-fg); + min-width: 170px; + min-height: 435px; + display: flex; + flex-direction: column; + align-items: center; + box-sizing: border-box; +} +.comfyui-view-list-popup h3 { + margin: 0 0 5px 0; +} +.comfyui-view-list-items { + width: 100%; + background: var(--comfy-menu-bg); + border-radius: 5px; + display: flex; + justify-content: center; + flex: auto; + align-items: center; + flex-direction: column; +} +.comfyui-view-list-items section { + max-height: 400px; + overflow: auto; + width: 100%; + display: grid; + grid-template-columns: auto auto auto; + align-items: center; + justify-content: center; + gap: 5px; + padding: 5px 0; +} +.comfyui-view-list-items section + section { + border-top: 1px solid var(--border-color); + margin-top: 10px; + padding-top: 5px; +} +.comfyui-view-list-items section h5 { + grid-column: 1 / 4; + text-align: center; + margin: 5px; +} +.comfyui-view-list-items span { + text-align: center; + padding: 0 2px; +} +.comfyui-view-list-popup header { + margin-bottom: 10px; + display: flex; + gap: 5px; +} +.comfyui-view-list-popup header .comfyui-button { + border: 1px solid transparent; +} +.comfyui-view-list-popup header .comfyui-button:not(:disabled):hover { + border: 1px solid var(--comfy-menu-bg); +} +/* Queue button */ +.comfyui-queue-button .comfyui-split-primary .comfyui-button { + padding-right: 12px; +} +.comfyui-queue-count { + margin-left: 5px; + border-radius: 10px; + background-color: rgb(8, 80, 153); + padding: 2px 4px; + font-size: 10px; + min-width: 1em; + display: inline-block; +} +/* Queue options*/ +.comfyui-queue-options { + padding: 10px; + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + display: flex; + gap: 10px; +} + +.comfyui-queue-batch { + display: flex; + flex-direction: column; + border-right: 1px solid var(--comfy-menu-bg); + padding-right: 10px; + gap: 5px; +} + +.comfyui-queue-batch input { + width: 145px; +} + +.comfyui-queue-batch .comfyui-queue-batch-value { + width: 70px; +} + +.comfyui-queue-mode { + display: flex; + flex-direction: column; +} + +.comfyui-queue-mode span { + font-weight: bold; + margin-bottom: 2px; +} + +.comfyui-queue-mode label { + display: flex; + flex-direction: row-reverse; + justify-content: start; + gap: 5px; + padding: 2px 0; +} + +.comfyui-queue-mode label input { + padding: 0; + margin: 0; +} + +/** Send to workflow widget selection dialog */ +.comfy-widget-selection-dialog { + border: none; +} + +.comfy-widget-selection-dialog div { + color: var(--fg-color); + font-family: Arial, Helvetica, sans-serif; +} + +.comfy-widget-selection-dialog h2 { + margin-top: 0; +} + +.comfy-widget-selection-dialog section { + width: fit-content; + display: flex; + flex-direction: column; +} + +.comfy-widget-selection-item { + display: flex; + gap: 10px; + align-items: center; +} + +.comfy-widget-selection-item span { + margin-right: auto; +} + +.comfy-widget-selection-item span::before { + content: '#' attr(data-id); + opacity: 0.5; + margin-right: 5px; +} + +.comfy-modal .comfy-widget-selection-item button { + font-size: 1em; +} + +/***** Responsive *****/ +.lg.comfyui-menu .lt-lg-show { + display: none !important; +} +.comfyui-menu:not(.lg) .nlg-hide { + display: none !important; +} +/** Large screen */ +.lg.comfyui-menu>.comfyui-menu-mobile-collapse .comfyui-button span, +.lg.comfyui-menu>.comfyui-menu-mobile-collapse.comfyui-button span { + display: none; +} +.lg.comfyui-menu>.comfyui-menu-mobile-collapse .comfyui-popup .comfyui-button span { + display: unset; +} + +/** Non large screen */ +.lt-lg.comfyui-menu { + flex-wrap: wrap; +} + +.lt-lg.comfyui-menu > *:not(.comfyui-menu-mobile-collapse) { + order: 1; +} + +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse { + order: 9999; + width: 100%; +} + +.comfyui-body-bottom .lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse { + order: -1; +} + +.comfyui-body-bottom .lt-lg.comfyui-menu > .comfyui-menu-button { + top: unset; + bottom: 4px; +} + +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse.comfyui-button-group { + flex-wrap: wrap; +} + +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse .comfyui-button, +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse.comfyui-button { + padding: 10px; +} +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse .comfyui-button, +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse .comfyui-button-wrapper { + width: 100%; +} + +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse .comfyui-popup { + position: static; + background-color: var(--comfy-input-bg); + max-width: unset; + max-height: 50vh; + overflow: auto; +} + +.lt-lg.comfyui-menu:not(.expanded) > .comfyui-menu-mobile-collapse { + display: none; +} + +.lt-lg .comfyui-queue-button { + margin-right: 44px; +} + +.lt-lg .comfyui-menu-button { + position: absolute; + top: 4px; + right: 8px; +} + +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse .comfyui-view-list-popup { + border-radius: 0; +} + +.lt-lg.comfyui-menu .comfyui-workflows-popup { + width: 100vw; +} + +/** Small */ +.lt-md .comfyui-workflows-button-inner { + width: unset !important; +} +.lt-md .comfyui-workflows-label { + display: none; +} + +/** Extra small */ +.lt-sm .comfyui-queue-button { + margin-right: 0; + width: 100%; +} +.lt-sm .comfyui-queue-button .comfyui-button { + justify-content: center; +} +.lt-sm .comfyui-interrupt-button { + margin-right: 45px; +} +.comfyui-body-bottom .lt-sm.comfyui-menu > .comfyui-menu-button{ + bottom: 41px; +} \ No newline at end of file diff --git a/web/scripts/ui/menu/queueButton.js b/web/scripts/ui/menu/queueButton.js new file mode 100644 index 000000000..3c29ab090 --- /dev/null +++ b/web/scripts/ui/menu/queueButton.js @@ -0,0 +1,93 @@ +// @ts-check + +import { ComfyButton } from "../components/button.js"; +import { $el } from "../../ui.js"; +import { api } from "../../api.js"; +import { ComfySplitButton } from "../components/splitButton.js"; +import { ComfyQueueOptions } from "./queueOptions.js"; +import { prop } from "../../utils.js"; + +export class ComfyQueueButton { + element = $el("div.comfyui-queue-button"); + #internalQueueSize = 0; + + queuePrompt = async (e) => { + this.#internalQueueSize += this.queueOptions.batchCount; + // Hold shift to queue front + await this.app.queuePrompt(-e.shiftKey, this.queueOptions.batchCount); + }; + + constructor(app) { + this.app = app; + this.queueSizeElement = $el("span.comfyui-queue-count", { + textContent: "?", + }); + + const queue = new ComfyButton({ + content: $el("div", [ + $el("span", { + textContent: "Queue", + }), + this.queueSizeElement, + ]), + icon: "play", + classList: "comfyui-button", + action: this.queuePrompt, + }); + + this.queueOptions = new ComfyQueueOptions(app); + + const btn = new ComfySplitButton( + { + primary: queue, + mode: "click", + position: "absolute", + horizontal: "right", + }, + this.queueOptions.element + ); + btn.element.classList.add("primary"); + this.element.append(btn.element); + + this.autoQueueMode = prop(this, "autoQueueMode", "", () => { + switch (this.autoQueueMode) { + case "instant": + queue.icon = "infinity"; + break; + case "change": + queue.icon = "auto-mode"; + break; + default: + queue.icon = "play"; + break; + } + }); + + this.queueOptions.addEventListener("autoQueueMode", (e) => (this.autoQueueMode = e["detail"])); + + api.addEventListener("graphChanged", () => { + if (this.autoQueueMode === "change") { + if (this.#internalQueueSize) { + this.graphHasChanged = true; + } else { + this.graphHasChanged = false; + this.queuePrompt(); + } + } + }); + + api.addEventListener("status", ({ detail }) => { + this.#internalQueueSize = detail?.exec_info?.queue_remaining; + if (this.#internalQueueSize != null) { + this.queueSizeElement.textContent = this.#internalQueueSize > 99 ? "99+" : this.#internalQueueSize + ""; + this.queueSizeElement.title = `${this.#internalQueueSize} prompts in queue`; + if (!this.#internalQueueSize && !app.lastExecutionError) { + if (this.autoQueueMode === "instant" || (this.autoQueueMode === "change" && this.graphHasChanged)) { + this.graphHasChanged = false; + this.queuePrompt(); + } + } + } + }); + } +} diff --git a/web/scripts/ui/menu/queueOptions.js b/web/scripts/ui/menu/queueOptions.js new file mode 100644 index 000000000..f3d34e74e --- /dev/null +++ b/web/scripts/ui/menu/queueOptions.js @@ -0,0 +1,77 @@ +// @ts-check + +import { $el } from "../../ui.js"; +import { prop } from "../../utils.js"; + +export class ComfyQueueOptions extends EventTarget { + element = $el("div.comfyui-queue-options"); + + constructor(app) { + super(); + this.app = app; + + this.batchCountInput = $el("input", { + className: "comfyui-queue-batch-value", + type: "number", + min: "1", + value: "1", + oninput: () => (this.batchCount = +this.batchCountInput.value), + }); + + this.batchCountRange = $el("input", { + type: "range", + min: "1", + max: "100", + value: "1", + oninput: () => (this.batchCount = +this.batchCountRange.value), + }); + + this.element.append( + $el("div.comfyui-queue-batch", [ + $el( + "label", + { + textContent: "Batch count: ", + }, + this.batchCountInput + ), + this.batchCountRange, + ]) + ); + + const createOption = (text, value, checked = false) => + $el( + "label", + { textContent: text }, + $el("input", { + type: "radio", + name: "AutoQueueMode", + checked, + value, + oninput: (e) => (this.autoQueueMode = e.target["value"]), + }) + ); + + this.autoQueueEl = $el("div.comfyui-queue-mode", [ + $el("span", "Auto Queue:"), + createOption("Disabled", "", true), + createOption("Instant", "instant"), + createOption("On Change", "change"), + ]); + + this.element.append(this.autoQueueEl); + + this.batchCount = prop(this, "batchCount", 1, () => { + this.batchCountInput.value = this.batchCount + ""; + this.batchCountRange.value = this.batchCount + ""; + }); + + this.autoQueueMode = prop(this, "autoQueueMode", "Disabled", () => { + this.dispatchEvent( + new CustomEvent("autoQueueMode", { + detail: this.autoQueueMode, + }) + ); + }); + } +} diff --git a/web/scripts/ui/menu/viewHistory.js b/web/scripts/ui/menu/viewHistory.js new file mode 100644 index 000000000..de6b343dc --- /dev/null +++ b/web/scripts/ui/menu/viewHistory.js @@ -0,0 +1,27 @@ +// @ts-check + +import { ComfyButton } from "../components/button.js"; +import { ComfyViewList, ComfyViewListButton } from "./viewList.js"; + +export class ComfyViewHistoryButton extends ComfyViewListButton { + constructor(app) { + super(app, { + button: new ComfyButton({ + content: "View History", + icon: "history", + tooltip: "View history", + classList: "comfyui-button comfyui-history-button", + }), + list: ComfyViewHistoryList, + mode: "History", + }); + } +} + +export class ComfyViewHistoryList extends ComfyViewList { + async loadItems() { + const items = await super.loadItems(); + items["History"].reverse(); + return items; + } +} diff --git a/web/scripts/ui/menu/viewList.js b/web/scripts/ui/menu/viewList.js new file mode 100644 index 000000000..693ca335c --- /dev/null +++ b/web/scripts/ui/menu/viewList.js @@ -0,0 +1,203 @@ +// @ts-check + +import { ComfyButton } from "../components/button.js"; +import { $el } from "../../ui.js"; +import { api } from "../../api.js"; +import { ComfyPopup } from "../components/popup.js"; + +export class ComfyViewListButton { + get open() { + return this.popup.open; + } + + set open(open) { + this.popup.open = open; + } + + constructor(app, { button, list, mode }) { + this.app = app; + this.button = button; + this.element = $el("div.comfyui-button-wrapper", this.button.element); + this.popup = new ComfyPopup({ + target: this.element, + container: this.element, + horizontal: "right", + }); + this.list = new (list ?? ComfyViewList)(app, mode, this.popup); + this.popup.children = [this.list.element]; + this.popup.addEventListener("open", () => { + this.list.update(); + }); + this.popup.addEventListener("close", () => { + this.list.close(); + }); + this.button.withPopup(this.popup); + + api.addEventListener("status", () => { + if (this.popup.open) { + this.popup.update(); + } + }); + } +} + +export class ComfyViewList { + popup; + + constructor(app, mode, popup) { + this.app = app; + this.mode = mode; + this.popup = popup; + this.type = mode.toLowerCase(); + + this.items = $el(`div.comfyui-${this.type}-items.comfyui-view-list-items`); + this.clear = new ComfyButton({ + icon: "cancel", + content: "Clear", + action: async () => { + this.showSpinner(false); + await api.clearItems(this.type); + await this.update(); + }, + }); + + this.refresh = new ComfyButton({ + icon: "refresh", + content: "Refresh", + action: async () => { + await this.update(false); + }, + }); + + this.element = $el(`div.comfyui-${this.type}-popup.comfyui-view-list-popup`, [ + $el("h3", mode), + $el("header", [this.clear.element, this.refresh.element]), + this.items, + ]); + + api.addEventListener("status", () => { + if (this.popup.open) { + this.update(); + } + }); + } + + async close() { + this.items.replaceChildren(); + } + + async update(resize = true) { + this.showSpinner(resize); + const res = await this.loadItems(); + let any = false; + + const names = Object.keys(res); + const sections = names + .map((section) => { + const items = res[section]; + if (items?.length) { + any = true; + } else { + return; + } + + const rows = []; + if (names.length > 1) { + rows.push($el("h5", section)); + } + rows.push(...items.flatMap((item) => this.createRow(item, section))); + return $el("section", rows); + }) + .filter(Boolean); + + if (any) { + this.items.replaceChildren(...sections); + } else { + this.items.replaceChildren($el("h5", "None")); + } + + this.popup.update(); + this.clear.enabled = this.refresh.enabled = true; + this.element.style.removeProperty("height"); + } + + showSpinner(resize = true) { + // if (!this.spinner) { + // this.spinner = createSpinner(); + // } + // if (!resize) { + // this.element.style.height = this.element.clientHeight + "px"; + // } + // this.clear.enabled = this.refresh.enabled = false; + // this.items.replaceChildren( + // $el( + // "div", + // { + // style: { + // fontSize: "18px", + // }, + // }, + // this.spinner + // ) + // ); + // this.popup.update(); + } + + async loadItems() { + return await api.getItems(this.type); + } + + getRow(item, section) { + return { + text: item.prompt[0] + "", + actions: [ + { + text: "Load", + action: async () => { + try { + await this.app.loadGraphData(item.prompt[3].extra_pnginfo.workflow); + if (item.outputs) { + this.app.nodeOutputs = item.outputs; + } + } catch (error) { + alert("Error loading workflow: " + error.message); + console.error(error); + } + }, + }, + { + text: "Delete", + action: async () => { + try { + await api.deleteItem(this.type, item.prompt[1]); + this.update(); + } catch (error) {} + }, + }, + ], + }; + } + + createRow = (item, section) => { + const row = this.getRow(item, section); + return [ + $el("span", row.text), + ...row.actions.map( + (a) => + new ComfyButton({ + content: a.text, + action: async (e, btn) => { + btn.enabled = false; + try { + await a.action(); + } catch (error) { + throw error; + } finally { + btn.enabled = true; + } + }, + }).element + ), + ]; + }; +} diff --git a/web/scripts/ui/menu/viewQueue.js b/web/scripts/ui/menu/viewQueue.js new file mode 100644 index 000000000..97d012986 --- /dev/null +++ b/web/scripts/ui/menu/viewQueue.js @@ -0,0 +1,55 @@ +// @ts-check + +import { ComfyButton } from "../components/button.js"; +import { ComfyViewList, ComfyViewListButton } from "./viewList.js"; +import { api } from "../../api.js"; + +export class ComfyViewQueueButton extends ComfyViewListButton { + constructor(app) { + super(app, { + button: new ComfyButton({ + content: "View Queue", + icon: "format-list-numbered", + tooltip: "View queue", + classList: "comfyui-button comfyui-queue-button", + }), + list: ComfyViewQueueList, + mode: "Queue", + }); + } +} + +export class ComfyViewQueueList extends ComfyViewList { + getRow = (item, section) => { + if (section !== "Running") { + return super.getRow(item, section); + } + return { + text: item.prompt[0] + "", + actions: [ + { + text: "Load", + action: async () => { + try { + await this.app.loadGraphData(item.prompt[3].extra_pnginfo.workflow); + if (item.outputs) { + this.app.nodeOutputs = item.outputs; + } + } catch (error) { + alert("Error loading workflow: " + error.message); + console.error(error); + } + }, + }, + { + text: "Cancel", + action: async () => { + try { + await api.interrupt(); + } catch (error) {} + }, + }, + ], + }; + } +} diff --git a/web/scripts/ui/menu/workflows.js b/web/scripts/ui/menu/workflows.js new file mode 100644 index 000000000..afdff538a --- /dev/null +++ b/web/scripts/ui/menu/workflows.js @@ -0,0 +1,764 @@ +// @ts-check + +import { ComfyButton } from "../components/button.js"; +import { prop, getStorageValue, setStorageValue } from "../../utils.js"; +import { $el } from "../../ui.js"; +import { api } from "../../api.js"; +import { ComfyPopup } from "../components/popup.js"; +import { createSpinner } from "../spinner.js"; +import { ComfyWorkflow, trimJsonExt } from "../../workflows.js"; +import { ComfyAsyncDialog } from "../components/asyncDialog.js"; + +export class ComfyWorkflowsMenu { + #first = true; + element = $el("div.comfyui-workflows"); + + get open() { + return this.popup.open; + } + + set open(open) { + this.popup.open = open; + } + + /** + * @param {import("../../app.js").ComfyApp} app + */ + constructor(app) { + this.app = app; + this.#bindEvents(); + + const classList = { + "comfyui-workflows-button": true, + "comfyui-button": true, + unsaved: getStorageValue("Comfy.PreviousWorkflowUnsaved") === "true", + running: false, + }; + this.buttonProgress = $el("div.comfyui-workflows-button-progress"); + this.workflowLabel = $el("span.comfyui-workflows-label", ""); + this.button = new ComfyButton({ + content: $el("div.comfyui-workflows-button-inner", [$el("i.mdi.mdi-graph"), this.workflowLabel, this.buttonProgress]), + icon: "chevron-down", + classList, + }); + + this.element.append(this.button.element); + + this.popup = new ComfyPopup({ target: this.element, classList: "comfyui-workflows-popup" }); + this.content = new ComfyWorkflowsContent(app, this.popup); + this.popup.children = [this.content.element]; + this.popup.addEventListener("change", () => { + this.button.icon = "chevron-" + (this.popup.open ? "up" : "down"); + }); + this.button.withPopup(this.popup); + + this.unsaved = prop(this, "unsaved", classList.unsaved, (v) => { + classList.unsaved = v; + this.button.classList = classList; + setStorageValue("Comfy.PreviousWorkflowUnsaved", v); + }); + } + + #updateProgress = () => { + const prompt = this.app.workflowManager.activePrompt; + let percent = 0; + if (this.app.workflowManager.activeWorkflow === prompt?.workflow) { + const total = Object.values(prompt.nodes); + const done = total.filter(Boolean); + percent = (done.length / total.length) * 100; + } + this.buttonProgress.style.width = percent + "%"; + }; + + #updateActive = () => { + const active = this.app.workflowManager.activeWorkflow; + this.button.tooltip = active.path; + this.workflowLabel.textContent = active.name; + this.unsaved = active.unsaved; + + if (this.#first) { + this.#first = false; + this.content.load(); + } + + this.#updateProgress(); + }; + + #bindEvents() { + this.app.workflowManager.addEventListener("changeWorkflow", this.#updateActive); + this.app.workflowManager.addEventListener("rename", this.#updateActive); + this.app.workflowManager.addEventListener("delete", this.#updateActive); + + this.app.workflowManager.addEventListener("save", () => { + this.unsaved = this.app.workflowManager.activeWorkflow.unsaved; + }); + + this.app.workflowManager.addEventListener("execute", (e) => { + this.#updateProgress(); + }); + + api.addEventListener("graphChanged", () => { + this.unsaved = true; + }); + } + + #getMenuOptions(callback) { + const menu = []; + const directories = new Map(); + for (const workflow of this.app.workflowManager.workflows || []) { + const path = workflow.pathParts; + if (!path) continue; + let parent = menu; + let currentPath = ""; + for (let i = 0; i < path.length - 1; i++) { + currentPath += "/" + path[i]; + let newParent = directories.get(currentPath); + if (!newParent) { + newParent = { + title: path[i], + has_submenu: true, + submenu: { + options: [], + }, + }; + parent.push(newParent); + newParent = newParent.submenu.options; + directories.set(currentPath, newParent); + } + parent = newParent; + } + parent.push({ + title: trimJsonExt(path[path.length - 1]), + callback: () => callback(workflow), + }); + } + return menu; + } + + #getFavoriteMenuOptions(callback) { + const menu = []; + for (const workflow of this.app.workflowManager.workflows || []) { + if (workflow.isFavorite) { + menu.push({ + title: "⭐ " + workflow.name, + callback: () => callback(workflow), + }); + } + } + return menu; + } + + /** + * @param {import("../../app.js").ComfyApp} app + */ + registerExtension(app) { + const self = this; + app.registerExtension({ + name: "Comfy.Workflows", + async beforeRegisterNodeDef(nodeType) { + function getImageWidget(node) { + const inputs = { ...node.constructor?.nodeData?.input?.required, ...node.constructor?.nodeData?.input?.optional }; + for (const input in inputs) { + if (inputs[input][0] === "IMAGEUPLOAD") { + const imageWidget = node.widgets.find((w) => w.name === (inputs[input]?.[1]?.widget ?? "image")); + if (imageWidget) return imageWidget; + } + } + } + + function setWidgetImage(node, widget, img) { + const url = new URL(img.src); + const filename = url.searchParams.get("filename"); + const subfolder = url.searchParams.get("subfolder"); + const type = url.searchParams.get("type"); + const imageId = `${subfolder ? subfolder + "/" : ""}${filename} [${type}]`; + widget.value = imageId; + node.imgs = [img]; + app.graph.setDirtyCanvas(true, true); + } + + /** + * @param {HTMLImageElement} img + * @param {ComfyWorkflow} workflow + */ + async function sendToWorkflow(img, workflow) { + await workflow.load(); + let options = []; + const nodes = app.graph.computeExecutionOrder(false); + for (const node of nodes) { + const widget = getImageWidget(node); + if (widget == null) continue; + + if (node.title?.toLowerCase().includes("input")) { + options = [{ widget, node }]; + break; + } else { + options.push({ widget, node }); + } + } + + if (!options.length) { + alert("No image nodes have been found in this workflow!"); + return; + } else if (options.length > 1) { + const dialog = new WidgetSelectionDialog(options); + const res = await dialog.show(app); + if (!res) return; + options = [res]; + } + + setWidgetImage(options[0].node, options[0].widget, img); + } + + const getExtraMenuOptions = nodeType.prototype["getExtraMenuOptions"]; + nodeType.prototype["getExtraMenuOptions"] = function (_, options) { + const r = getExtraMenuOptions?.apply?.(this, arguments); + + if (app.ui.settings.getSettingValue("Comfy.UseNewMenu", false) === true) { + const t = /** @type { {imageIndex?: number, overIndex?: number, imgs: string[]} } */ /** @type {any} */ (this); + let img; + if (t.imageIndex != null) { + // An image is selected so select that + img = t.imgs?.[t.imageIndex]; + } else if (t.overIndex != null) { + // No image is selected but one is hovered + img = t.img?.s[t.overIndex]; + } + + if (img) { + let pos = options.findIndex((o) => o.content === "Save Image"); + if (pos === -1) { + pos = 0; + } else { + pos++; + } + + options.splice(pos, 0, { + content: "Send to workflow", + has_submenu: true, + submenu: { + options: [ + { + callback: () => sendToWorkflow(img, app.workflowManager.activeWorkflow), + title: "[Current workflow]", + }, + ...self.#getFavoriteMenuOptions(sendToWorkflow.bind(null, img)), + null, + ...self.#getMenuOptions(sendToWorkflow.bind(null, img)), + ], + }, + }); + } + } + + return r; + }; + }, + }); + } +} + +export class ComfyWorkflowsContent { + element = $el("div.comfyui-workflows-panel"); + treeState = {}; + treeFiles = {}; + /** @type { Map } */ + openFiles = new Map(); + /** @type {WorkflowElement} */ + activeElement = null; + + /** + * @param {import("../../app.js").ComfyApp} app + * @param {ComfyPopup} popup + */ + constructor(app, popup) { + this.app = app; + this.popup = popup; + this.actions = $el("div.comfyui-workflows-actions", [ + new ComfyButton({ + content: "Default", + icon: "file-code", + iconSize: 18, + classList: "comfyui-button primary", + tooltip: "Load default workflow", + action: () => { + popup.open = false; + app.loadGraphData(); + app.resetView(); + }, + }).element, + new ComfyButton({ + content: "Browse", + icon: "folder", + iconSize: 18, + tooltip: "Browse for an image or exported workflow", + action: () => { + popup.open = false; + app.ui.loadFile(); + }, + }).element, + new ComfyButton({ + content: "Blank", + icon: "plus-thick", + iconSize: 18, + tooltip: "Create a new blank workflow", + action: () => { + app.workflowManager.setWorkflow(null); + app.clean(); + app.graph.clear(); + app.workflowManager.activeWorkflow.track(); + popup.open = false; + }, + }).element, + ]); + + this.spinner = createSpinner(); + this.element.replaceChildren(this.actions, this.spinner); + + this.popup.addEventListener("open", () => this.load()); + this.popup.addEventListener("close", () => this.element.replaceChildren(this.actions, this.spinner)); + + this.app.workflowManager.addEventListener("favorite", (e) => { + const workflow = e["detail"]; + const button = this.treeFiles[workflow.path]?.primary; + if (!button) return; // Can happen when a workflow is renamed + button.icon = this.#getFavoriteIcon(workflow); + button.overIcon = this.#getFavoriteOverIcon(workflow); + this.updateFavorites(); + }); + + for (const e of ["save", "open", "close", "changeWorkflow"]) { + // TODO: dont be lazy and just update the specific element + app.workflowManager.addEventListener(e, () => this.updateOpen()); + } + this.app.workflowManager.addEventListener("rename", () => this.load()); + this.app.workflowManager.addEventListener("execute", (e) => this.#updateActive()); + } + + async load() { + await this.app.workflowManager.loadWorkflows(); + this.updateTree(); + this.updateFavorites(); + this.updateOpen(); + this.element.replaceChildren(this.actions, this.openElement, this.favoritesElement, this.treeElement); + } + + updateOpen() { + const current = this.openElement; + this.openFiles.clear(); + + this.openElement = $el("div.comfyui-workflows-open", [ + $el("h3", "Open"), + ...this.app.workflowManager.openWorkflows.map((w) => { + const wrapper = new WorkflowElement(this, w, { + primary: { element: $el("i.mdi.mdi-18px.mdi-progress-pencil") }, + buttons: [ + this.#getRenameButton(w), + new ComfyButton({ + icon: "close", + iconSize: 18, + classList: "comfyui-button comfyui-workflows-file-action", + tooltip: "Close workflow", + action: (e) => { + e.stopImmediatePropagation(); + this.app.workflowManager.closeWorkflow(w); + }, + }), + ], + }); + if (w.unsaved) { + wrapper.element.classList.add("unsaved"); + } + if(w === this.app.workflowManager.activeWorkflow) { + wrapper.element.classList.add("active"); + } + + this.openFiles.set(w, wrapper); + return wrapper.element; + }), + ]); + + this.#updateActive(); + current?.replaceWith(this.openElement); + } + + updateFavorites() { + const current = this.favoritesElement; + const favorites = [...this.app.workflowManager.workflows.filter((w) => w.isFavorite)]; + + this.favoritesElement = $el("div.comfyui-workflows-favorites", [ + $el("h3", "Favorites"), + ...favorites + .map((w) => { + return this.#getWorkflowElement(w).element; + }) + .filter(Boolean), + ]); + + current?.replaceWith(this.favoritesElement); + } + + filterTree() { + if (!this.filterText) { + this.treeRoot.classList.remove("filtered"); + // Unfilter whole tree + for (const item of Object.values(this.treeFiles)) { + item.element.parentElement.style.removeProperty("display"); + this.showTreeParents(item.element.parentElement); + } + return; + } + this.treeRoot.classList.add("filtered"); + const searchTerms = this.filterText.toLocaleLowerCase().split(" "); + for (const item of Object.values(this.treeFiles)) { + const parts = item.workflow.pathParts; + let termIndex = 0; + let valid = false; + for (const part of parts) { + let currentIndex = 0; + do { + currentIndex = part.indexOf(searchTerms[termIndex], currentIndex); + if (currentIndex > -1) currentIndex += searchTerms[termIndex].length; + } while (currentIndex !== -1 && ++termIndex < searchTerms.length); + + if (termIndex >= searchTerms.length) { + valid = true; + break; + } + } + if (valid) { + item.element.parentElement.style.removeProperty("display"); + this.showTreeParents(item.element.parentElement); + } else { + item.element.parentElement.style.display = "none"; + this.hideTreeParents(item.element.parentElement); + } + } + } + + hideTreeParents(element) { + // Hide all parents if no children are visible + if (element.parentElement?.classList.contains("comfyui-workflows-tree") === false) { + for (let i = 1; i < element.parentElement.children.length; i++) { + const c = element.parentElement.children[i]; + if (c.style.display !== "none") { + return; + } + } + element.parentElement.style.display = "none"; + this.hideTreeParents(element.parentElement); + } + } + + showTreeParents(element) { + if (element.parentElement?.classList.contains("comfyui-workflows-tree") === false) { + element.parentElement.style.removeProperty("display"); + this.showTreeParents(element.parentElement); + } + } + + updateTree() { + const current = this.treeElement; + const nodes = {}; + let typingTimeout; + + this.treeFiles = {}; + this.treeRoot = $el("ul.comfyui-workflows-tree"); + this.treeElement = $el("section", [ + $el("header", [ + $el("h3", "Browse"), + $el("div.comfy-ui-workflows-search", [ + $el("i.mdi.mdi-18px.mdi-magnify"), + $el("input", { + placeholder: "Search", + value: this.filterText ?? "", + oninput: (e) => { + this.filterText = e.target["value"]?.trim(); + clearTimeout(typingTimeout); + typingTimeout = setTimeout(() => this.filterTree(), 250); + }, + }), + ]), + ]), + this.treeRoot, + ]); + + for (const workflow of this.app.workflowManager.workflows) { + if (!workflow.pathParts) continue; + + let currentPath = ""; + let currentRoot = this.treeRoot; + + for (let i = 0; i < workflow.pathParts.length; i++) { + currentPath += (currentPath ? "\\" : "") + workflow.pathParts[i]; + const parentNode = nodes[currentPath] ?? this.#createNode(currentPath, workflow, i, currentRoot); + + nodes[currentPath] = parentNode; + currentRoot = parentNode; + } + } + + current?.replaceWith(this.treeElement); + this.filterTree(); + } + + #expandNode(el, workflow, thisPath, i) { + const expanded = !el.classList.toggle("closed"); + if (expanded) { + let c = ""; + for (let j = 0; j <= i; j++) { + c += (c ? "\\" : "") + workflow.pathParts[j]; + this.treeState[c] = true; + } + } else { + let c = thisPath; + for (let j = i + 1; j < workflow.pathParts.length; j++) { + c += (c ? "\\" : "") + workflow.pathParts[j]; + delete this.treeState[c]; + } + delete this.treeState[thisPath]; + } + } + + #updateActive() { + this.#removeActive(); + + const active = this.app.workflowManager.activePrompt; + if (!active?.workflow) return; + + const open = this.openFiles.get(active.workflow); + if (!open) return; + + this.activeElement = open; + + const total = Object.values(active.nodes); + const done = total.filter(Boolean); + const percent = done.length / total.length; + open.element.classList.add("running"); + open.element.style.setProperty("--progress", percent * 100 + "%"); + open.primary.element.classList.remove("mdi-progress-pencil"); + open.primary.element.classList.add("mdi-play"); + } + + #removeActive() { + if (!this.activeElement) return; + this.activeElement.element.classList.remove("running"); + this.activeElement.element.style.removeProperty("--progress"); + this.activeElement.primary.element.classList.add("mdi-progress-pencil"); + this.activeElement.primary.element.classList.remove("mdi-play"); + } + + /** @param {ComfyWorkflow} workflow */ + #getFavoriteIcon(workflow) { + return workflow.isFavorite ? "star" : "file-outline"; + } + + /** @param {ComfyWorkflow} workflow */ + #getFavoriteOverIcon(workflow) { + return workflow.isFavorite ? "star-off" : "star-outline"; + } + + /** @param {ComfyWorkflow} workflow */ + #getFavoriteTooltip(workflow) { + return workflow.isFavorite ? "Remove this workflow from your favorites" : "Add this workflow to your favorites"; + } + + /** @param {ComfyWorkflow} workflow */ + #getFavoriteButton(workflow, primary) { + return new ComfyButton({ + icon: this.#getFavoriteIcon(workflow), + overIcon: this.#getFavoriteOverIcon(workflow), + iconSize: 18, + classList: "comfyui-button comfyui-workflows-file-action-favorite" + (primary ? " comfyui-workflows-file-action-primary" : ""), + tooltip: this.#getFavoriteTooltip(workflow), + action: (e) => { + e.stopImmediatePropagation(); + workflow.favorite(!workflow.isFavorite); + }, + }); + } + + /** @param {ComfyWorkflow} workflow */ + #getDeleteButton(workflow) { + const deleteButton = new ComfyButton({ + icon: "delete", + tooltip: "Delete this workflow", + classList: "comfyui-button comfyui-workflows-file-action", + iconSize: 18, + action: async (e, btn) => { + e.stopImmediatePropagation(); + + if (btn.icon === "delete-empty") { + btn.enabled = false; + await workflow.delete(); + await this.load(); + } else { + btn.icon = "delete-empty"; + btn.element.style.background = "red"; + } + }, + }); + deleteButton.element.addEventListener("mouseleave", () => { + deleteButton.icon = "delete"; + deleteButton.element.style.removeProperty("background"); + }); + return deleteButton; + } + + /** @param {ComfyWorkflow} workflow */ + #getInsertButton(workflow) { + return new ComfyButton({ + icon: "file-move-outline", + iconSize: 18, + tooltip: "Insert this workflow into the current workflow", + classList: "comfyui-button comfyui-workflows-file-action", + action: (e) => { + if (!this.app.shiftDown) { + this.popup.open = false; + } + e.stopImmediatePropagation(); + if (!this.app.shiftDown) { + this.popup.open = false; + } + workflow.insert(); + }, + }); + } + + /** @param {ComfyWorkflow} workflow */ + #getRenameButton(workflow) { + return new ComfyButton({ + icon: "pencil", + tooltip: workflow.path ? "Rename this workflow" : "This workflow can't be renamed as it hasn't been saved.", + classList: "comfyui-button comfyui-workflows-file-action", + iconSize: 18, + enabled: !!workflow.path, + action: async (e) => { + e.stopImmediatePropagation(); + const newName = prompt("Enter new name", workflow.path); + if (newName) { + await workflow.rename(newName); + } + }, + }); + } + + /** @param {ComfyWorkflow} workflow */ + #getWorkflowElement(workflow) { + return new WorkflowElement(this, workflow, { + primary: this.#getFavoriteButton(workflow, true), + buttons: [this.#getInsertButton(workflow), this.#getRenameButton(workflow), this.#getDeleteButton(workflow)], + }); + } + + /** @param {ComfyWorkflow} workflow */ + #createLeafNode(workflow) { + const fileNode = this.#getWorkflowElement(workflow); + this.treeFiles[workflow.path] = fileNode; + return fileNode; + } + + #createNode(currentPath, workflow, i, currentRoot) { + const part = workflow.pathParts[i]; + + const parentNode = $el("ul" + (this.treeState[currentPath] ? "" : ".closed"), { + $: (el) => { + el.onclick = (e) => { + this.#expandNode(el, workflow, currentPath, i); + e.stopImmediatePropagation(); + }; + }, + }); + currentRoot.append(parentNode); + + // Create a node for the current part and an inner UL for its children if it isnt a leaf node + const leaf = i === workflow.pathParts.length - 1; + let nodeElement; + if (leaf) { + nodeElement = this.#createLeafNode(workflow).element; + } else { + nodeElement = $el("li", [$el("i.mdi.mdi-18px.mdi-folder"), $el("span", part)]); + } + parentNode.append(nodeElement); + return parentNode; + } +} + +class WorkflowElement { + /** + * @param { ComfyWorkflowsContent } parent + * @param { ComfyWorkflow } workflow + */ + constructor(parent, workflow, { tagName = "li", primary, buttons }) { + this.parent = parent; + this.workflow = workflow; + this.primary = primary; + this.buttons = buttons; + + this.element = $el( + tagName + ".comfyui-workflows-tree-file", + { + onclick: () => { + workflow.load(); + this.parent.popup.open = false; + }, + title: this.workflow.path, + }, + [this.primary?.element, $el("span", workflow.name), ...buttons.map((b) => b.element)] + ); + } +} + +class WidgetSelectionDialog extends ComfyAsyncDialog { + #options; + + /** + * @param {Array<{widget: {name: string}, node: {pos: [number, number], title: string, id: string, type: string}}>} options + */ + constructor(options) { + super(); + this.#options = options; + } + + show(app) { + this.element.classList.add("comfy-widget-selection-dialog"); + return super.show( + $el("div", [ + $el("h2", "Select image target"), + $el( + "p", + "This workflow has multiple image loader nodes, you can rename a node to include 'input' in the title for it to be automatically selected, or select one below." + ), + $el( + "section", + this.#options.map((opt) => { + return $el("div.comfy-widget-selection-item", [ + $el("span", { dataset: { id: opt.node.id } }, `${opt.node.title ?? opt.node.type} ${opt.widget.name}`), + $el( + "button.comfyui-button", + { + onclick: () => { + app.canvas.ds.offset[0] = -opt.node.pos[0] + 50; + app.canvas.ds.offset[1] = -opt.node.pos[1] + 50; + app.canvas.selectNode(opt.node); + app.graph.setDirtyCanvas(true, true); + }, + }, + "Show" + ), + $el( + "button.comfyui-button.primary", + { + onclick: () => { + this.close(opt); + }, + }, + "Select" + ), + ]); + }) + ), + ]) + ); + } +} \ No newline at end of file diff --git a/web/scripts/ui/settings.js b/web/scripts/ui/settings.js index 9e9d13af0..819e4e7d6 100644 --- a/web/scripts/ui/settings.js +++ b/web/scripts/ui/settings.js @@ -47,6 +47,17 @@ export class ComfySettingsDialog extends ComfyDialog { return Object.values(this.settingsLookup); } + #dispatchChange(id, value, oldValue) { + this.dispatchEvent( + new CustomEvent(id + ".change", { + detail: { + value, + oldValue + }, + }) + ); + } + async load() { if (this.app.storageLocation === "browser") { this.settingsValues = localStorage; @@ -56,7 +67,9 @@ export class ComfySettingsDialog extends ComfyDialog { // Trigger onChange for any settings added before load for (const id in this.settingsLookup) { - this.settingsLookup[id].onChange?.(this.settingsValues[this.getId(id)]); + const value = this.settingsValues[this.getId(id)]; + this.settingsLookup[id].onChange?.(value); + this.#dispatchChange(id, value); } } @@ -90,6 +103,7 @@ export class ComfySettingsDialog extends ComfyDialog { if (id in this.settingsLookup) { this.settingsLookup[id].onChange?.(value, oldValue); } + this.#dispatchChange(id, value, oldValue); await api.storeSetting(id, value); } @@ -136,6 +150,8 @@ export class ComfySettingsDialog extends ComfyDialog { onChange, name, render: () => { + if (type === "hidden") return; + const setter = (v) => { if (onChange) { onChange(v, value); @@ -310,7 +326,7 @@ export class ComfySettingsDialog extends ComfyDialog { }, [$el("th"), $el("th", { style: { width: "33%" } })] ), - ...this.settings.sort((a, b) => a.name.localeCompare(b.name)).map((s) => s.render()) + ...this.settings.sort((a, b) => a.name.localeCompare(b.name)).map((s) => s.render()).filter(Boolean) ); this.element.showModal(); } diff --git a/web/scripts/ui/utils.js b/web/scripts/ui/utils.js new file mode 100644 index 000000000..e37d8b41e --- /dev/null +++ b/web/scripts/ui/utils.js @@ -0,0 +1,56 @@ +/** + * @typedef { string | string[] | Record } ClassList + */ + +/** + * @param { HTMLElement } element + * @param { ClassList } classList + * @param { string[] } requiredClasses + */ +export function applyClasses(element, classList, ...requiredClasses) { + classList ??= ""; + + let str; + if (typeof classList === "string") { + str = classList; + } else if (classList instanceof Array) { + str = classList.join(" "); + } else { + str = Object.entries(classList).reduce((p, c) => { + if (c[1]) { + p += (p.length ? " " : "") + c[0]; + } + return p; + }, ""); + } + element.className = str; + if (requiredClasses) { + element.classList.add(...requiredClasses); + } +} + +/** + * @param { HTMLElement } element + * @param { { onHide?: (el: HTMLElement) => void, onShow?: (el: HTMLElement, value) => void } } [param1] + * @returns + */ +export function toggleElement(element, { onHide, onShow } = {}) { + let placeholder; + let hidden; + return (value) => { + if (value) { + if (hidden) { + hidden = false; + placeholder.replaceWith(element); + } + onShow?.(element, value); + } else { + if (!placeholder) { + placeholder = document.createComment(""); + } + hidden = true; + element.replaceWith(placeholder); + onHide?.(element); + } + }; +} diff --git a/web/scripts/utils.js b/web/scripts/utils.js index 01b988462..cda7600f6 100644 --- a/web/scripts/utils.js +++ b/web/scripts/utils.js @@ -1,4 +1,5 @@ import { $el } from "./ui.js"; +import { api } from "./api.js"; // Simple date formatter const parts = { @@ -25,6 +26,19 @@ function formatDate(text, date) { }); } + +export function clone(obj) { + try { + if (typeof structuredClone !== "undefined") { + return structuredClone(obj); + } + } catch (error) { + // structuredClone is stricter than using JSON.parse/stringify so fallback to that + } + + return JSON.parse(JSON.stringify(obj)); +} + export function applyTextReplacements(app, value) { return value.replace(/%([^%]+)%/g, function (match, text) { const split = text.split("."); @@ -86,3 +100,57 @@ export async function addStylesheet(urlOrFile, relativeTo) { }); }); } + +/** + * @param { string } filename + * @param { Blob } blob + */ +export function downloadBlob(filename, blob) { + const url = URL.createObjectURL(blob); + const a = $el("a", { + href: url, + download: filename, + style: { display: "none" }, + parent: document.body, + }); + a.click(); + setTimeout(function () { + a.remove(); + window.URL.revokeObjectURL(url); + }, 0); +} + +/** + * @template T + * @param {string} name + * @param {T} [defaultValue] + * @param {(currentValue: any, previousValue: any)=>void} [onChanged] + * @returns {T} + */ +export function prop(target, name, defaultValue, onChanged) { + let currentValue; + Object.defineProperty(target, name, { + get() { + return currentValue; + }, + set(newValue) { + const prevValue = currentValue; + currentValue = newValue; + onChanged?.(currentValue, prevValue, target, name); + }, + }); + return defaultValue; +} + +export function getStorageValue(id) { + const clientId = api.clientId ?? api.initialClientId; + return (clientId && sessionStorage.getItem(`${id}:${clientId}`)) ?? localStorage.getItem(id); +} + +export function setStorageValue(id, value) { + const clientId = api.clientId ?? api.initialClientId; + if (clientId) { + sessionStorage.setItem(`${id}:${clientId}`, value); + } + localStorage.setItem(id, value); +} \ No newline at end of file diff --git a/web/scripts/workflows.js b/web/scripts/workflows.js new file mode 100644 index 000000000..16bbc9976 --- /dev/null +++ b/web/scripts/workflows.js @@ -0,0 +1,450 @@ +// @ts-check + +import { api } from "./api.js"; +import { ChangeTracker } from "./changeTracker.js"; +import { ComfyAsyncDialog } from "./ui/components/asyncDialog.js"; +import { getStorageValue, setStorageValue } from "./utils.js"; + +function appendJsonExt(path) { + if (!path.toLowerCase().endsWith(".json")) { + path += ".json"; + } + return path; +} + +export function trimJsonExt(path) { + return path?.replace(/\.json$/, ""); +} + +export class ComfyWorkflowManager extends EventTarget { + /** @type {string | null} */ + #activePromptId = null; + #unsavedCount = 0; + #activeWorkflow; + + /** @type {Record} */ + workflowLookup = {}; + /** @type {Array} */ + workflows = []; + /** @type {Array} */ + openWorkflows = []; + /** @type {Record}>} */ + queuedPrompts = {}; + + get activeWorkflow() { + return this.#activeWorkflow ?? this.openWorkflows[0]; + } + + get activePromptId() { + return this.#activePromptId; + } + + get activePrompt() { + return this.queuedPrompts[this.#activePromptId]; + } + + /** + * @param {import("./app.js").ComfyApp} app + */ + constructor(app) { + super(); + this.app = app; + ChangeTracker.init(app); + + this.#bindExecutionEvents(); + } + + #bindExecutionEvents() { + // TODO: on reload, set active prompt based on the latest ws message + + const emit = () => this.dispatchEvent(new CustomEvent("execute", { detail: this.activePrompt })); + let executing = null; + api.addEventListener("execution_start", (e) => { + this.#activePromptId = e.detail.prompt_id; + + // This event can fire before the event is stored, so put a placeholder + this.queuedPrompts[this.#activePromptId] ??= { nodes: {} }; + emit(); + }); + api.addEventListener("execution_cached", (e) => { + if (!this.activePrompt) return; + for (const n of e.detail.nodes) { + this.activePrompt.nodes[n] = true; + } + emit(); + }); + api.addEventListener("executed", (e) => { + if (!this.activePrompt) return; + this.activePrompt.nodes[e.detail.node] = true; + emit(); + }); + api.addEventListener("executing", (e) => { + if (!this.activePrompt) return; + + if (executing) { + // Seems sometimes nodes that are cached fire executing but not executed + this.activePrompt.nodes[executing] = true; + } + executing = e.detail; + if (!executing) { + delete this.queuedPrompts[this.#activePromptId]; + this.#activePromptId = null; + } + emit(); + }); + } + + async loadWorkflows() { + try { + let favorites; + const resp = await api.getUserData("workflows/.index.json"); + let info; + if (resp.status === 200) { + info = await resp.json(); + favorites = new Set(info?.favorites ?? []); + } else { + favorites = new Set(); + } + + const workflows = (await api.listUserData("workflows", true, true)).map((w) => { + let workflow = this.workflowLookup[w[0]]; + if (!workflow) { + workflow = new ComfyWorkflow(this, w[0], w.slice(1), favorites.has(w[0])); + this.workflowLookup[workflow.path] = workflow; + } + return workflow; + }); + + this.workflows = workflows; + } catch (error) { + alert("Error loading workflows: " + (error.message ?? error)); + this.workflows = []; + } + } + + async saveWorkflowMetadata() { + await api.storeUserData("workflows/.index.json", { + favorites: [...this.workflows.filter((w) => w.isFavorite).map((w) => w.path)], + }); + } + + /** + * @param {string | ComfyWorkflow | null} workflow + */ + setWorkflow(workflow) { + if (workflow && typeof workflow === "string") { + // Selected by path, i.e. on reload of last workflow + const found = this.workflows.find((w) => w.path === workflow); + if (found) { + workflow = found; + workflow.unsaved = !workflow || getStorageValue("Comfy.PreviousWorkflowUnsaved") === "true"; + } + } + + if (!(workflow instanceof ComfyWorkflow)) { + // Still not found, either reloading a deleted workflow or blank + workflow = new ComfyWorkflow(this, workflow || "Unsaved Workflow" + (this.#unsavedCount++ ? ` (${this.#unsavedCount})` : "")); + } + + const index = this.openWorkflows.indexOf(workflow); + if (index === -1) { + // Opening a new workflow + this.openWorkflows.push(workflow); + } + + this.#activeWorkflow = workflow; + + setStorageValue("Comfy.PreviousWorkflow", this.activeWorkflow.path ?? ""); + this.dispatchEvent(new CustomEvent("changeWorkflow")); + } + + storePrompt({ nodes, id }) { + this.queuedPrompts[id] ??= {}; + this.queuedPrompts[id].nodes = { + ...nodes.reduce((p, n) => { + p[n] = false; + return p; + }, {}), + ...this.queuedPrompts[id].nodes, + }; + this.queuedPrompts[id].workflow = this.activeWorkflow; + } + + /** + * @param {ComfyWorkflow} workflow + */ + async closeWorkflow(workflow, warnIfUnsaved = true) { + if (!workflow.isOpen) { + return true; + } + if (workflow.unsaved && warnIfUnsaved) { + const res = await ComfyAsyncDialog.prompt({ + title: "Save Changes?", + message: `Do you want to save changes to "${workflow.path ?? workflow.name}" before closing?`, + actions: ["Yes", "No", "Cancel"], + }); + if (res === "Yes") { + const active = this.activeWorkflow; + if (active !== workflow) { + // We need to switch to the workflow to save it + await workflow.load(); + } + + if (!(await workflow.save())) { + // Save was canceled, restore the previous workflow + if (active !== workflow) { + await active.load(); + } + return; + } + } else if (res === "Cancel") { + return; + } + } + workflow.changeTracker = null; + this.openWorkflows.splice(this.openWorkflows.indexOf(workflow), 1); + if (this.openWorkflows.length) { + this.#activeWorkflow = this.openWorkflows[0]; + await this.#activeWorkflow.load(); + } else { + // Load default + await this.app.loadGraphData(); + } + } +} + +export class ComfyWorkflow { + #name; + #path; + #pathParts; + #isFavorite = false; + /** @type {ChangeTracker | null} */ + changeTracker = null; + unsaved = false; + + get name() { + return this.#name; + } + + get path() { + return this.#path; + } + + get pathParts() { + return this.#pathParts; + } + + get isFavorite() { + return this.#isFavorite; + } + + get isOpen() { + return !!this.changeTracker; + } + + /** + * @overload + * @param {ComfyWorkflowManager} manager + * @param {string} path + */ + /** + * @overload + * @param {ComfyWorkflowManager} manager + * @param {string} path + * @param {string[]} pathParts + * @param {boolean} isFavorite + */ + /** + * @param {ComfyWorkflowManager} manager + * @param {string} path + * @param {string[]} [pathParts] + * @param {boolean} [isFavorite] + */ + constructor(manager, path, pathParts, isFavorite) { + this.manager = manager; + if (pathParts) { + this.#updatePath(path, pathParts); + this.#isFavorite = isFavorite; + } else { + this.#name = path; + this.unsaved = true; + } + } + + /** + * @param {string} path + * @param {string[]} [pathParts] + */ + #updatePath(path, pathParts) { + this.#path = path; + + if (!pathParts) { + if (!path.includes("\\")) { + pathParts = path.split("/"); + } else { + pathParts = path.split("\\"); + } + } + + this.#pathParts = pathParts; + this.#name = trimJsonExt(pathParts[pathParts.length - 1]); + } + + async getWorkflowData() { + const resp = await api.getUserData("workflows/" + this.path); + if (resp.status !== 200) { + alert(`Error loading workflow file '${this.path}': ${resp.status} ${resp.statusText}`); + return; + } + return await resp.json(); + } + + load = async () => { + if (this.isOpen) { + await this.manager.app.loadGraphData(this.changeTracker.activeState, true, this); + } else { + const data = await this.getWorkflowData(); + if (!data) return; + await this.manager.app.loadGraphData(data, true, this); + } + }; + + async save(saveAs = false) { + if (!this.path || saveAs) { + return !!(await this.#save(null, false)); + } else { + return !!(await this.#save(this.path, true)); + } + } + + /** + * @param {boolean} value + */ + async favorite(value) { + try { + if (this.#isFavorite === value) return; + this.#isFavorite = value; + await this.manager.saveWorkflowMetadata(); + this.manager.dispatchEvent(new CustomEvent("favorite", { detail: this })); + } catch (error) { + alert("Error favoriting workflow " + this.path + "\n" + (error.message ?? error)); + } + } + + /** + * @param {string} path + */ + async rename(path) { + path = appendJsonExt(path); + let resp = await api.moveUserData("workflows/" + this.path, "workflows/" + path); + + if (resp.status === 409) { + if (!confirm(`Workflow '${path}' already exists, do you want to overwrite it?`)) return resp; + resp = await api.moveUserData("workflows/" + this.path, "workflows/" + path, { overwrite: true }); + } + + if (resp.status !== 200) { + alert(`Error renaming workflow file '${this.path}': ${resp.status} ${resp.statusText}`); + return; + } + + const isFav = this.isFavorite; + if (isFav) { + await this.favorite(false); + } + path = (await resp.json()).substring("workflows/".length); + this.#updatePath(path, null); + if (isFav) { + await this.favorite(true); + } + this.manager.dispatchEvent(new CustomEvent("rename", { detail: this })); + setStorageValue("Comfy.PreviousWorkflow", this.path ?? ""); + } + + async insert() { + const data = await this.getWorkflowData(); + if (!data) return; + + const old = localStorage.getItem("litegrapheditor_clipboard"); + const graph = new LGraph(data); + const canvas = new LGraphCanvas(null, graph, { skip_events: true, skip_render: true }); + canvas.selectNodes(); + canvas.copyToClipboard(); + this.manager.app.canvas.pasteFromClipboard(); + localStorage.setItem("litegrapheditor_clipboard", old); + } + + async delete() { + // TODO: fix delete of current workflow - should mark workflow as unsaved and when saving use old name by default + + try { + if (this.isFavorite) { + await this.favorite(false); + } + await api.deleteUserData("workflows/" + this.path); + this.unsaved = true; + this.#path = null; + this.#pathParts = null; + this.manager.workflows.splice(this.manager.workflows.indexOf(this), 1); + this.manager.dispatchEvent(new CustomEvent("delete", { detail: this })); + } catch (error) { + alert(`Error deleting workflow: ${error.message || error}`); + } + } + + track() { + if (this.changeTracker) { + this.changeTracker.restore(); + } else { + this.changeTracker = new ChangeTracker(this); + } + } + + /** + * @param {string|null} path + * @param {boolean} overwrite + */ + async #save(path, overwrite) { + if (!path) { + path = prompt("Save workflow as:", trimJsonExt(this.path) ?? this.name ?? "workflow"); + if (!path) return; + } + + path = appendJsonExt(path); + + const p = await this.manager.app.graphToPrompt(); + const json = JSON.stringify(p.workflow, null, 2); + let resp = await api.storeUserData("workflows/" + path, json, { stringify: false, throwOnError: false, overwrite }); + if (resp.status === 409) { + if (!confirm(`Workflow '${path}' already exists, do you want to overwrite it?`)) return; + resp = await api.storeUserData("workflows/" + path, json, { stringify: false }); + } + + if (resp.status !== 200) { + alert(`Error saving workflow '${this.path}': ${resp.status} ${resp.statusText}`); + return; + } + + path = (await resp.json()).substring("workflows/".length); + + if (!this.path) { + // Saved new workflow, patch this instance + this.#updatePath(path, null); + await this.manager.loadWorkflows(); + this.unsaved = false; + this.manager.dispatchEvent(new CustomEvent("rename", { detail: this })); + setStorageValue("Comfy.PreviousWorkflow", this.path ?? ""); + } else if (path !== this.path) { + // Saved as, open the new copy + await this.manager.loadWorkflows(); + const workflow = this.manager.workflowLookup[path]; + await workflow.load(); + } else { + // Normal save + this.unsaved = false; + this.manager.dispatchEvent(new CustomEvent("save", { detail: this })); + } + + return true; + } +} diff --git a/web/style.css b/web/style.css index cf7a8b9ea..8091a489f 100644 --- a/web/style.css +++ b/web/style.css @@ -1,3 +1,5 @@ +@import url("scripts/ui/menu/menu.css"); + :root { --fg-color: #000; --bg-color: #fff; @@ -10,12 +12,24 @@ --border-color: #4e4e4e; --tr-even-bg-color: #222; --tr-odd-bg-color: #353535; + --primary-bg: #236692; + --primary-fg: #ffffff; + --primary-hover-bg: #3485bb; + --primary-hover-fg: #ffffff; + --content-bg: #e0e0e0; + --content-fg: #000; + --content-hover-bg: #adadad; + --content-hover-fg: #000; } @media (prefers-color-scheme: dark) { :root { --fg-color: #fff; --bg-color: #202020; + --content-bg: #4e4e4e; + --content-fg: #fff; + --content-hover-bg: #222; + --content-hover-fg: #fff; } } @@ -26,11 +40,41 @@ body { overflow: hidden; background-color: var(--bg-color); color: var(--fg-color); + grid-template-columns: auto 1fr auto; + grid-template-rows: auto auto 1fr auto; + min-height: -webkit-fill-available; + max-height: -webkit-fill-available; + min-width: -webkit-fill-available; + max-width: -webkit-fill-available; +} + +.comfyui-body-top { + order: 0; + grid-column: 1/-1; + z-index: 10; +} + +.comfyui-body-left { + order: 1; + z-index: 10; } #graph-canvas { width: 100%; height: 100%; + order: 2; + grid-column: 1/-1; +} + +.comfyui-body-right { + order: 3; + z-index: 10; +} + +.comfyui-body-bottom { + order: 4; + grid-column: 1/-1; + z-index: 10; } .comfy-multiline-input { @@ -364,6 +408,37 @@ dialog::backdrop { background: rgba(0, 0, 0, 0.5); } +.comfy-dialog.comfyui-dialog { + top: 0; +} + +.comfy-dialog.comfy-modal { + font-family: Arial, sans-serif; + border-color: var(--bg-color); + box-shadow: none; + border: 2px solid var(--border-color); +} + +.comfy-dialog .comfy-modal-content { + flex-direction: row; + flex-wrap: wrap; + gap: 10px; + color: var(--fg-color); +} + +.comfy-dialog .comfy-modal-content h3 { + margin-top: 0; +} + +.comfy-dialog .comfy-modal-content > p { + width: 100%; +} + +.comfy-dialog .comfy-modal-content > .comfyui-button { + flex: 1; + justify-content: center; +} + #comfy-settings-dialog { padding: 0; width: 41rem; diff --git a/web/types/comfy.d.ts b/web/types/comfy.d.ts index f7129b555..9a338b349 100644 --- a/web/types/comfy.d.ts +++ b/web/types/comfy.d.ts @@ -10,24 +10,24 @@ export interface ComfyExtension { * Allows any initialisation, e.g. loading resources. Called after the canvas is created but before nodes are added * @param app The ComfyUI app instance */ - init(app: ComfyApp): Promise; + init?(app: ComfyApp): Promise; /** * Allows any additonal setup, called after the application is fully set up and running * @param app The ComfyUI app instance */ - setup(app: ComfyApp): Promise; + setup?(app: ComfyApp): Promise; /** * Called before nodes are registered with the graph * @param defs The collection of node definitions, add custom ones or edit existing ones * @param app The ComfyUI app instance */ - addCustomNodeDefs(defs: Record, app: ComfyApp): Promise; + addCustomNodeDefs?(defs: Record, app: ComfyApp): Promise; /** * Allows the extension to add custom widgets * @param app The ComfyUI app instance * @returns An array of {[widget name]: widget data} */ - getCustomWidgets( + getCustomWidgets?( app: ComfyApp ): Promise< Record { widget?: IWidget; minWidth?: number; minHeight?: number }> @@ -38,12 +38,12 @@ export interface ComfyExtension { * @param nodeData The original node object info config object * @param app The ComfyUI app instance */ - beforeRegisterNodeDef(nodeType: typeof LGraphNode, nodeData: ComfyObjectInfo, app: ComfyApp): Promise; + beforeRegisterNodeDef?(nodeType: typeof LGraphNode, nodeData: ComfyObjectInfo, app: ComfyApp): Promise; /** * Allows the extension to register additional nodes with LGraph after standard nodes are added * @param app The ComfyUI app instance */ - registerCustomNodes(app: ComfyApp): Promise; + registerCustomNodes?(app: ComfyApp): Promise; /** * Allows the extension to modify a node that has been reloaded onto the graph. * If you break something in the backend and want to patch workflows in the frontend @@ -51,13 +51,13 @@ export interface ComfyExtension { * @param node The node that has been loaded * @param app The ComfyUI app instance */ - loadedGraphNode(node: LGraphNode, app: ComfyApp); + loadedGraphNode?(node: LGraphNode, app: ComfyApp); /** * Allows the extension to run code after the constructor of the node * @param node The node that has been created * @param app The ComfyUI app instance */ - nodeCreated(node: LGraphNode, app: ComfyApp); + nodeCreated?(node: LGraphNode, app: ComfyApp); } export type ComfyObjectInfo = { From 69d710e40f43b87dd7124b9ee1e8982f987827e9 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 25 Jun 2024 07:41:52 -0400 Subject: [PATCH 023/123] Implement my alternative take on CFG++ as the euler_pp sampler. Add euler_ancestral_pp which is the ancestral version of euler with the same modification. --- comfy/k_diffusion/sampling.py | 55 ++++++++++++++++++++++++- comfy/samplers.py | 2 +- comfy_extras/nodes_advanced_samplers.py | 25 +---------- 3 files changed, 56 insertions(+), 26 deletions(-) diff --git a/comfy/k_diffusion/sampling.py b/comfy/k_diffusion/sampling.py index 78896b8b5..9b58cb1dc 100644 --- a/comfy/k_diffusion/sampling.py +++ b/comfy/k_diffusion/sampling.py @@ -7,7 +7,7 @@ import torchsde from tqdm.auto import trange, tqdm from . import utils - +import comfy.model_patcher def append_zero(x): return torch.cat([x, x.new_zeros([1])]) @@ -945,3 +945,56 @@ def sample_ipndm_v(model, x, sigmas, extra_args=None, callback=None, disable=Non buffer_model.append(d_cur.detach()) return x_next + + +@torch.no_grad() +def sample_euler_pp(model, x, sigmas, extra_args=None, callback=None, disable=None): + extra_args = {} if extra_args is None else extra_args + + temp = [0] + def post_cfg_function(args): + temp[0] = args["uncond_denoised"] + return args["denoised"] + + model_options = extra_args.get("model_options", {}).copy() + extra_args["model_options"] = comfy.model_patcher.set_model_options_post_cfg_function(model_options, post_cfg_function, disable_cfg1_optimization=True) + + s_in = x.new_ones([x.shape[0]]) + for i in trange(len(sigmas) - 1, disable=disable): + sigma_hat = sigmas[i] + denoised = model(x, sigma_hat * s_in, **extra_args) + d = to_d(x - denoised + temp[0], sigma_hat, denoised) + if callback is not None: + callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigma_hat, 'denoised': denoised}) + dt = sigmas[i + 1] - sigma_hat + # Euler method + x = x + d * dt + return x + +@torch.no_grad() +def sample_euler_ancestral_pp(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None): + """Ancestral sampling with Euler method steps.""" + extra_args = {} if extra_args is None else extra_args + noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler + + temp = [0] + def post_cfg_function(args): + temp[0] = args["uncond_denoised"] + return args["denoised"] + + model_options = extra_args.get("model_options", {}).copy() + extra_args["model_options"] = comfy.model_patcher.set_model_options_post_cfg_function(model_options, post_cfg_function, disable_cfg1_optimization=True) + + s_in = x.new_ones([x.shape[0]]) + for i in trange(len(sigmas) - 1, disable=disable): + denoised = model(x, sigmas[i] * s_in, **extra_args) + sigma_down, sigma_up = get_ancestral_step(sigmas[i], sigmas[i + 1], eta=eta) + if callback is not None: + callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigmas[i], 'denoised': denoised}) + d = to_d(x - denoised + temp[0], sigmas[i], denoised) + # Euler method + dt = sigma_down - sigmas[i] + x = x + d * dt + if sigmas[i + 1] > 0: + x = x + noise_sampler(sigmas[i], sigmas[i + 1]) * s_noise * sigma_up + return x diff --git a/comfy/samplers.py b/comfy/samplers.py index 55b1486b4..c3a80dde0 100644 --- a/comfy/samplers.py +++ b/comfy/samplers.py @@ -537,7 +537,7 @@ class Sampler: sigma = float(sigmas[0]) return math.isclose(max_sigma, sigma, rel_tol=1e-05) or sigma > max_sigma -KSAMPLER_NAMES = ["euler", "euler_ancestral", "heun", "heunpp2","dpm_2", "dpm_2_ancestral", +KSAMPLER_NAMES = ["euler", "euler_pp", "euler_ancestral", "euler_ancestral_pp", "heun", "heunpp2","dpm_2", "dpm_2_ancestral", "lms", "dpm_fast", "dpm_adaptive", "dpmpp_2s_ancestral", "dpmpp_sde", "dpmpp_sde_gpu", "dpmpp_2m", "dpmpp_2m_sde", "dpmpp_2m_sde_gpu", "dpmpp_3m_sde", "dpmpp_3m_sde_gpu", "ddpm", "lcm", "ipndm", "ipndm_v"] diff --git a/comfy_extras/nodes_advanced_samplers.py b/comfy_extras/nodes_advanced_samplers.py index 7aa89c644..cee3a10c4 100644 --- a/comfy_extras/nodes_advanced_samplers.py +++ b/comfy_extras/nodes_advanced_samplers.py @@ -82,29 +82,6 @@ def sample_euler_cfgpp(model, x, sigmas, extra_args=None, callback=None, disable x = denoised + sigmas[i + 1] * d return x -@torch.no_grad() -def sample_euler_cfgpp_alt(model, x, sigmas, extra_args=None, callback=None, disable=None): - extra_args = {} if extra_args is None else extra_args - - temp = [0] - def post_cfg_function(args): - temp[0] = args["uncond_denoised"] - return args["denoised"] - - model_options = extra_args.get("model_options", {}).copy() - extra_args["model_options"] = comfy.model_patcher.set_model_options_post_cfg_function(model_options, post_cfg_function, disable_cfg1_optimization=True) - - s_in = x.new_ones([x.shape[0]]) - for i in trange(len(sigmas) - 1, disable=disable): - sigma_hat = sigmas[i] - denoised = model(x, sigma_hat * s_in, **extra_args) - d = to_d(x - denoised + temp[0], sigma_hat, denoised) - if callback is not None: - callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigma_hat, 'denoised': denoised}) - dt = sigmas[i + 1] - sigma_hat - # Euler method - x = x + d * dt - return x class SamplerEulerCFGpp: @classmethod @@ -122,7 +99,7 @@ class SamplerEulerCFGpp: if version == "regular": sampler = comfy.samplers.KSAMPLER(sample_euler_cfgpp) else: - sampler = comfy.samplers.KSAMPLER(sample_euler_cfgpp_alt) + sampler = comfy.samplers.ksampler("euler_pp") return (sampler, ) NODE_CLASS_MAPPINGS = { From e99d97a9d943c3601ccdf411608bffb771db5bf1 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Wed, 26 Jun 2024 01:23:55 -0400 Subject: [PATCH 024/123] Remove duplicated Reset View button (#3865) * Remove duplicated Reset View button * Disable flaky test --- .github/workflows/test-browser.yml | 2 +- web/scripts/ui.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test-browser.yml b/.github/workflows/test-browser.yml index 049b1cde2..323c96cf3 100644 --- a/.github/workflows/test-browser.yml +++ b/.github/workflows/test-browser.yml @@ -24,7 +24,7 @@ jobs: with: repository: "huchenlei/ComfyUI_frontend" path: "ComfyUI_frontend" - ref: "23a4ee83144d9bf22e7218b9c78c71f8544c8b27" + ref: "577aea9dfb680a14b3ae4fa626a85098c3207030" - uses: actions/setup-node@v3 with: node-version: lts/* diff --git a/web/scripts/ui.js b/web/scripts/ui.js index 87b4887eb..bb094d8b4 100644 --- a/web/scripts/ui.js +++ b/web/scripts/ui.js @@ -603,7 +603,6 @@ export class ComfyUI { onclick: () => app.refreshComboInNodes() }), $el("button", {id: "comfy-clipspace-button", textContent: "Clipspace", onclick: () => app.openClipspace()}), - $el("button", {id: "comfy-reset-view-button", textContent: "Reset View", onclick: () => app.resetView()}), $el("button", { id: "comfy-clear-button", textContent: "Clear", onclick: () => { if (!confirmClear.value || confirm("Clear workflow?")) { From edfce78c86c7615039dd8d74e89957a0eebbdc03 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" <4000772+mcmonkey4eva@users.noreply.github.com> Date: Tue, 25 Jun 2024 22:37:27 -0700 Subject: [PATCH 025/123] add issue templates for ComfyUI Issues Page (#3868) --- .github/ISSUE_TEMPLATE/bug-report.yml | 45 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 8 ++++ .github/ISSUE_TEMPLATE/feature-request.yml | 32 +++++++++++++++ .github/ISSUE_TEMPLATE/user-support.yml | 32 +++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug-report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature-request.yml create mode 100644 .github/ISSUE_TEMPLATE/user-support.yml diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 000000000..87bef3681 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,45 @@ +name: Bug Report +description: "Something is broken inside of ComfyUI. (Do not use this if you're just having issues and need help, or if the issue relates to a custom node)" +labels: [ "Potential Bug" ] +body: + - type: markdown + attributes: + value: | + Before submitting a **Bug Report**, please ensure the following: + + **1:** You are running the latest version of ComfyUI. + **2:** You have looked at the existing bug reports and made sure this isn't already reported. + **3:** This is an actual bug in ComfyUI, not just a support question and not caused by an custom node. A bug is when you can specify exact steps to replicate what went wrong and others will be able to repeat your steps and see the same issue happen. + + If unsure, ask on the [ComfyUI Matrix Space](https://app.element.io/#/room/%23comfyui_space%3Amatrix.org) or the [Comfy Org Discord](https://discord.gg/comfyorg) first. + - type: textarea + attributes: + label: Expected Behavior + description: "What you expected to happen." + validations: + required: true + - type: textarea + attributes: + label: Actual Behavior + description: "What actually happened. Please include a screenshot of the issue if possible." + validations: + required: true + - type: textarea + attributes: + label: Steps to Reproduce + description: "Describe how to reproduce the issue. Please be sure to attach a workflow JSON or PNG, ideally one that doesn't require custom nodes to test. If the bug open happens when certain custom nodes are used, most likely that custom node is what has the bug rather than ComfyUI, in which case it should be reported to the node's author." + validations: + required: true + - type: textarea + attributes: + label: Debug Logs + description: "Please copy the output from your terminal logs here." + render: powershell + validations: + required: true + - type: textarea + attributes: + label: Other + description: "Any other additional information you think might be helpful." + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..2c519ede5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: true +contact_links: + - name: ComfyUI Matrix Space + url: https://app.element.io/#/room/%23comfyui_space%3Amatrix.org + about: The ComfyUI Matrix Space is available for support and general discussion related to ComfyUI (Matrix is like Discord but open source). + - name: Comfy Org Discord + url: https://discord.gg/comfyorg + about: The Comfy Org Discord is available for support and general discussion related to ComfyUI. diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 000000000..419721b63 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,32 @@ +name: Feature Request +description: "You have an idea for something new you would like to see added to ComfyUI's core." +labels: [ "Feature" ] +body: + - type: markdown + attributes: + value: | + Before submitting a **Feature Request**, please ensure the following: + + **1:** You are running the latest version of ComfyUI. + **2:** You have looked to make sure there is not already a feature that does what you need, and there is not already a Feature Request listed for the same idea. + **3:** This is something that makes sense to add to ComfyUI Core, and wouldn't make more sense as a custom node. + + If unsure, ask on the [ComfyUI Matrix Space](https://app.element.io/#/room/%23comfyui_space%3Amatrix.org) or the [Comfy Org Discord](https://discord.gg/comfyorg) first. + - type: textarea + attributes: + label: Feature Idea + description: "Describe the feature you want to see." + validations: + required: true + - type: textarea + attributes: + label: Existing Solutions + description: "Please search through available custom nodes / extensions to see if there are existing custom solutions for this. If so, please link the options you found here as a reference." + validations: + required: false + - type: textarea + attributes: + label: Other + description: "Any other additional information you think might be helpful." + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/user-support.yml b/.github/ISSUE_TEMPLATE/user-support.yml new file mode 100644 index 000000000..df28804c6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/user-support.yml @@ -0,0 +1,32 @@ +name: User Support +description: "Use this if you need help with something, or you're experiencing an issue." +labels: [ "User Support" ] +body: + - type: markdown + attributes: + value: | + Before submitting a **User Report** issue, please ensure the following: + + **1:** You are running the latest version of ComfyUI. + **2:** You have made an effort to find public answers to your question before asking here. In other words, you googled it first, and scrolled through recent help topics. + + If unsure, ask on the [ComfyUI Matrix Space](https://app.element.io/#/room/%23comfyui_space%3Amatrix.org) or the [Comfy Org Discord](https://discord.gg/comfyorg) first. + - type: textarea + attributes: + label: Your question + description: "Post your question here. Please be as detailed as possible." + validations: + required: true + - type: textarea + attributes: + label: Logs + description: "If your question relates to an issue you're experiencing, please go to `Server` -> `Logs` -> potentially set `View Type` to `Debug` as well, then copypaste all the text into here." + render: powershell + validations: + required: false + - type: textarea + attributes: + label: Other + description: "Any other additional information you think might be helpful." + validations: + required: false From e3579f33600fea742611cc62503b446833d45735 Mon Sep 17 00:00:00 2001 From: pythongosssss <125205205+pythongosssss@users.noreply.github.com> Date: Wed, 26 Jun 2024 14:08:48 +0100 Subject: [PATCH 026/123] Fix merge issue breaking api json loading (#3876) --- web/scripts/app.js | 1 - 1 file changed, 1 deletion(-) diff --git a/web/scripts/app.js b/web/scripts/app.js index 725538563..a354ff805 100644 --- a/web/scripts/app.js +++ b/web/scripts/app.js @@ -2321,7 +2321,6 @@ export class ComfyApp { node.id = isNaN(+id) ? id : +id; node.title = data._meta?.title ?? node.title app.graph.add(node); - graph.add(node); } this.changeWorkflow(() => { From f12fa1d8d7b42888b6491aa6aa4956aefca3aba5 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Wed, 26 Jun 2024 09:09:21 -0400 Subject: [PATCH 027/123] Enable browser tests on push (#3878) --- .github/workflows/test-browser.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test-browser.yml b/.github/workflows/test-browser.yml index 323c96cf3..987a72ae3 100644 --- a/.github/workflows/test-browser.yml +++ b/.github/workflows/test-browser.yml @@ -7,6 +7,8 @@ name: Playwright Browser Tests CI on: + push: + branches: [ main, master ] pull_request: branches: [ main, master ] From a3e83f695d6588bc06fdd40e039cd1e5b5e169dd Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Wed, 26 Jun 2024 19:58:56 -0400 Subject: [PATCH 028/123] Update test ref (#3882) * Update ref * Disable some tests --- .github/workflows/test-browser.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-browser.yml b/.github/workflows/test-browser.yml index 987a72ae3..65483b00f 100644 --- a/.github/workflows/test-browser.yml +++ b/.github/workflows/test-browser.yml @@ -26,7 +26,7 @@ jobs: with: repository: "huchenlei/ComfyUI_frontend" path: "ComfyUI_frontend" - ref: "577aea9dfb680a14b3ae4fa626a85098c3207030" + ref: "fcc54d803e5b6a9b08a462a1d94899318c96dcbb" - uses: actions/setup-node@v3 with: node-version: lts/* From bc5a0f10db34a5c942fa3c531864da9665faaaa5 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Wed, 26 Jun 2024 19:59:09 -0400 Subject: [PATCH 029/123] Ignore *.log (#3880) --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9f0389241..9473f43ab 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,5 @@ venv/ !/web/extensions/logging.js.example !/web/extensions/core/ /tests-ui/data/object_info.json -/user/ \ No newline at end of file +/user/ +*.log \ No newline at end of file From 175fe02522751c9f5e9a8309b3aaa5d07a542296 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Wed, 26 Jun 2024 19:59:19 -0400 Subject: [PATCH 030/123] Ignore .vscode/ (#3879) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9473f43ab..a9beebe73 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ __pycache__/ !custom_nodes/example_node.py.example extra_model_paths.yaml /.vs +.vscode/ .idea/ venv/ /web/extensions/* From 44947e7ad489eaadb38007ca7aabd71aef7fa10e Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 26 Jun 2024 22:40:05 -0400 Subject: [PATCH 031/123] Add DEIS order 3 sampler. Order 4 seems to give bad results. --- comfy/k_diffusion/deis.py | 122 ++++++++++++++++++++++++++++++++++ comfy/k_diffusion/sampling.py | 50 ++++++++++++++ comfy/samplers.py | 2 +- 3 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 comfy/k_diffusion/deis.py diff --git a/comfy/k_diffusion/deis.py b/comfy/k_diffusion/deis.py new file mode 100644 index 000000000..0be2036c3 --- /dev/null +++ b/comfy/k_diffusion/deis.py @@ -0,0 +1,122 @@ +#Taken from: https://github.com/zju-pi/diff-sampler/blob/main/gits-main/solver_utils.py +#under Apache 2 license +import torch +import numpy as np + +# A pytorch reimplementation of DEIS (https://github.com/qsh-zh/deis). +############################# +### Utils for DEIS solver ### +############################# +#---------------------------------------------------------------------------- +# Transfer from the input time (sigma) used in EDM to that (t) used in DEIS. + +def edm2t(edm_steps, epsilon_s=1e-3, sigma_min=0.002, sigma_max=80): + vp_sigma = lambda beta_d, beta_min: lambda t: (np.e ** (0.5 * beta_d * (t ** 2) + beta_min * t) - 1) ** 0.5 + vp_sigma_inv = lambda beta_d, beta_min: lambda sigma: ((beta_min ** 2 + 2 * beta_d * (sigma ** 2 + 1).log()).sqrt() - beta_min) / beta_d + vp_beta_d = 2 * (np.log(torch.tensor(sigma_min).cpu() ** 2 + 1) / epsilon_s - np.log(torch.tensor(sigma_max).cpu() ** 2 + 1)) / (epsilon_s - 1) + vp_beta_min = np.log(torch.tensor(sigma_max).cpu() ** 2 + 1) - 0.5 * vp_beta_d + t_steps = vp_sigma_inv(vp_beta_d.clone().detach().cpu(), vp_beta_min.clone().detach().cpu())(edm_steps.clone().detach().cpu()) + return t_steps, vp_beta_min, vp_beta_d + vp_beta_min + +#---------------------------------------------------------------------------- + +def cal_poly(prev_t, j, taus): + poly = 1 + for k in range(prev_t.shape[0]): + if k == j: + continue + poly *= (taus - prev_t[k]) / (prev_t[j] - prev_t[k]) + return poly + +#---------------------------------------------------------------------------- +# Transfer from t to alpha_t. + +def t2alpha_fn(beta_0, beta_1, t): + return torch.exp(-0.5 * t ** 2 * (beta_1 - beta_0) - t * beta_0) + +#---------------------------------------------------------------------------- + +def cal_intergrand(beta_0, beta_1, taus): + with torch.inference_mode(mode=False): + taus = taus.clone() + beta_0 = beta_0.clone() + beta_1 = beta_1.clone() + with torch.enable_grad(): + taus.requires_grad_(True) + alpha = t2alpha_fn(beta_0, beta_1, taus) + log_alpha = alpha.log() + log_alpha.sum().backward() + d_log_alpha_dtau = taus.grad + integrand = -0.5 * d_log_alpha_dtau / torch.sqrt(alpha * (1 - alpha)) + return integrand + +#---------------------------------------------------------------------------- + +def get_deis_coeff_list(t_steps, max_order, N=10000, deis_mode='tab'): + """ + Get the coefficient list for DEIS sampling. + + Args: + t_steps: A pytorch tensor. The time steps for sampling. + max_order: A `int`. Maximum order of the solver. 1 <= max_order <= 4 + N: A `int`. Use how many points to perform the numerical integration when deis_mode=='tab'. + deis_mode: A `str`. Select between 'tab' and 'rhoab'. Type of DEIS. + Returns: + A pytorch tensor. A batch of generated samples or sampling trajectories if return_inters=True. + """ + if deis_mode == 'tab': + t_steps, beta_0, beta_1 = edm2t(t_steps) + C = [] + for i, (t_cur, t_next) in enumerate(zip(t_steps[:-1], t_steps[1:])): + order = min(i+1, max_order) + if order == 1: + C.append([]) + else: + taus = torch.linspace(t_cur, t_next, N) # split the interval for integral appximation + dtau = (t_next - t_cur) / N + prev_t = t_steps[[i - k for k in range(order)]] + coeff_temp = [] + integrand = cal_intergrand(beta_0, beta_1, taus) + for j in range(order): + poly = cal_poly(prev_t, j, taus) + coeff_temp.append(torch.sum(integrand * poly) * dtau) + C.append(coeff_temp) + + elif deis_mode == 'rhoab': + # Analytical solution, second order + def get_def_intergral_2(a, b, start, end, c): + coeff = (end**3 - start**3) / 3 - (end**2 - start**2) * (a + b) / 2 + (end - start) * a * b + return coeff / ((c - a) * (c - b)) + + # Analytical solution, third order + def get_def_intergral_3(a, b, c, start, end, d): + coeff = (end**4 - start**4) / 4 - (end**3 - start**3) * (a + b + c) / 3 \ + + (end**2 - start**2) * (a*b + a*c + b*c) / 2 - (end - start) * a * b * c + return coeff / ((d - a) * (d - b) * (d - c)) + + C = [] + for i, (t_cur, t_next) in enumerate(zip(t_steps[:-1], t_steps[1:])): + order = min(i, max_order) + if order == 0: + C.append([]) + else: + prev_t = t_steps[[i - k for k in range(order+1)]] + if order == 1: + coeff_cur = ((t_next - prev_t[1])**2 - (t_cur - prev_t[1])**2) / (2 * (t_cur - prev_t[1])) + coeff_prev1 = (t_next - t_cur)**2 / (2 * (prev_t[1] - t_cur)) + coeff_temp = [coeff_cur, coeff_prev1] + elif order == 2: + coeff_cur = get_def_intergral_2(prev_t[1], prev_t[2], t_cur, t_next, t_cur) + coeff_prev1 = get_def_intergral_2(t_cur, prev_t[2], t_cur, t_next, prev_t[1]) + coeff_prev2 = get_def_intergral_2(t_cur, prev_t[1], t_cur, t_next, prev_t[2]) + coeff_temp = [coeff_cur, coeff_prev1, coeff_prev2] + elif order == 3: + coeff_cur = get_def_intergral_3(prev_t[1], prev_t[2], prev_t[3], t_cur, t_next, t_cur) + coeff_prev1 = get_def_intergral_3(t_cur, prev_t[2], prev_t[3], t_cur, t_next, prev_t[1]) + coeff_prev2 = get_def_intergral_3(t_cur, prev_t[1], prev_t[3], t_cur, t_next, prev_t[2]) + coeff_prev3 = get_def_intergral_3(t_cur, prev_t[1], prev_t[2], t_cur, t_next, prev_t[3]) + coeff_temp = [coeff_cur, coeff_prev1, coeff_prev2, coeff_prev3] + C.append(coeff_temp) + print(C) + return C + diff --git a/comfy/k_diffusion/sampling.py b/comfy/k_diffusion/sampling.py index 9b58cb1dc..f8091bb3f 100644 --- a/comfy/k_diffusion/sampling.py +++ b/comfy/k_diffusion/sampling.py @@ -7,6 +7,7 @@ import torchsde from tqdm.auto import trange, tqdm from . import utils +from . import deis import comfy.model_patcher def append_zero(x): @@ -946,6 +947,55 @@ def sample_ipndm_v(model, x, sigmas, extra_args=None, callback=None, disable=Non return x_next +#From https://github.com/zju-pi/diff-sampler/blob/main/diff-solvers-main/solvers.py +#under Apache 2 license +@torch.no_grad() +def sample_deis(model, x, sigmas, extra_args=None, callback=None, disable=None, max_order=3, deis_mode='tab'): + extra_args = {} if extra_args is None else extra_args + s_in = x.new_ones([x.shape[0]]) + + x_next = x + t_steps = sigmas + + coeff_list = deis.get_deis_coeff_list(t_steps, max_order, deis_mode=deis_mode) + + buffer_model = [] + for i in trange(len(sigmas) - 1, disable=disable): + t_cur = sigmas[i] + t_next = sigmas[i + 1] + + x_cur = x_next + + denoised = model(x_cur, t_cur * s_in, **extra_args) + if callback is not None: + callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigmas[i], 'denoised': denoised}) + + d_cur = (x_cur - denoised) / t_cur + + order = min(max_order, i+1) + if t_next <= 0: + order = 1 + + if order == 1: # First Euler step. + x_next = x_cur + (t_next - t_cur) * d_cur + elif order == 2: # Use one history point. + coeff_cur, coeff_prev1 = coeff_list[i] + x_next = x_cur + coeff_cur * d_cur + coeff_prev1 * buffer_model[-1] + elif order == 3: # Use two history points. + coeff_cur, coeff_prev1, coeff_prev2 = coeff_list[i] + x_next = x_cur + coeff_cur * d_cur + coeff_prev1 * buffer_model[-1] + coeff_prev2 * buffer_model[-2] + elif order == 4: # Use three history points. + coeff_cur, coeff_prev1, coeff_prev2, coeff_prev3 = coeff_list[i] + x_next = x_cur + coeff_cur * d_cur + coeff_prev1 * buffer_model[-1] + coeff_prev2 * buffer_model[-2] + coeff_prev3 * buffer_model[-3] + + if len(buffer_model) == max_order - 1: + for k in range(max_order - 2): + buffer_model[k] = buffer_model[k+1] + buffer_model[-1] = d_cur.detach() + else: + buffer_model.append(d_cur.detach()) + + return x_next @torch.no_grad() def sample_euler_pp(model, x, sigmas, extra_args=None, callback=None, disable=None): diff --git a/comfy/samplers.py b/comfy/samplers.py index c3a80dde0..7f7114dbb 100644 --- a/comfy/samplers.py +++ b/comfy/samplers.py @@ -540,7 +540,7 @@ class Sampler: KSAMPLER_NAMES = ["euler", "euler_pp", "euler_ancestral", "euler_ancestral_pp", "heun", "heunpp2","dpm_2", "dpm_2_ancestral", "lms", "dpm_fast", "dpm_adaptive", "dpmpp_2s_ancestral", "dpmpp_sde", "dpmpp_sde_gpu", "dpmpp_2m", "dpmpp_2m_sde", "dpmpp_2m_sde_gpu", "dpmpp_3m_sde", "dpmpp_3m_sde_gpu", "ddpm", "lcm", - "ipndm", "ipndm_v"] + "ipndm", "ipndm_v", "deis"] class KSAMPLER(Sampler): def __init__(self, sampler_function, extra_options={}, inpaint_options={}): From 3b423afccab877b57fc24141690426ca1660e4bb Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Thu, 27 Jun 2024 00:22:55 -0400 Subject: [PATCH 032/123] Add audio widget (#3863) * Add audio widget * Fix audio bugs * Add CSS * Populate audio widget when load history --- comfy_extras/nodes_audio.py | 11 +- web/extensions/core/uploadAudio.js | 176 +++++++++++++++++++++++++++++ web/scripts/app.js | 11 +- web/style.css | 4 + 4 files changed, 199 insertions(+), 3 deletions(-) create mode 100644 web/extensions/core/uploadAudio.js diff --git a/comfy_extras/nodes_audio.py b/comfy_extras/nodes_audio.py index 57d0a20ab..8efa7c0a8 100644 --- a/comfy_extras/nodes_audio.py +++ b/comfy_extras/nodes_audio.py @@ -93,11 +93,18 @@ class SaveAudio: return { "ui": { "audio": results } } class LoadAudio: + SUPPORTED_FORMATS = ('.wav', '.mp3', '.ogg', '.flac', '.aiff', '.aif') + @classmethod def INPUT_TYPES(s): input_dir = folder_paths.get_input_directory() - files = [f for f in os.listdir(input_dir) if os.path.isfile(os.path.join(input_dir, f))] - return {"required": {"audio": [sorted(files), ]}, } + files = [ + f for f in os.listdir(input_dir) + if (os.path.isfile(os.path.join(input_dir, f)) + and f.endswith(LoadAudio.SUPPORTED_FORMATS) + ) + ] + return {"required": {"audio": (sorted(files), {"audio_upload": True})}} CATEGORY = "_for_testing/audio" diff --git a/web/extensions/core/uploadAudio.js b/web/extensions/core/uploadAudio.js new file mode 100644 index 000000000..d3dfef4a7 --- /dev/null +++ b/web/extensions/core/uploadAudio.js @@ -0,0 +1,176 @@ +import { app } from "../../scripts/app.js" +import { api } from "../../scripts/api.js" + +function splitFilePath(path) { + const folder_separator = path.lastIndexOf("/") + if (folder_separator === -1) { + return ["", path] + } + return [ + path.substring(0, folder_separator), + path.substring(folder_separator + 1) + ] +} + +function getResourceURL(subfolder, filename, type = "input") { + const params = [ + "filename=" + encodeURIComponent(filename), + "type=" + type, + "subfolder=" + subfolder, + app.getPreviewFormatParam().substring(1), + app.getRandParam().substring(1) + ].join("&") + + return `/view?${params}` +} + +async function uploadFile( + audioWidget, + audioUIWidget, + file, + updateNode, + pasted = false +) { + try { + // Wrap file in formdata so it includes filename + const body = new FormData() + body.append("image", file) + if (pasted) body.append("subfolder", "pasted") + const resp = await api.fetchApi("/upload/image", { + method: "POST", + body + }) + + if (resp.status === 200) { + const data = await resp.json() + // Add the file to the dropdown list and update the widget value + let path = data.name + if (data.subfolder) path = data.subfolder + "/" + path + + if (!audioWidget.options.values.includes(path)) { + audioWidget.options.values.push(path) + } + + if (updateNode) { + audioUIWidget.element.src = api.apiURL( + getResourceURL(...splitFilePath(path)) + ) + audioWidget.value = path + } + } else { + alert(resp.status + " - " + resp.statusText) + } + } catch (error) { + alert(error) + } +} + +// AudioWidget MUST be registered first, as AUDIOUPLOAD depends on AUDIO_UI to be +// present. +app.registerExtension({ + name: "Comfy.AudioWidget", + async beforeRegisterNodeDef(nodeType, nodeData) { + if (["LoadAudio", "SaveAudio"].includes(nodeType.comfyClass)) { + nodeData.input.required.audioUI = ["AUDIO_UI"] + } + }, + getCustomWidgets() { + return { + AUDIO_UI(node, inputName) { + const audio = document.createElement("audio") + audio.controls = true + audio.classList.add("comfy-audio") + audio.setAttribute("name", "media") + + const audioUIWidget = node.addDOMWidget( + inputName, + /* name=*/ "audioUI", + audio + ) + // @ts-ignore + // TODO: Sort out the DOMWidget type. + audioUIWidget.serialize = false + + const isOutputNode = node.constructor.nodeData.output_node + if (isOutputNode) { + // Hide the audio widget when there is no audio initially. + audioUIWidget.element.classList.add("empty-audio-widget") + // Populate the audio widget UI on node execution. + const onExecuted = node.onExecuted + node.onExecuted = function(message) { + onExecuted?.apply(this, arguments) + const audios = message.audio + if (!audios) return + const audio = audios[0] + audioUIWidget.element.src = api.apiURL( + getResourceURL(audio.subfolder, audio.filename, "output") + ) + audioUIWidget.element.classList.remove("empty-audio-widget") + } + } + return { widget: audioUIWidget } + } + } + }, + onNodeOutputsUpdated(nodeOutputs) { + for (const [nodeId, output] of Object.entries(nodeOutputs)) { + const node = app.graph.getNodeById(Number.parseInt(nodeId)); + if ("audio" in output) { + const audioUIWidget = node.widgets.find((w) => w.name === "audioUI"); + const audio = output.audio[0]; + audioUIWidget.element.src = api.apiURL(getResourceURL(audio.subfolder, audio.filename, "output")); + audioUIWidget.element.classList.remove("empty-audio-widget"); + } + } + }, +}) + +app.registerExtension({ + name: "Comfy.UploadAudio", + async beforeRegisterNodeDef(nodeType, nodeData) { + if (nodeData?.input?.required?.audio?.[1]?.audio_upload === true) { + nodeData.input.required.upload = ["AUDIOUPLOAD"] + } + }, + getCustomWidgets() { + return { + AUDIOUPLOAD(node, inputName) { + // The widget that allows user to select file. + const audioWidget = node.widgets.find(w => w.name === "audio") + const audioUIWidget = node.widgets.find(w => w.name === "audioUI") + + const onAudioWidgetUpdate = () => { + audioUIWidget.element.src = api.apiURL( + getResourceURL(...splitFilePath(audioWidget.value)) + ) + } + // Initially load default audio file to audioUIWidget. + onAudioWidgetUpdate() + audioWidget.callback = onAudioWidgetUpdate + + const fileInput = document.createElement("input") + fileInput.type = "file" + fileInput.accept = "audio/*" + fileInput.style.display = "none" + fileInput.onchange = () => { + if (fileInput.files.length) { + uploadFile(audioWidget, audioUIWidget, fileInput.files[0], true) + } + } + // The widget to pop up the upload dialog. + const uploadWidget = node.addWidget( + "button", + inputName, + /* value=*/ "", + () => { + fileInput.click() + } + ) + uploadWidget.label = "choose file to upload" + uploadWidget.serialize = false + + return { widget: uploadWidget } + } + } + } +}) diff --git a/web/scripts/app.js b/web/scripts/app.js index a354ff805..5fc9b9c6c 100644 --- a/web/scripts/app.js +++ b/web/scripts/app.js @@ -71,7 +71,7 @@ export class ComfyApp { * Stores the execution output data for each node * @type {Record} */ - this.nodeOutputs = {}; + this._nodeOutputs = {}; /** * Stores the preview image data for each node @@ -86,6 +86,15 @@ export class ComfyApp { this.shiftDown = false; } + get nodeOutputs() { + return this._nodeOutputs; + } + + set nodeOutputs(value) { + this._nodeOutputs = value; + this.#invokeExtensions("onNodeOutputsUpdated", value); + } + getPreviewFormatParam() { let preview_format = this.ui.settings.getSettingValue("Comfy.PreviewFormat"); if(preview_format) diff --git a/web/style.css b/web/style.css index 8091a489f..e983b652a 100644 --- a/web/style.css +++ b/web/style.css @@ -632,3 +632,7 @@ dialog::backdrop { border-top: none; } } + +audio.comfy-audio.empty-audio-widget { + display: none; +} From 4650e7d6e9e846160906b94d575705151d59fdd1 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 27 Jun 2024 01:28:59 -0400 Subject: [PATCH 033/123] Save and load workflow from the flac files output by SaveAudio. --- comfy_extras/nodes_audio.py | 79 ++++++++++++++++++++++++++++++++++++- web/scripts/app.js | 15 ++++++- web/scripts/pnginfo.js | 72 +++++++++++++++++++++++++++++++++ web/scripts/ui.js | 2 +- 4 files changed, 164 insertions(+), 4 deletions(-) diff --git a/comfy_extras/nodes_audio.py b/comfy_extras/nodes_audio.py index 8efa7c0a8..34bcfa96d 100644 --- a/comfy_extras/nodes_audio.py +++ b/comfy_extras/nodes_audio.py @@ -3,6 +3,10 @@ import torch import comfy.model_management import folder_paths import os +import io +import json +import struct +from comfy.cli_args import args class EmptyLatentAudio: def __init__(self): @@ -53,6 +57,61 @@ class VAEDecodeAudio: audio = vae.decode(samples["samples"]).movedim(-1, 1) return ({"waveform": audio, "sample_rate": 44100}, ) + +def create_vorbis_comment_block(comment_dict, last_block): + vendor_string = b'ComfyUI' + vendor_length = len(vendor_string) + + comments = [] + for key, value in comment_dict.items(): + comment = f"{key}={value}".encode('utf-8') + comments.append(struct.pack('I', len(comment_data))[1:] + comment_data + + return comment_block + +def insert_or_replace_vorbis_comment(flac_io, comment_dict): + if len(comment_dict) == 0: + return flac_io + + flac_io.seek(4) + + blocks = [] + last_block = False + + while not last_block: + header = flac_io.read(4) + last_block = (header[0] & 0x80) != 0 + block_type = header[0] & 0x7F + block_length = struct.unpack('>I', b'\x00' + header[1:])[0] + block_data = flac_io.read(block_length) + + if block_type == 4 or block_type == 1: + pass + else: + header = bytes([(header[0] & (~0x80))]) + header[1:] + blocks.append(header + block_data) + + blocks.append(create_vorbis_comment_block(comment_dict, last_block=True)) + + new_flac_io = io.BytesIO() + new_flac_io.write(b'fLaC') + for block in blocks: + new_flac_io.write(block) + + new_flac_io.write(flac_io.read()) + return new_flac_io + + class SaveAudio: def __init__(self): self.output_dir = folder_paths.get_output_directory() @@ -78,11 +137,27 @@ class SaveAudio: filename_prefix += self.prefix_append full_output_folder, filename, counter, subfolder, filename_prefix = folder_paths.get_save_image_path(filename_prefix, self.output_dir) results = list() + + metadata = {} + if not args.disable_metadata: + if prompt is not None: + metadata["prompt"] = json.dumps(prompt) + if extra_pnginfo is not None: + for x in extra_pnginfo: + metadata[x] = json.dumps(extra_pnginfo[x]) + for (batch_number, waveform) in enumerate(audio["waveform"]): - #TODO: metadata filename_with_batch_num = filename.replace("%batch_num%", str(batch_number)) file = f"{filename_with_batch_num}_{counter:05}_.flac" - torchaudio.save(os.path.join(full_output_folder, file), waveform, audio["sample_rate"], format="FLAC") + + buff = io.BytesIO() + torchaudio.save(buff, waveform, audio["sample_rate"], format="FLAC") + + buff = insert_or_replace_vorbis_comment(buff, metadata) + + with open(os.path.join(full_output_folder, file), 'wb') as f: + f.write(buff.getbuffer()) + results.append({ "filename": file, "subfolder": subfolder, diff --git a/web/scripts/app.js b/web/scripts/app.js index 5fc9b9c6c..43df61065 100644 --- a/web/scripts/app.js +++ b/web/scripts/app.js @@ -3,7 +3,7 @@ import { ComfyWidgets, initWidgets } from "./widgets.js"; import { ComfyUI, $el } from "./ui.js"; import { api } from "./api.js"; import { defaultGraph } from "./defaultGraph.js"; -import { getPngMetadata, getWebpMetadata, importA1111, getLatentMetadata } from "./pnginfo.js"; +import { getPngMetadata, getWebpMetadata, getFlacMetadata, importA1111, getLatentMetadata } from "./pnginfo.js"; import { addDomClippingSetting } from "./domWidget.js"; import { createImageHost, calculateImageGrid } from "./ui/imagePreview.js"; import { ComfyAppMenu } from "./ui/menu/index.js"; @@ -2277,6 +2277,19 @@ export class ComfyApp { const workflow = pngInfo?.workflow || pngInfo?.Workflow; const prompt = pngInfo?.prompt || pngInfo?.Prompt; + if (workflow) { + this.loadGraphData(JSON.parse(workflow), true, true, fileName); + } else if (prompt) { + this.loadApiJson(JSON.parse(prompt), fileName); + } else { + this.showErrorOnFileLoad(file); + } + } else if (file.type === "audio/flac") { + const pngInfo = await getFlacMetadata(file); + // Support loading workflows from that webp custom node. + const workflow = pngInfo?.workflow; + const prompt = pngInfo?.prompt; + if (workflow) { this.loadGraphData(JSON.parse(workflow), true, true, fileName); } else if (prompt) { diff --git a/web/scripts/pnginfo.js b/web/scripts/pnginfo.js index 7132fb60f..2c03cf74a 100644 --- a/web/scripts/pnginfo.js +++ b/web/scripts/pnginfo.js @@ -163,6 +163,78 @@ export function getLatentMetadata(file) { }); } + +function getString(dataView, offset, length) { + let string = ''; + for (let i = 0; i < length; i++) { + string += String.fromCharCode(dataView.getUint8(offset + i)); + } + return string; +} + +// Function to parse the Vorbis Comment block +function parseVorbisComment(dataView) { + let offset = 0; + const vendorLength = dataView.getUint32(offset, true); + offset += 4; + const vendorString = getString(dataView, offset, vendorLength); + offset += vendorLength; + + const userCommentListLength = dataView.getUint32(offset, true); + offset += 4; + const comments = {}; + for (let i = 0; i < userCommentListLength; i++) { + const commentLength = dataView.getUint32(offset, true); + offset += 4; + const comment = getString(dataView, offset, commentLength); + offset += commentLength; + + const [key, value] = comment.split('='); + + comments[key] = value; + } + + return comments; +} + +// Function to read a FLAC file and parse Vorbis comments +export function getFlacMetadata(file) { + return new Promise((r) => { + const reader = new FileReader(); + reader.onload = function(event) { + const arrayBuffer = event.target.result; + const dataView = new DataView(arrayBuffer); + + // Verify the FLAC signature + const signature = String.fromCharCode(...new Uint8Array(arrayBuffer, 0, 4)); + if (signature !== 'fLaC') { + console.error('Not a valid FLAC file'); + return; + } + + // Parse metadata blocks + let offset = 4; + let vorbisComment = null; + while (offset < dataView.byteLength) { + const isLastBlock = dataView.getUint8(offset) & 0x80; + const blockType = dataView.getUint8(offset) & 0x7F; + const blockSize = dataView.getUint32(offset, false) & 0xFFFFFF; + offset += 4; + + if (blockType === 4) { // Vorbis Comment block type + vorbisComment = parseVorbisComment(new DataView(arrayBuffer, offset, blockSize)); + } + + offset += blockSize; + if (isLastBlock) break; + } + + r(vorbisComment); + }; + reader.readAsArrayBuffer(file); + }); +} + export async function importA1111(graph, parameters) { const p = parameters.lastIndexOf("\nSteps:"); if (p > -1) { diff --git a/web/scripts/ui.js b/web/scripts/ui.js index bb094d8b4..2c47412c9 100644 --- a/web/scripts/ui.js +++ b/web/scripts/ui.js @@ -373,7 +373,7 @@ export class ComfyUI { const fileInput = $el("input", { id: "comfy-file-input", type: "file", - accept: ".json,image/png,.latent,.safetensors,image/webp", + accept: ".json,image/png,.latent,.safetensors,image/webp,audio/flac", style: {display: "none"}, parent: document.body, onchange: () => { From 4f9d2b057c97be22aa46b91ed8954a3cee424fb4 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 27 Jun 2024 02:54:15 -0400 Subject: [PATCH 034/123] Remove print. --- comfy/k_diffusion/deis.py | 1 - 1 file changed, 1 deletion(-) diff --git a/comfy/k_diffusion/deis.py b/comfy/k_diffusion/deis.py index 0be2036c3..607410656 100644 --- a/comfy/k_diffusion/deis.py +++ b/comfy/k_diffusion/deis.py @@ -117,6 +117,5 @@ def get_deis_coeff_list(t_steps, max_order, N=10000, deis_mode='tab'): coeff_prev3 = get_def_intergral_3(t_cur, prev_t[1], prev_t[2], t_cur, t_next, prev_t[3]) coeff_temp = [coeff_cur, coeff_prev1, coeff_prev2, coeff_prev3] C.append(coeff_temp) - print(C) return C From 5ff3d4eb3a91d1e66d35a919dd38c02b4652e96a Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Thu, 27 Jun 2024 09:13:52 -0400 Subject: [PATCH 035/123] Fix audio upload when no audio in input dir (#3891) --- web/extensions/core/uploadAudio.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web/extensions/core/uploadAudio.js b/web/extensions/core/uploadAudio.js index d3dfef4a7..12a2a196b 100644 --- a/web/extensions/core/uploadAudio.js +++ b/web/extensions/core/uploadAudio.js @@ -145,7 +145,9 @@ app.registerExtension({ ) } // Initially load default audio file to audioUIWidget. - onAudioWidgetUpdate() + if (audioWidget.value) { + onAudioWidgetUpdate() + } audioWidget.callback = onAudioWidgetUpdate const fileInput = document.createElement("input") From 8ceb5a02a3182e6551690d9e56934bdca1cebcca Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 27 Jun 2024 11:06:52 -0400 Subject: [PATCH 036/123] Support saving stable audio checkpoint that can be loaded back. --- comfy/model_base.py | 9 +++++++++ comfy/sd.py | 2 +- comfy/supported_models.py | 5 ++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/comfy/model_base.py b/comfy/model_base.py index f45b375de..80f6667ec 100644 --- a/comfy/model_base.py +++ b/comfy/model_base.py @@ -627,3 +627,12 @@ class StableAudio1(BaseModel): cross_attn = torch.cat([cross_attn.to(device), seconds_start_embed.repeat((cross_attn.shape[0], 1, 1)), seconds_total_embed.repeat((cross_attn.shape[0], 1, 1))], dim=1) out['c_crossattn'] = comfy.conds.CONDRegular(cross_attn) return out + + def state_dict_for_saving(self, clip_state_dict=None, vae_state_dict=None, clip_vision_state_dict=None): + sd = super().state_dict_for_saving(clip_state_dict=clip_state_dict, vae_state_dict=vae_state_dict, clip_vision_state_dict=clip_vision_state_dict) + d = {"conditioner.conditioners.seconds_start.": self.seconds_start_embedder.state_dict(), "conditioner.conditioners.seconds_total.": self.seconds_total_embedder.state_dict()} + for k in d: + s = d[k] + for l in s: + sd["{}{}".format(k, l)] = s[l] + return sd diff --git a/comfy/sd.py b/comfy/sd.py index ea6e9b663..dda0887ba 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -236,7 +236,7 @@ class VAE: self.first_stage_model = AutoencodingEngine(regularizer_config={'target': "comfy.ldm.models.autoencoder.DiagonalGaussianRegularizer"}, encoder_config={'target': "comfy.ldm.modules.diffusionmodules.model.Encoder", 'params': ddconfig}, decoder_config={'target': "comfy.ldm.modules.diffusionmodules.model.Decoder", 'params': ddconfig}) - elif "decoder.layers.0.weight_v" in sd: + elif "decoder.layers.1.layers.0.beta" in sd: self.first_stage_model = AudioOobleckVAE() self.memory_used_encode = lambda shape, dtype: (1000 * shape[2]) * model_management.dtype_size(dtype) self.memory_used_decode = lambda shape, dtype: (1000 * shape[2] * 2048) * model_management.dtype_size(dtype) diff --git a/comfy/supported_models.py b/comfy/supported_models.py index 761498dbc..21fdb7ec7 100644 --- a/comfy/supported_models.py +++ b/comfy/supported_models.py @@ -543,13 +543,16 @@ class StableAudio(supported_models_base.BASE): seconds_total_sd = utils.state_dict_prefix_replace(state_dict, {"conditioner.conditioners.seconds_total.": ""}, filter_keys=True) return model_base.StableAudio1(self, seconds_start_embedder_weights=seconds_start_sd, seconds_total_embedder_weights=seconds_total_sd, device=device) - def process_unet_state_dict(self, state_dict): for k in list(state_dict.keys()): if k.endswith(".cross_attend_norm.beta") or k.endswith(".ff_norm.beta") or k.endswith(".pre_norm.beta"): #These weights are all zero state_dict.pop(k) return state_dict + def process_unet_state_dict_for_saving(self, state_dict): + replace_prefix = {"": "model.model."} + return utils.state_dict_prefix_replace(state_dict, replace_prefix) + def clip_target(self, state_dict={}): return supported_models_base.ClipTarget(sa_t5.SAT5Tokenizer, sa_t5.SAT5Model) From 449bf52923896236ed645da2ff05aadbf2b0d536 Mon Sep 17 00:00:00 2001 From: Robin Huang Date: Thu, 27 Jun 2024 13:08:26 -0700 Subject: [PATCH 037/123] Add integration test for Linux with Nvidia GPU. #3884 (#3895) * Add linux integration test. * Fix directory path. * Add paths ignore. * Fix conda env directory path. --- .../conda-environments/linux-environment.yml | 28 +++++++++++ .github/workflows/linux-integration-test.yml | 50 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 .github/conda-environments/linux-environment.yml create mode 100644 .github/workflows/linux-integration-test.yml diff --git a/.github/conda-environments/linux-environment.yml b/.github/conda-environments/linux-environment.yml new file mode 100644 index 000000000..c9ebd6406 --- /dev/null +++ b/.github/conda-environments/linux-environment.yml @@ -0,0 +1,28 @@ +name: comfyui +channels: + - pytorch + - nvidia + - defaults +dependencies: + - python>=3.9 + - pip + - pytorch + - torchvision + - torchaudio + - pytorch-cuda=12.1 + - pip: + # comfyui requirements + - einops + - transformers>=4.25.1 + - safetensors>=0.4.2 + - aiohttp + - pyyaml + - Pillow + - scipy + - tqdm + - psutil + # comfy-action requirements + - requests + - google-cloud-storage + - comfy-cli + - charset-normalizer \ No newline at end of file diff --git a/.github/workflows/linux-integration-test.yml b/.github/workflows/linux-integration-test.yml new file mode 100644 index 000000000..eed84a77c --- /dev/null +++ b/.github/workflows/linux-integration-test.yml @@ -0,0 +1,50 @@ +name: (Linux) ComfyUI Integration Tests +on: + push: + branches: + - master + paths-ignore: + - 'app/**' + - 'input/**' + - 'output/**' + - 'model/**' + - 'notebook/**' + - 'script_example/**' + - 'tests/**' + - 'tests-ui/**' + - '.github/**' + - '.ci/**' + - 'web/**' + workflow_dispatch: + pull_request: + branches: + - master + paths-ignore: + - 'app/**' + - 'input/**' + - 'output/**' + - 'model/**' + - 'notebook/**' + - 'script_example/**' + - 'tests/**' + - 'tests-ui/**' + - '.github/**' + - '.ci/**' + - 'web/**' + +jobs: + test-workflows: + runs-on: [self-hosted, Linux, t4] + steps: + - name: Test ComfyUI Workflows + uses: comfy-org/comfy-action@main + with: + os: linux + cuda_version: 12.1 + models-json: '{"v1-5-pruned-emaonly.ckpt": {"url": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt", "directory": "checkpoints"}}' + workflow_filenames: "default.json" + gcs_bucket_name: 'comfy-ci-results' + google_credentials: ${{ secrets.GCS_SERVICE_ACCOUNT_JSON }} + output_prefix: 'ComfyUI' + conda_env_file: '.github/conda-environments/linux-environment.yml' + timeout: 50 From 97b409cd486b1a3b1114ae204802c81f3727d1a2 Mon Sep 17 00:00:00 2001 From: Robin Huang Date: Thu, 27 Jun 2024 13:10:16 -0700 Subject: [PATCH 038/123] Add macOs integration test for default workflow. (#3898) --- .../conda-environments/mac-environment.yml | 26 ++++++++++ .github/workflows/mac-integration-test.yml | 50 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 .github/conda-environments/mac-environment.yml create mode 100644 .github/workflows/mac-integration-test.yml diff --git a/.github/conda-environments/mac-environment.yml b/.github/conda-environments/mac-environment.yml new file mode 100644 index 000000000..33832b854 --- /dev/null +++ b/.github/conda-environments/mac-environment.yml @@ -0,0 +1,26 @@ +name: comfyui +channels: + - pytorch-nightly + - defaults +dependencies: + - python>=3.9 + - pytorch-nightly::pytorch + - torchvision + - torchaudio + - pip: + - pip + # comfyui requirements + - einops + - transformers>=4.25.1 + - safetensors>=0.4.2 + - aiohttp + - pyyaml + - Pillow + - scipy + - tqdm + - psutil + # comfy-action requirements + - requests + - google-cloud-storage + - comfy-cli + - charset-normalizer diff --git a/.github/workflows/mac-integration-test.yml b/.github/workflows/mac-integration-test.yml new file mode 100644 index 000000000..6a0482b1b --- /dev/null +++ b/.github/workflows/mac-integration-test.yml @@ -0,0 +1,50 @@ +name: (macOS) ComfyUI Integration Tests +on: + push: + branches: + - master + paths-ignore: + - 'app/**' + - 'input/**' + - 'output/**' + - 'model/**' + - 'notebook/**' + - 'script_example/**' + - 'tests/**' + - 'tests-ui/**' + - '.github/**' + - '.ci/**' + - 'web/**' + workflow_dispatch: + pull_request: + branches: + - master + paths-ignore: + - 'app/**' + - 'input/**' + - 'output/**' + - 'model/**' + - 'notebook/**' + - 'script_example/**' + - 'tests/**' + - 'tests-ui/**' + - '.github/**' + - '.ci/**' + - 'web/**' + +jobs: + test-workflows: + runs-on: [self-hosted, m2] + steps: + - name: Test ComfyUI Workflows + uses: comfy-org/comfy-action@main + with: + os: mac + models-json: '{"v1-5-pruned-emaonly.ckpt": {"url": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt", "directory": "checkpoints"}}' + workflow_filenames: "default.json" + gcs_bucket_name: 'comfy-ci-results' + google_credentials: ${{ secrets.GCS_SERVICE_ACCOUNT_JSON }} + output_prefix: 'ComfyUI' + conda_env_file: '.github/conda-environments/mac-environment.yml' + timeout: 50 + From 66aaa14001be9f7cf2b52f84c0dff588e36aabbf Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 25 Jun 2024 17:02:05 -0400 Subject: [PATCH 039/123] Controlnet refactor. --- comfy/cldm/cldm.py | 9 +++++---- comfy/controlnet.py | 35 ++++++++++----------------------- comfy/ldm/cascade/controlnet.py | 2 +- comfy/t2i_adapter/adapter.py | 10 ++++++++-- 4 files changed, 24 insertions(+), 32 deletions(-) diff --git a/comfy/cldm/cldm.py b/comfy/cldm/cldm.py index 28076dd92..f8a161594 100644 --- a/comfy/cldm/cldm.py +++ b/comfy/cldm/cldm.py @@ -289,7 +289,8 @@ class ControlNet(nn.Module): guided_hint = self.input_hint_block(hint, emb, context) - outs = [] + out_output = [] + out_middle = [] hs = [] if self.num_classes is not None: @@ -304,10 +305,10 @@ class ControlNet(nn.Module): guided_hint = None else: h = module(h, emb, context) - outs.append(zero_conv(h, emb, context)) + out_output.append(zero_conv(h, emb, context)) h = self.middle_block(h, emb, context) - outs.append(self.middle_block_out(h, emb, context)) + out_middle.append(self.middle_block_out(h, emb, context)) - return outs + return {"middle": out_middle, "output": out_output} diff --git a/comfy/controlnet.py b/comfy/controlnet.py index 8cf4a61a6..f50df6835 100644 --- a/comfy/controlnet.py +++ b/comfy/controlnet.py @@ -89,27 +89,12 @@ class ControlBase: return self.previous_controlnet.inference_memory_requirements(dtype) return 0 - def control_merge(self, control_input, control_output, control_prev, output_dtype): + def control_merge(self, control, control_prev, output_dtype): out = {'input':[], 'middle':[], 'output': []} - if control_input is not None: - for i in range(len(control_input)): - key = 'input' - x = control_input[i] - if x is not None: - x *= self.strength - if x.dtype != output_dtype: - x = x.to(output_dtype) - out[key].insert(0, x) - - if control_output is not None: + for key in control: + control_output = control[key] for i in range(len(control_output)): - if i == (len(control_output) - 1): - key = 'middle' - index = 0 - else: - key = 'output' - index = i x = control_output[i] if x is not None: if self.global_average_pooling: @@ -120,6 +105,7 @@ class ControlBase: x = x.to(output_dtype) out[key].append(x) + if control_prev is not None: for x in ['input', 'middle', 'output']: o = out[x] @@ -182,7 +168,7 @@ class ControlNet(ControlBase): x_noisy = self.model_sampling_current.calculate_input(t, x_noisy) control = self.control_model(x=x_noisy.to(dtype), hint=self.cond_hint, timesteps=timestep.float(), context=context.to(dtype), y=y) - return self.control_merge(None, control, control_prev, output_dtype) + return self.control_merge(control, control_prev, output_dtype) def copy(self): c = ControlNet(None, global_average_pooling=self.global_average_pooling, load_device=self.load_device, manual_cast_dtype=self.manual_cast_dtype) @@ -490,12 +476,11 @@ class T2IAdapter(ControlBase): self.control_input = self.t2i_model(self.cond_hint.to(x_noisy.dtype)) self.t2i_model.cpu() - control_input = list(map(lambda a: None if a is None else a.clone(), self.control_input)) - mid = None - if self.t2i_model.xl == True: - mid = control_input[-1:] - control_input = control_input[:-1] - return self.control_merge(control_input, mid, control_prev, x_noisy.dtype) + control_input = {} + for k in self.control_input: + control_input[k] = list(map(lambda a: None if a is None else a.clone(), self.control_input[k])) + + return self.control_merge(control_input, control_prev, x_noisy.dtype) def copy(self): c = T2IAdapter(self.t2i_model, self.channels_in, self.compression_ratio, self.upscale_algorithm) diff --git a/comfy/ldm/cascade/controlnet.py b/comfy/ldm/cascade/controlnet.py index 5dac59394..7a52c3c26 100644 --- a/comfy/ldm/cascade/controlnet.py +++ b/comfy/ldm/cascade/controlnet.py @@ -90,4 +90,4 @@ class ControlNet(nn.Module): proj_outputs = [None for _ in range(max(self.proj_blocks) + 1)] for i, idx in enumerate(self.proj_blocks): proj_outputs[idx] = self.projections[i](x) - return proj_outputs + return {"input": proj_outputs[::-1]} diff --git a/comfy/t2i_adapter/adapter.py b/comfy/t2i_adapter/adapter.py index e9a606b1c..10ea18e32 100644 --- a/comfy/t2i_adapter/adapter.py +++ b/comfy/t2i_adapter/adapter.py @@ -153,7 +153,13 @@ class Adapter(nn.Module): features.append(None) features.append(x) - return features + features = features[::-1] + + if self.xl: + return {"input": features[1:], "middle": features[:1]} + else: + return {"input": features} + class LayerNorm(nn.LayerNorm): @@ -290,4 +296,4 @@ class Adapter_light(nn.Module): features.append(None) features.append(x) - return features + return {"input": features[::-1]} From f8f7568d031a61f5d21ca0ed56ff56d7d83c9115 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 25 Jun 2024 23:40:44 -0400 Subject: [PATCH 040/123] Basic SD3 controlnet implementation. Still missing the node to properly use it. --- comfy/cldm/mmdit.py | 91 +++++++++++++++++++++ comfy/controlnet.py | 45 +++++++++- comfy/ldm/modules/diffusionmodules/mmdit.py | 30 +++++-- comfy/model_detection.py | 11 ++- comfy/utils.py | 3 +- 5 files changed, 165 insertions(+), 15 deletions(-) create mode 100644 comfy/cldm/mmdit.py diff --git a/comfy/cldm/mmdit.py b/comfy/cldm/mmdit.py new file mode 100644 index 000000000..6e72474ce --- /dev/null +++ b/comfy/cldm/mmdit.py @@ -0,0 +1,91 @@ +import torch +from typing import Dict, Optional +import comfy.ldm.modules.diffusionmodules.mmdit +import comfy.latent_formats + +class ControlNet(comfy.ldm.modules.diffusionmodules.mmdit.MMDiT): + def __init__( + self, + num_blocks = None, + dtype = None, + device = None, + operations = None, + **kwargs, + ): + super().__init__(dtype=dtype, device=device, operations=operations, final_layer=False, num_blocks=num_blocks, **kwargs) + # controlnet_blocks + self.controlnet_blocks = torch.nn.ModuleList([]) + for _ in range(len(self.joint_blocks)): + self.controlnet_blocks.append(operations.Linear(self.hidden_size, self.hidden_size, device=device, dtype=dtype)) + + self.pos_embed_input = comfy.ldm.modules.diffusionmodules.mmdit.PatchEmbed( + None, + self.patch_size, + self.in_channels, + self.hidden_size, + bias=True, + strict_img_size=False, + dtype=dtype, + device=device, + operations=operations + ) + + self.latent_format = comfy.latent_formats.SD3() + + def forward( + self, + x: torch.Tensor, + timesteps: torch.Tensor, + y: Optional[torch.Tensor] = None, + context: Optional[torch.Tensor] = None, + hint = None, + ) -> torch.Tensor: + + #weird sd3 controlnet specific stuff + hint = hint * self.latent_format.scale_factor # self.latent_format.process_in(hint) + y = torch.zeros_like(y) + + + if self.context_processor is not None: + context = self.context_processor(context) + + hw = x.shape[-2:] + x = self.x_embedder(x) + self.cropped_pos_embed(hw, device=x.device).to(dtype=x.dtype, device=x.device) + x += self.pos_embed_input(hint) + + c = self.t_embedder(timesteps, dtype=x.dtype) + if y is not None and self.y_embedder is not None: + y = self.y_embedder(y) + c = c + y + + if context is not None: + context = self.context_embedder(context) + + if self.register_length > 0: + context = torch.cat( + ( + repeat(self.register, "1 ... -> b ...", b=x.shape[0]), + default(context, torch.Tensor([]).type_as(x)), + ), + 1, + ) + + output = [] + + blocks = len(self.joint_blocks) + for i in range(blocks): + context, x = self.joint_blocks[i]( + context, + x, + c=c, + use_checkpoint=self.use_checkpoint, + ) + + out = self.controlnet_blocks[i](x) + count = self.depth // blocks + if i == blocks - 1: + count -= 1 + for j in range(count): + output.append(out) + + return {"output": output} diff --git a/comfy/controlnet.py b/comfy/controlnet.py index f50df6835..9202c3194 100644 --- a/comfy/controlnet.py +++ b/comfy/controlnet.py @@ -11,6 +11,7 @@ import comfy.ops import comfy.cldm.cldm import comfy.t2i_adapter.adapter import comfy.ldm.cascade.controlnet +import comfy.cldm.mmdit def broadcast_image_to(tensor, target_batch_size, batched_number): @@ -94,13 +95,17 @@ class ControlBase: for key in control: control_output = control[key] + applied_to = set() for i in range(len(control_output)): x = control_output[i] if x is not None: if self.global_average_pooling: x = torch.mean(x, dim=(2, 3), keepdim=True).repeat(1, 1, x.shape[2], x.shape[3]) - x *= self.strength + if x not in applied_to: #memory saving strategy, allow shared tensors and only apply strength to shared tensors once + applied_to.add(x) + x *= self.strength + if x.dtype != output_dtype: x = x.to(output_dtype) @@ -120,17 +125,18 @@ class ControlBase: if o[i].shape[0] < prev_val.shape[0]: o[i] = prev_val + o[i] else: - o[i] += prev_val + o[i] = prev_val + o[i] #TODO: change back to inplace add if shared tensors stop being an issue return out class ControlNet(ControlBase): - def __init__(self, control_model=None, global_average_pooling=False, device=None, load_device=None, manual_cast_dtype=None): + def __init__(self, control_model=None, global_average_pooling=False, compression_ratio=8, device=None, load_device=None, manual_cast_dtype=None): super().__init__(device) self.control_model = control_model self.load_device = load_device if control_model is not None: self.control_model_wrapped = comfy.model_patcher.ModelPatcher(self.control_model, load_device=load_device, offload_device=comfy.model_management.unet_offload_device()) + self.compression_ratio = compression_ratio self.global_average_pooling = global_average_pooling self.model_sampling_current = None self.manual_cast_dtype = manual_cast_dtype @@ -308,6 +314,37 @@ class ControlLora(ControlNet): def inference_memory_requirements(self, dtype): return comfy.utils.calculate_parameters(self.control_weights) * comfy.model_management.dtype_size(dtype) + ControlBase.inference_memory_requirements(self, dtype) +def load_controlnet_mmdit(sd): + new_sd = comfy.model_detection.convert_diffusers_mmdit(sd, "") + model_config = comfy.model_detection.model_config_from_unet(new_sd, "", True) + num_blocks = comfy.model_detection.count_blocks(new_sd, 'joint_blocks.{}.') + for k in sd: + new_sd[k] = sd[k] + + supported_inference_dtypes = model_config.supported_inference_dtypes + + controlnet_config = model_config.unet_config + unet_dtype = comfy.model_management.unet_dtype(supported_dtypes=supported_inference_dtypes) + load_device = comfy.model_management.get_torch_device() + manual_cast_dtype = comfy.model_management.unet_manual_cast(unet_dtype, load_device) + if manual_cast_dtype is not None: + operations = comfy.ops.manual_cast + else: + operations = comfy.ops.disable_weight_init + + control_model = comfy.cldm.mmdit.ControlNet(num_blocks=num_blocks, operations=operations, device=load_device, dtype=unet_dtype, **controlnet_config) + missing, unexpected = control_model.load_state_dict(new_sd, strict=False) + + if len(missing) > 0: + logging.warning("missing controlnet keys: {}".format(missing)) + + if len(unexpected) > 0: + logging.debug("unexpected controlnet keys: {}".format(unexpected)) + + control = ControlNet(control_model, compression_ratio=1, load_device=load_device, manual_cast_dtype=manual_cast_dtype) + return control + + def load_controlnet(ckpt_path, model=None): controlnet_data = comfy.utils.load_torch_file(ckpt_path, safe_load=True) if "lora_controlnet" in controlnet_data: @@ -360,6 +397,8 @@ def load_controlnet(ckpt_path, model=None): if len(leftover_keys) > 0: logging.warning("leftover keys: {}".format(leftover_keys)) controlnet_data = new_sd + elif "controlnet_blocks.0.weight" in controlnet_data: #SD3 diffusers format + return load_controlnet_mmdit(controlnet_data) pth_key = 'control_model.zero_convs.0.0.weight' pth = False diff --git a/comfy/ldm/modules/diffusionmodules/mmdit.py b/comfy/ldm/modules/diffusionmodules/mmdit.py index 20d3a321a..927451534 100644 --- a/comfy/ldm/modules/diffusionmodules/mmdit.py +++ b/comfy/ldm/modules/diffusionmodules/mmdit.py @@ -745,6 +745,8 @@ class MMDiT(nn.Module): qkv_bias: bool = True, context_processor_layers = None, context_size = 4096, + num_blocks = None, + final_layer = True, dtype = None, #TODO device = None, operations = None, @@ -766,7 +768,10 @@ class MMDiT(nn.Module): # apply magic --> this defines a head_size of 64 self.hidden_size = 64 * depth num_heads = depth + if num_blocks is None: + num_blocks = depth + self.depth = depth self.num_heads = num_heads self.x_embedder = PatchEmbed( @@ -821,7 +826,7 @@ class MMDiT(nn.Module): mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, attn_mode=attn_mode, - pre_only=i == depth - 1, + pre_only=(i == num_blocks - 1) and final_layer, rmsnorm=rmsnorm, scale_mod_only=scale_mod_only, swiglu=swiglu, @@ -830,11 +835,12 @@ class MMDiT(nn.Module): device=device, operations=operations ) - for i in range(depth) + for i in range(num_blocks) ] ) - self.final_layer = FinalLayer(self.hidden_size, patch_size, self.out_channels, dtype=dtype, device=device, operations=operations) + if final_layer: + self.final_layer = FinalLayer(self.hidden_size, patch_size, self.out_channels, dtype=dtype, device=device, operations=operations) if compile_core: assert False @@ -893,6 +899,7 @@ class MMDiT(nn.Module): x: torch.Tensor, c_mod: torch.Tensor, context: Optional[torch.Tensor] = None, + control = None, ) -> torch.Tensor: if self.register_length > 0: context = torch.cat( @@ -905,13 +912,20 @@ class MMDiT(nn.Module): # context is B, L', D # x is B, L, D - for block in self.joint_blocks: - context, x = block( + blocks = len(self.joint_blocks) + for i in range(blocks): + context, x = self.joint_blocks[i]( context, x, c=c_mod, use_checkpoint=self.use_checkpoint, ) + if control is not None: + control_o = control.get("output") + if i < len(control_o): + add = control_o[i] + if add is not None: + x += add x = self.final_layer(x, c_mod) # (N, T, patch_size ** 2 * out_channels) return x @@ -922,6 +936,7 @@ class MMDiT(nn.Module): t: torch.Tensor, y: Optional[torch.Tensor] = None, context: Optional[torch.Tensor] = None, + control = None, ) -> torch.Tensor: """ Forward pass of DiT. @@ -943,7 +958,7 @@ class MMDiT(nn.Module): if context is not None: context = self.context_embedder(context) - x = self.forward_core_with_concat(x, c, context) + x = self.forward_core_with_concat(x, c, context, control) x = self.unpatchify(x, hw=hw) # (N, out_channels, H, W) return x[:,:,:hw[-2],:hw[-1]] @@ -956,7 +971,8 @@ class OpenAISignatureMMDITWrapper(MMDiT): timesteps: torch.Tensor, context: Optional[torch.Tensor] = None, y: Optional[torch.Tensor] = None, + control = None, **kwargs, ) -> torch.Tensor: - return super().forward(x, timesteps, context=context, y=y) + return super().forward(x, timesteps, context=context, y=y, control=control) diff --git a/comfy/model_detection.py b/comfy/model_detection.py index e09dd381a..0b678480f 100644 --- a/comfy/model_detection.py +++ b/comfy/model_detection.py @@ -41,7 +41,9 @@ def detect_unet_config(state_dict, key_prefix): unet_config["in_channels"] = state_dict['{}x_embedder.proj.weight'.format(key_prefix)].shape[1] patch_size = state_dict['{}x_embedder.proj.weight'.format(key_prefix)].shape[2] unet_config["patch_size"] = patch_size - unet_config["out_channels"] = state_dict['{}final_layer.linear.weight'.format(key_prefix)].shape[0] // (patch_size * patch_size) + final_layer = '{}final_layer.linear.weight'.format(key_prefix) + if final_layer in state_dict: + unet_config["out_channels"] = state_dict[final_layer].shape[0] // (patch_size * patch_size) unet_config["depth"] = state_dict['{}x_embedder.proj.weight'.format(key_prefix)].shape[0] // 64 unet_config["input_size"] = None @@ -435,10 +437,11 @@ def model_config_from_diffusers_unet(state_dict): return None def convert_diffusers_mmdit(state_dict, output_prefix=""): - depth = count_blocks(state_dict, 'transformer_blocks.{}.') - if depth > 0: + num_blocks = count_blocks(state_dict, 'transformer_blocks.{}.') + if num_blocks > 0: + depth = state_dict["pos_embed.proj.weight"].shape[0] // 64 out_sd = {} - sd_map = comfy.utils.mmdit_to_diffusers({"depth": depth}, output_prefix=output_prefix) + sd_map = comfy.utils.mmdit_to_diffusers({"depth": depth, "num_blocks": num_blocks}, output_prefix=output_prefix) for k in sd_map: weight = state_dict.get(k, None) if weight is not None: diff --git a/comfy/utils.py b/comfy/utils.py index ed6c58a64..48618e076 100644 --- a/comfy/utils.py +++ b/comfy/utils.py @@ -298,7 +298,8 @@ def mmdit_to_diffusers(mmdit_config, output_prefix=""): key_map = {} depth = mmdit_config.get("depth", 0) - for i in range(depth): + num_blocks = mmdit_config.get("num_blocks", depth) + for i in range(num_blocks): block_from = "transformer_blocks.{}".format(i) block_to = "{}joint_blocks.{}".format(output_prefix, i) From 264caca20e1e051f3bcbec59d7209513ea99d4ed Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 26 Jun 2024 16:14:47 -0400 Subject: [PATCH 041/123] ControlNetApplySD3 node can now be used to use SD3 controlnets. --- comfy/cldm/mmdit.py | 5 ----- comfy/controlnet.py | 28 ++++++++++++++++++++++++---- comfy_extras/nodes_sd3.py | 15 +++++++++++++++ nodes.py | 4 ++-- 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/comfy/cldm/mmdit.py b/comfy/cldm/mmdit.py index 6e72474ce..ee0282bc7 100644 --- a/comfy/cldm/mmdit.py +++ b/comfy/cldm/mmdit.py @@ -1,7 +1,6 @@ import torch from typing import Dict, Optional import comfy.ldm.modules.diffusionmodules.mmdit -import comfy.latent_formats class ControlNet(comfy.ldm.modules.diffusionmodules.mmdit.MMDiT): def __init__( @@ -30,8 +29,6 @@ class ControlNet(comfy.ldm.modules.diffusionmodules.mmdit.MMDiT): operations=operations ) - self.latent_format = comfy.latent_formats.SD3() - def forward( self, x: torch.Tensor, @@ -42,10 +39,8 @@ class ControlNet(comfy.ldm.modules.diffusionmodules.mmdit.MMDiT): ) -> torch.Tensor: #weird sd3 controlnet specific stuff - hint = hint * self.latent_format.scale_factor # self.latent_format.process_in(hint) y = torch.zeros_like(y) - if self.context_processor is not None: context = self.context_processor(context) diff --git a/comfy/controlnet.py b/comfy/controlnet.py index 9202c3194..d00395139 100644 --- a/comfy/controlnet.py +++ b/comfy/controlnet.py @@ -7,6 +7,7 @@ import comfy.model_management import comfy.model_detection import comfy.model_patcher import comfy.ops +import comfy.latent_formats import comfy.cldm.cldm import comfy.t2i_adapter.adapter @@ -38,6 +39,8 @@ class ControlBase: self.cond_hint = None self.strength = 1.0 self.timestep_percent_range = (0.0, 1.0) + self.latent_format = None + self.vae = None self.global_average_pooling = False self.timestep_range = None self.compression_ratio = 8 @@ -48,10 +51,12 @@ class ControlBase: self.device = device self.previous_controlnet = None - def set_cond_hint(self, cond_hint, strength=1.0, timestep_percent_range=(0.0, 1.0)): + def set_cond_hint(self, cond_hint, strength=1.0, timestep_percent_range=(0.0, 1.0), vae=None): self.cond_hint_original = cond_hint self.strength = strength self.timestep_percent_range = timestep_percent_range + if self.latent_format is not None: + self.vae = vae return self def pre_run(self, model, percent_to_timestep_function): @@ -84,6 +89,8 @@ class ControlBase: c.global_average_pooling = self.global_average_pooling c.compression_ratio = self.compression_ratio c.upscale_algorithm = self.upscale_algorithm + c.latent_format = self.latent_format + c.vae = self.vae def inference_memory_requirements(self, dtype): if self.previous_controlnet is not None: @@ -129,7 +136,7 @@ class ControlBase: return out class ControlNet(ControlBase): - def __init__(self, control_model=None, global_average_pooling=False, compression_ratio=8, device=None, load_device=None, manual_cast_dtype=None): + def __init__(self, control_model=None, global_average_pooling=False, compression_ratio=8, latent_format=None, device=None, load_device=None, manual_cast_dtype=None): super().__init__(device) self.control_model = control_model self.load_device = load_device @@ -140,6 +147,7 @@ class ControlNet(ControlBase): self.global_average_pooling = global_average_pooling self.model_sampling_current = None self.manual_cast_dtype = manual_cast_dtype + self.latent_format = latent_format def get_control(self, x_noisy, t, cond, batched_number): control_prev = None @@ -162,7 +170,17 @@ class ControlNet(ControlBase): if self.cond_hint is not None: del self.cond_hint self.cond_hint = None - self.cond_hint = comfy.utils.common_upscale(self.cond_hint_original, x_noisy.shape[3] * self.compression_ratio, x_noisy.shape[2] * self.compression_ratio, self.upscale_algorithm, "center").to(dtype).to(self.device) + compression_ratio = self.compression_ratio + if self.vae is not None: + compression_ratio *= self.vae.downscale_ratio + self.cond_hint = comfy.utils.common_upscale(self.cond_hint_original, x_noisy.shape[3] * compression_ratio, x_noisy.shape[2] * compression_ratio, self.upscale_algorithm, "center") + if self.vae is not None: + loaded_models = comfy.model_management.loaded_models(only_currently_used=True) + self.cond_hint = self.vae.encode(self.cond_hint.movedim(1, -1)) + comfy.model_management.load_models_gpu(loaded_models) + if self.latent_format is not None: + self.cond_hint = self.latent_format.process_in(self.cond_hint) + self.cond_hint = self.cond_hint.to(device=self.device, dtype=dtype) if x_noisy.shape[0] != self.cond_hint.shape[0]: self.cond_hint = broadcast_image_to(self.cond_hint, x_noisy.shape[0], batched_number) @@ -341,7 +359,9 @@ def load_controlnet_mmdit(sd): if len(unexpected) > 0: logging.debug("unexpected controlnet keys: {}".format(unexpected)) - control = ControlNet(control_model, compression_ratio=1, load_device=load_device, manual_cast_dtype=manual_cast_dtype) + latent_format = comfy.latent_formats.SD3() + latent_format.shift_factor = 0 #SD3 controlnet weirdness + control = ControlNet(control_model, compression_ratio=1, latent_format=latent_format, load_device=load_device, manual_cast_dtype=manual_cast_dtype) return control diff --git a/comfy_extras/nodes_sd3.py b/comfy_extras/nodes_sd3.py index d0303aec5..548b1ad6a 100644 --- a/comfy_extras/nodes_sd3.py +++ b/comfy_extras/nodes_sd3.py @@ -80,8 +80,23 @@ class CLIPTextEncodeSD3: return ([[cond, {"pooled_output": pooled}]], ) +class ControlNetApplySD3(nodes.ControlNetApplyAdvanced): + @classmethod + def INPUT_TYPES(s): + return {"required": {"positive": ("CONDITIONING", ), + "negative": ("CONDITIONING", ), + "control_net": ("CONTROL_NET", ), + "vae": ("VAE", ), + "image": ("IMAGE", ), + "strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.01}), + "start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), + "end_percent": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001}) + }} + CATEGORY = "_for_testing/sd3" + NODE_CLASS_MAPPINGS = { "TripleCLIPLoader": TripleCLIPLoader, "EmptySD3LatentImage": EmptySD3LatentImage, "CLIPTextEncodeSD3": CLIPTextEncodeSD3, + "ControlNetApplySD3": ControlNetApplySD3, } diff --git a/nodes.py b/nodes.py index 99645b81c..04775d290 100644 --- a/nodes.py +++ b/nodes.py @@ -783,7 +783,7 @@ class ControlNetApplyAdvanced: CATEGORY = "conditioning" - def apply_controlnet(self, positive, negative, control_net, image, strength, start_percent, end_percent): + def apply_controlnet(self, positive, negative, control_net, image, strength, start_percent, end_percent, vae=None): if strength == 0: return (positive, negative) @@ -800,7 +800,7 @@ class ControlNetApplyAdvanced: if prev_cnet in cnets: c_net = cnets[prev_cnet] else: - c_net = control_net.copy().set_cond_hint(control_hint, strength, (start_percent, end_percent)) + c_net = control_net.copy().set_cond_hint(control_hint, strength, (start_percent, end_percent), vae) c_net.set_previous_controlnet(prev_cnet) cnets[prev_cnet] = c_net From 0d9009c96ea5a1922a1c187deef27c7f133ee946 Mon Sep 17 00:00:00 2001 From: pythongosssss <125205205+pythongosssss@users.noreply.github.com> Date: Fri, 28 Jun 2024 06:07:19 +0100 Subject: [PATCH 042/123] New menu/workflows fixes (#3900) * Fix auto queue * Detect added nodes via search * Fix loading workflows * Add button click style --- web/scripts/changeTracker.js | 12 +++++++++++- web/scripts/ui/menu/menu.css | 4 ++++ web/scripts/ui/menu/queueButton.js | 4 ++-- web/scripts/workflows.js | 4 ++-- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/web/scripts/changeTracker.js b/web/scripts/changeTracker.js index 59901d5fc..041c83122 100644 --- a/web/scripts/changeTracker.js +++ b/web/scripts/changeTracker.js @@ -3,7 +3,6 @@ import { api } from "./api.js"; import { clone } from "./utils.js"; - export class ChangeTracker { static MAX_HISTORY = 50; #app; @@ -170,6 +169,17 @@ export class ChangeTracker { return v; }; + // Detects nodes being added via the node search dialog + const onNodeAdded = LiteGraph.LGraph.prototype.onNodeAdded; + LiteGraph.LGraph.prototype.onNodeAdded = function () { + const v = onNodeAdded?.apply(this, arguments); + const ct = changeTracker(); + if (!ct.isOurLoad) { + ct.checkState(); + } + return v; + }; + // Store node outputs api.addEventListener("executed", ({ detail }) => { const prompt = app.workflowManager.queuedPrompts[detail.prompt_id]; diff --git a/web/scripts/ui/menu/menu.css b/web/scripts/ui/menu/menu.css index 20eeab2cf..afaed3fb0 100644 --- a/web/scripts/ui/menu/menu.css +++ b/web/scripts/ui/menu/menu.css @@ -19,8 +19,12 @@ padding: 4px 8px; box-sizing: border-box; margin: 0; + transition: box-shadow 0.1s; } +.comfyui-button:active { + box-shadow: inset 1px 1px 10px rgba(0, 0, 0, 0.5); +} .comfyui-button:disabled { opacity: 0.5; cursor: not-allowed; diff --git a/web/scripts/ui/menu/queueButton.js b/web/scripts/ui/menu/queueButton.js index 3c29ab090..608f4cc9b 100644 --- a/web/scripts/ui/menu/queueButton.js +++ b/web/scripts/ui/menu/queueButton.js @@ -13,8 +13,8 @@ export class ComfyQueueButton { queuePrompt = async (e) => { this.#internalQueueSize += this.queueOptions.batchCount; - // Hold shift to queue front - await this.app.queuePrompt(-e.shiftKey, this.queueOptions.batchCount); + // Hold shift to queue front, event is undefined when auto-queue is enabled + await this.app.queuePrompt(e?.shiftKey ? -1 : 0, this.queueOptions.batchCount); }; constructor(app) { diff --git a/web/scripts/workflows.js b/web/scripts/workflows.js index 16bbc9976..d38b6f5fc 100644 --- a/web/scripts/workflows.js +++ b/web/scripts/workflows.js @@ -301,11 +301,11 @@ export class ComfyWorkflow { load = async () => { if (this.isOpen) { - await this.manager.app.loadGraphData(this.changeTracker.activeState, true, this); + await this.manager.app.loadGraphData(this.changeTracker.activeState, true, true, this); } else { const data = await this.getWorkflowData(); if (!data) return; - await this.manager.app.loadGraphData(data, true, this); + await this.manager.app.loadGraphData(data, true, true, this); } }; From 7ecb2ec1699dc988f93188c04733eeb8a41e8196 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Fri, 28 Jun 2024 02:55:36 -0400 Subject: [PATCH 043/123] Audio second setting in EmptyLatentAudio. --- comfy_extras/nodes_audio.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/comfy_extras/nodes_audio.py b/comfy_extras/nodes_audio.py index 34bcfa96d..6481ed3ba 100644 --- a/comfy_extras/nodes_audio.py +++ b/comfy_extras/nodes_audio.py @@ -14,15 +14,16 @@ class EmptyLatentAudio: @classmethod def INPUT_TYPES(s): - return {"required": {}} + return {"required": {"seconds": ("FLOAT", {"default": 47.6, "min": 1.0, "max": 1000.0, "step": 0.1})}} RETURN_TYPES = ("LATENT",) FUNCTION = "generate" CATEGORY = "_for_testing/audio" - def generate(self): + def generate(self, seconds): batch_size = 1 - latent = torch.zeros([batch_size, 64, 1024], device=self.device) + length = round((seconds * 44100 / 2048) / 2) * 2 + latent = torch.zeros([batch_size, 64, length], device=self.device) return ({"samples":latent, "type": "audio"}, ) class VAEEncodeAudio: From 02cac1d48783725d5994d37ed03e9f3dc32ec504 Mon Sep 17 00:00:00 2001 From: Robin Huang Date: Fri, 28 Jun 2024 13:09:39 -0700 Subject: [PATCH 044/123] Revert "Add macOs integration test for default workflow. (#3898)" (#3904) This reverts commit 97b409cd486b1a3b1114ae204802c81f3727d1a2. --- .../conda-environments/mac-environment.yml | 26 ---------- .github/workflows/mac-integration-test.yml | 50 ------------------- 2 files changed, 76 deletions(-) delete mode 100644 .github/conda-environments/mac-environment.yml delete mode 100644 .github/workflows/mac-integration-test.yml diff --git a/.github/conda-environments/mac-environment.yml b/.github/conda-environments/mac-environment.yml deleted file mode 100644 index 33832b854..000000000 --- a/.github/conda-environments/mac-environment.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: comfyui -channels: - - pytorch-nightly - - defaults -dependencies: - - python>=3.9 - - pytorch-nightly::pytorch - - torchvision - - torchaudio - - pip: - - pip - # comfyui requirements - - einops - - transformers>=4.25.1 - - safetensors>=0.4.2 - - aiohttp - - pyyaml - - Pillow - - scipy - - tqdm - - psutil - # comfy-action requirements - - requests - - google-cloud-storage - - comfy-cli - - charset-normalizer diff --git a/.github/workflows/mac-integration-test.yml b/.github/workflows/mac-integration-test.yml deleted file mode 100644 index 6a0482b1b..000000000 --- a/.github/workflows/mac-integration-test.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: (macOS) ComfyUI Integration Tests -on: - push: - branches: - - master - paths-ignore: - - 'app/**' - - 'input/**' - - 'output/**' - - 'model/**' - - 'notebook/**' - - 'script_example/**' - - 'tests/**' - - 'tests-ui/**' - - '.github/**' - - '.ci/**' - - 'web/**' - workflow_dispatch: - pull_request: - branches: - - master - paths-ignore: - - 'app/**' - - 'input/**' - - 'output/**' - - 'model/**' - - 'notebook/**' - - 'script_example/**' - - 'tests/**' - - 'tests-ui/**' - - '.github/**' - - '.ci/**' - - 'web/**' - -jobs: - test-workflows: - runs-on: [self-hosted, m2] - steps: - - name: Test ComfyUI Workflows - uses: comfy-org/comfy-action@main - with: - os: mac - models-json: '{"v1-5-pruned-emaonly.ckpt": {"url": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt", "directory": "checkpoints"}}' - workflow_filenames: "default.json" - gcs_bucket_name: 'comfy-ci-results' - google_credentials: ${{ secrets.GCS_SERVICE_ACCOUNT_JSON }} - output_prefix: 'ComfyUI' - conda_env_file: '.github/conda-environments/mac-environment.yml' - timeout: 50 - From c39cf7fff09c728d573835a48106e2133c446e11 Mon Sep 17 00:00:00 2001 From: Robin Huang Date: Fri, 28 Jun 2024 13:09:55 -0700 Subject: [PATCH 045/123] Revert "Add integration test for Linux with Nvidia GPU. #3884 (#3895)" (#3905) This reverts commit 449bf52923896236ed645da2ff05aadbf2b0d536. --- .../conda-environments/linux-environment.yml | 28 ----------- .github/workflows/linux-integration-test.yml | 50 ------------------- 2 files changed, 78 deletions(-) delete mode 100644 .github/conda-environments/linux-environment.yml delete mode 100644 .github/workflows/linux-integration-test.yml diff --git a/.github/conda-environments/linux-environment.yml b/.github/conda-environments/linux-environment.yml deleted file mode 100644 index c9ebd6406..000000000 --- a/.github/conda-environments/linux-environment.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: comfyui -channels: - - pytorch - - nvidia - - defaults -dependencies: - - python>=3.9 - - pip - - pytorch - - torchvision - - torchaudio - - pytorch-cuda=12.1 - - pip: - # comfyui requirements - - einops - - transformers>=4.25.1 - - safetensors>=0.4.2 - - aiohttp - - pyyaml - - Pillow - - scipy - - tqdm - - psutil - # comfy-action requirements - - requests - - google-cloud-storage - - comfy-cli - - charset-normalizer \ No newline at end of file diff --git a/.github/workflows/linux-integration-test.yml b/.github/workflows/linux-integration-test.yml deleted file mode 100644 index eed84a77c..000000000 --- a/.github/workflows/linux-integration-test.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: (Linux) ComfyUI Integration Tests -on: - push: - branches: - - master - paths-ignore: - - 'app/**' - - 'input/**' - - 'output/**' - - 'model/**' - - 'notebook/**' - - 'script_example/**' - - 'tests/**' - - 'tests-ui/**' - - '.github/**' - - '.ci/**' - - 'web/**' - workflow_dispatch: - pull_request: - branches: - - master - paths-ignore: - - 'app/**' - - 'input/**' - - 'output/**' - - 'model/**' - - 'notebook/**' - - 'script_example/**' - - 'tests/**' - - 'tests-ui/**' - - '.github/**' - - '.ci/**' - - 'web/**' - -jobs: - test-workflows: - runs-on: [self-hosted, Linux, t4] - steps: - - name: Test ComfyUI Workflows - uses: comfy-org/comfy-action@main - with: - os: linux - cuda_version: 12.1 - models-json: '{"v1-5-pruned-emaonly.ckpt": {"url": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt", "directory": "checkpoints"}}' - workflow_filenames: "default.json" - gcs_bucket_name: 'comfy-ci-results' - google_credentials: ${{ secrets.GCS_SERVICE_ACCOUNT_JSON }} - output_prefix: 'ComfyUI' - conda_env_file: '.github/conda-environments/linux-environment.yml' - timeout: 50 From fbb7a1f1b663b170d49718590aa1cb4093586f20 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sat, 29 Jun 2024 01:33:22 -0400 Subject: [PATCH 046/123] PreviewAudio node. --- comfy_extras/nodes_audio.py | 16 +++++++++++++++- web/extensions/core/uploadAudio.js | 6 +++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/comfy_extras/nodes_audio.py b/comfy_extras/nodes_audio.py index 6481ed3ba..9950d58ed 100644 --- a/comfy_extras/nodes_audio.py +++ b/comfy_extras/nodes_audio.py @@ -6,6 +6,7 @@ import os import io import json import struct +import random from comfy.cli_args import args class EmptyLatentAudio: @@ -118,7 +119,6 @@ class SaveAudio: self.output_dir = folder_paths.get_output_directory() self.type = "output" self.prefix_append = "" - self.compress_level = 4 @classmethod def INPUT_TYPES(s): @@ -168,6 +168,19 @@ class SaveAudio: return { "ui": { "audio": results } } +class PreviewAudio(SaveAudio): + def __init__(self): + self.output_dir = folder_paths.get_temp_directory() + self.type = "temp" + self.prefix_append = "_temp_" + ''.join(random.choice("abcdefghijklmnopqrstupvxyz") for x in range(5)) + + @classmethod + def INPUT_TYPES(s): + return {"required": + {"audio": ("AUDIO", ), }, + "hidden": {"prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"}, + } + class LoadAudio: SUPPORTED_FORMATS = ('.wav', '.mp3', '.ogg', '.flac', '.aiff', '.aif') @@ -214,4 +227,5 @@ NODE_CLASS_MAPPINGS = { "VAEDecodeAudio": VAEDecodeAudio, "SaveAudio": SaveAudio, "LoadAudio": LoadAudio, + "PreviewAudio": PreviewAudio, } diff --git a/web/extensions/core/uploadAudio.js b/web/extensions/core/uploadAudio.js index 12a2a196b..0ac9cb807 100644 --- a/web/extensions/core/uploadAudio.js +++ b/web/extensions/core/uploadAudio.js @@ -70,7 +70,7 @@ async function uploadFile( app.registerExtension({ name: "Comfy.AudioWidget", async beforeRegisterNodeDef(nodeType, nodeData) { - if (["LoadAudio", "SaveAudio"].includes(nodeType.comfyClass)) { + if (["LoadAudio", "SaveAudio", "PreviewAudio"].includes(nodeType.comfyClass)) { nodeData.input.required.audioUI = ["AUDIO_UI"] } }, @@ -103,7 +103,7 @@ app.registerExtension({ if (!audios) return const audio = audios[0] audioUIWidget.element.src = api.apiURL( - getResourceURL(audio.subfolder, audio.filename, "output") + getResourceURL(audio.subfolder, audio.filename, audio.type) ) audioUIWidget.element.classList.remove("empty-audio-widget") } @@ -118,7 +118,7 @@ app.registerExtension({ if ("audio" in output) { const audioUIWidget = node.widgets.find((w) => w.name === "audioUI"); const audio = output.audio[0]; - audioUIWidget.element.src = api.apiURL(getResourceURL(audio.subfolder, audio.filename, "output")); + audioUIWidget.element.src = api.apiURL(getResourceURL(audio.subfolder, audio.filename, audio.type)); audioUIWidget.element.classList.remove("empty-audio-widget"); } } From 05e831697a03984032863b2aa5d6443e422713e6 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sat, 29 Jun 2024 11:59:48 -0400 Subject: [PATCH 047/123] Switch to the real cfg++ method in the samplers. The old _pp ones will be updated automatically to the regular ones with 2x the cfg. My fault for not checking what the "_pp" samplers actually did. --- comfy/k_diffusion/sampling.py | 12 ++++++------ comfy/samplers.py | 2 +- web/scripts/app.js | 8 ++++++++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/comfy/k_diffusion/sampling.py b/comfy/k_diffusion/sampling.py index f8091bb3f..763d8cc78 100644 --- a/comfy/k_diffusion/sampling.py +++ b/comfy/k_diffusion/sampling.py @@ -998,7 +998,7 @@ def sample_deis(model, x, sigmas, extra_args=None, callback=None, disable=None, return x_next @torch.no_grad() -def sample_euler_pp(model, x, sigmas, extra_args=None, callback=None, disable=None): +def sample_euler_cfg_pp(model, x, sigmas, extra_args=None, callback=None, disable=None): extra_args = {} if extra_args is None else extra_args temp = [0] @@ -1013,16 +1013,16 @@ def sample_euler_pp(model, x, sigmas, extra_args=None, callback=None, disable=No for i in trange(len(sigmas) - 1, disable=disable): sigma_hat = sigmas[i] denoised = model(x, sigma_hat * s_in, **extra_args) - d = to_d(x - denoised + temp[0], sigma_hat, denoised) + d = to_d(x, sigma_hat, temp[0]) if callback is not None: callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigma_hat, 'denoised': denoised}) dt = sigmas[i + 1] - sigma_hat # Euler method - x = x + d * dt + x = denoised + d * sigmas[i + 1] return x @torch.no_grad() -def sample_euler_ancestral_pp(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None): +def sample_euler_ancestral_cfg_pp(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None): """Ancestral sampling with Euler method steps.""" extra_args = {} if extra_args is None else extra_args noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler @@ -1041,10 +1041,10 @@ def sample_euler_ancestral_pp(model, x, sigmas, extra_args=None, callback=None, sigma_down, sigma_up = get_ancestral_step(sigmas[i], sigmas[i + 1], eta=eta) if callback is not None: callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigmas[i], 'denoised': denoised}) - d = to_d(x - denoised + temp[0], sigmas[i], denoised) + d = to_d(x, sigmas[i], temp[0]) # Euler method dt = sigma_down - sigmas[i] - x = x + d * dt + x = denoised + d * sigma_down if sigmas[i + 1] > 0: x = x + noise_sampler(sigmas[i], sigmas[i + 1]) * s_noise * sigma_up return x diff --git a/comfy/samplers.py b/comfy/samplers.py index 7f7114dbb..c0aa12916 100644 --- a/comfy/samplers.py +++ b/comfy/samplers.py @@ -537,7 +537,7 @@ class Sampler: sigma = float(sigmas[0]) return math.isclose(max_sigma, sigma, rel_tol=1e-05) or sigma > max_sigma -KSAMPLER_NAMES = ["euler", "euler_pp", "euler_ancestral", "euler_ancestral_pp", "heun", "heunpp2","dpm_2", "dpm_2_ancestral", +KSAMPLER_NAMES = ["euler", "euler_cfg_pp", "euler_ancestral", "euler_ancestral_cfg_pp", "heun", "heunpp2","dpm_2", "dpm_2_ancestral", "lms", "dpm_fast", "dpm_adaptive", "dpmpp_2s_ancestral", "dpmpp_sde", "dpmpp_sde_gpu", "dpmpp_2m", "dpmpp_2m_sde", "dpmpp_2m_sde_gpu", "dpmpp_3m_sde", "dpmpp_3m_sde_gpu", "ddpm", "lcm", "ipndm", "ipndm_v", "deis"] diff --git a/web/scripts/app.js b/web/scripts/app.js index 43df61065..3a91aa239 100644 --- a/web/scripts/app.js +++ b/web/scripts/app.js @@ -1966,6 +1966,14 @@ export class ComfyApp { if (widget.value.startsWith("sample_")) { widget.value = widget.value.slice(7); } + if (widget.value === "euler_pp" || widget.value === "euler_ancestral_pp") { + widget.value = widget.value.slice(0, -3); + for (let w of node.widgets) { + if (w.name == "cfg") { + w.value *= 2.0; + } + } + } } } if (node.type == "KSampler" || node.type == "KSamplerAdvanced" || node.type == "PrimitiveNode") { From dbb7dd3b5eb6672e1141a5fc7006d3bee08b0d21 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sun, 30 Jun 2024 00:15:49 -0400 Subject: [PATCH 048/123] Add to readme that Stable Audio is supported. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a40dd07dd..2ce7c3e6b 100644 --- a/README.md +++ b/README.md @@ -11,16 +11,16 @@ This ui will let you design and execute advanced stable diffusion pipelines usin ## Features - Nodes/graph/flowchart interface to experiment and create complex Stable Diffusion workflows without needing to code anything. -- Fully supports SD1.x, SD2.x, [SDXL](https://comfyanonymous.github.io/ComfyUI_examples/sdxl/), [Stable Video Diffusion](https://comfyanonymous.github.io/ComfyUI_examples/video/), [Stable Cascade](https://comfyanonymous.github.io/ComfyUI_examples/stable_cascade/) and [SD3](https://comfyanonymous.github.io/ComfyUI_examples/sd3/) +- Fully supports SD1.x, SD2.x, [SDXL](https://comfyanonymous.github.io/ComfyUI_examples/sdxl/), [Stable Video Diffusion](https://comfyanonymous.github.io/ComfyUI_examples/video/), [Stable Cascade](https://comfyanonymous.github.io/ComfyUI_examples/stable_cascade/), [SD3](https://comfyanonymous.github.io/ComfyUI_examples/sd3/) and [Stable Audio](https://comfyanonymous.github.io/ComfyUI_examples/audio/) - Asynchronous Queue system - Many optimizations: Only re-executes the parts of the workflow that changes between executions. -- Command line option: ```--lowvram``` to make it work on GPUs with less than 3GB vram (enabled automatically on GPUs with low vram) +- Smart memory management: can automatically run models on GPUs with as low as 1GB vram. - Works even if you don't have a GPU with: ```--cpu``` (slow) - Can load ckpt, safetensors and diffusers models/checkpoints. Standalone VAEs and CLIP models. - Embeddings/Textual inversion - [Loras (regular, locon and loha)](https://comfyanonymous.github.io/ComfyUI_examples/lora/) - [Hypernetworks](https://comfyanonymous.github.io/ComfyUI_examples/hypernetworks/) -- Loading full workflows (with seeds) from generated PNG files. +- Loading full workflows (with seeds) from generated PNG, WebP and FLAC files. - Saving/Loading workflows as Json files. - Nodes interface can be used to create complex workflows like one for [Hires fix](https://comfyanonymous.github.io/ComfyUI_examples/2_pass_txt2img/) or much more advanced ones. - [Area Composition](https://comfyanonymous.github.io/ComfyUI_examples/area_composition/) From 521421f53ee1ba74304dfaa138b0f851093e1595 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sun, 30 Jun 2024 15:51:54 -0400 Subject: [PATCH 049/123] Fix workflow not importing from flac files on some systems. --- web/scripts/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/scripts/app.js b/web/scripts/app.js index 3a91aa239..776fc197a 100644 --- a/web/scripts/app.js +++ b/web/scripts/app.js @@ -2292,7 +2292,7 @@ export class ComfyApp { } else { this.showErrorOnFileLoad(file); } - } else if (file.type === "audio/flac") { + } else if (file.type === "audio/flac" || file.type === "audio/x-flac") { const pngInfo = await getFlacMetadata(file); // Support loading workflows from that webp custom node. const workflow = pngInfo?.workflow; From 7c5fa7f4a2046c1f4bb77ed5e480918ffb8a10aa Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Mon, 1 Jul 2024 12:10:44 -0400 Subject: [PATCH 050/123] Fix loadGraphData func call (#3918) --- web/scripts/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/scripts/app.js b/web/scripts/app.js index 776fc197a..b8889a4cf 100644 --- a/web/scripts/app.js +++ b/web/scripts/app.js @@ -2314,14 +2314,14 @@ export class ComfyApp { } else if(this.isApiJson(jsonContent)) { this.loadApiJson(jsonContent, fileName); } else { - await this.loadGraphData(jsonContent, true, fileName); + await this.loadGraphData(jsonContent, true, true, fileName); } }; reader.readAsText(file); } else if (file.name?.endsWith(".latent") || file.name?.endsWith(".safetensors")) { const info = await getLatentMetadata(file); if (info.workflow) { - await this.loadGraphData(JSON.parse(info.workflow), true, fileName); + await this.loadGraphData(JSON.parse(info.workflow), true, true, fileName); } else if (info.prompt) { this.loadApiJson(JSON.parse(info.prompt)); } else { From e53b1592ba8426e2c01cd9278bc19c2e4264065b Mon Sep 17 00:00:00 2001 From: ruucm Date: Mon, 1 Jul 2024 10:45:34 -0700 Subject: [PATCH 051/123] enable cmd shortcuts for mac (mute & bypass) (#3792) --- web/scripts/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/scripts/app.js b/web/scripts/app.js index b8889a4cf..67e488bf9 100644 --- a/web/scripts/app.js +++ b/web/scripts/app.js @@ -1084,7 +1084,7 @@ export class ComfyApp { if (e.type == "keydown" && !e.repeat) { // Ctrl + M mute/unmute - if (e.key === 'm' && e.ctrlKey) { + if (e.key === 'm' && (e.metaKey || e.ctrlKey)) { if (this.selected_nodes) { for (var i in this.selected_nodes) { if (this.selected_nodes[i].mode === 2) { // never @@ -1098,7 +1098,7 @@ export class ComfyApp { } // Ctrl + B bypass - if (e.key === 'b' && e.ctrlKey) { + if (e.key === 'b' && (e.metaKey || e.ctrlKey)) { if (this.selected_nodes) { for (var i in this.selected_nodes) { if (this.selected_nodes[i].mode === 4) { // never From 601b4b63e1c0af2deef8630449497b9e84aa00f8 Mon Sep 17 00:00:00 2001 From: Robin Huang Date: Mon, 1 Jul 2024 10:51:00 -0700 Subject: [PATCH 052/123] Add CONTRIBUTING.md (#3910) * Create CONTRIBUTING.md * Add feature-request channel link. * Remove discord links for channels. --- CONTRIBUTING.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..048f127e7 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,41 @@ +# Contributing to ComfyUI + +Welcome, and thank you for your interest in contributing to ComfyUI! + +There are several ways in which you can contribute, beyond writing code. The goal of this document is to provide a high-level overview of how you can get involved. + +## Asking Questions + +Have a question? Instead of opening an issue, please ask on [Discord](https://comfy.org/discord) or [Matrix](https://app.element.io/#/room/%23comfyui_space%3Amatrix.org) channels. Our team and the community will help you. + +## Providing Feedback + +Your comments and feedback are welcome, and the development team is available via a handful of different channels. + +See the `#bug-report`, `#feature-request` and `#feedback` channels on Discord. + +## Reporting Issues + +Have you identified a reproducible problem in ComfyUI? Do you have a feature request? We want to hear about it! Here's how you can report your issue as effectively as possible. + + +### Look For an Existing Issue + +Before you create a new issue, please do a search in [open issues](https://github.com/comfyanonymous/ComfyUI/issues) to see if the issue or feature request has already been filed. + +If you find your issue already exists, make relevant comments and add your [reaction](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments). Use a reaction in place of a "+1" comment: + +* 👍 - upvote +* 👎 - downvote + +If you cannot find an existing issue that describes your bug or feature, create a new issue. We have an issue template in place to organize new issues. + + +### Creating Pull Requests + +* Please refer to the article on [creating pull requests](https://github.com/comfyanonymous/ComfyUI/wiki/How-to-Contribute-Code) and contributing to this project. + + +## Thank You + +Your contributions to open source, large or small, make great projects like this possible. Thank you for taking the time to contribute. From 0cd4a6a5e5101172a1496c337e67f15ad266fb98 Mon Sep 17 00:00:00 2001 From: YAN Wenkun Date: Tue, 2 Jul 2024 05:15:49 +0800 Subject: [PATCH 053/123] Fine-tuning GitHub Actions (#3169) * Bumping GitHub Actions versions * Using LZMA2 for 7zip compression in Windows packaging --- .github/workflows/windows_release_dependencies.yml | 6 +++--- .github/workflows/windows_release_nightly_pytorch.yml | 4 ++-- .github/workflows/windows_release_package.yml | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/windows_release_dependencies.yml b/.github/workflows/windows_release_dependencies.yml index ffd3e2216..5aa57e7d7 100644 --- a/.github/workflows/windows_release_dependencies.yml +++ b/.github/workflows/windows_release_dependencies.yml @@ -33,8 +33,8 @@ jobs: build_dependencies: runs-on: windows-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 with: python-version: 3.${{ inputs.python_minor }}.${{ inputs.python_patch }} @@ -58,7 +58,7 @@ jobs: mv temp_wheel_dir cu${{ inputs.cu }}_python_deps tar cf cu${{ inputs.cu }}_python_deps.tar cu${{ inputs.cu }}_python_deps - - uses: actions/cache/save@v3 + - uses: actions/cache/save@v4 with: path: | cu${{ inputs.cu }}_python_deps.tar diff --git a/.github/workflows/windows_release_nightly_pytorch.yml b/.github/workflows/windows_release_nightly_pytorch.yml index fa24a985c..d27c56b30 100644 --- a/.github/workflows/windows_release_nightly_pytorch.yml +++ b/.github/workflows/windows_release_nightly_pytorch.yml @@ -32,11 +32,11 @@ jobs: pull-requests: "read" runs-on: windows-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 persist-credentials: false - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: 3.${{ inputs.python_minor }}.${{ inputs.python_patch }} - shell: bash diff --git a/.github/workflows/windows_release_package.yml b/.github/workflows/windows_release_package.yml index 4e3cdabd2..020741c41 100644 --- a/.github/workflows/windows_release_package.yml +++ b/.github/workflows/windows_release_package.yml @@ -32,7 +32,7 @@ jobs: pull-requests: "read" runs-on: windows-latest steps: - - uses: actions/cache/restore@v3 + - uses: actions/cache/restore@v4 id: cache with: path: | @@ -48,7 +48,7 @@ jobs: pwd ls - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 persist-credentials: false @@ -82,7 +82,7 @@ jobs: cd .. - "C:\Program Files\7-Zip\7z.exe" a -t7z -m0=lzma -mx=8 -mfb=64 -md=32m -ms=on -mf=BCJ2 ComfyUI_windows_portable.7z ComfyUI_windows_portable + "C:\Program Files\7-Zip\7z.exe" a -t7z -m0=lzma2 -mx=8 -mfb=64 -md=32m -ms=on -mf=BCJ2 ComfyUI_windows_portable.7z ComfyUI_windows_portable mv ComfyUI_windows_portable.7z ComfyUI/new_ComfyUI_windows_portable_nvidia_cu${{ inputs.cu }}_or_cpu.7z cd ComfyUI_windows_portable From 5dccfefe8d4ca9b33dfe6dfabcc6c666853c73b9 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Mon, 1 Jul 2024 17:17:25 -0400 Subject: [PATCH 054/123] Switch nightly pytorch standalone package to lzma2. --- .github/workflows/windows_release_nightly_pytorch.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/windows_release_nightly_pytorch.yml b/.github/workflows/windows_release_nightly_pytorch.yml index d27c56b30..e68011b64 100644 --- a/.github/workflows/windows_release_nightly_pytorch.yml +++ b/.github/workflows/windows_release_nightly_pytorch.yml @@ -73,7 +73,7 @@ jobs: pause" > ./update/update_comfyui_and_python_dependencies.bat cd .. - "C:\Program Files\7-Zip\7z.exe" a -t7z -m0=lzma -mx=8 -mfb=64 -md=32m -ms=on -mf=BCJ2 ComfyUI_windows_portable_nightly_pytorch.7z ComfyUI_windows_portable_nightly_pytorch + "C:\Program Files\7-Zip\7z.exe" a -t7z -m0=lzma2 -mx=8 -mfb=64 -md=32m -ms=on -mf=BCJ2 ComfyUI_windows_portable_nightly_pytorch.7z ComfyUI_windows_portable_nightly_pytorch mv ComfyUI_windows_portable_nightly_pytorch.7z ComfyUI/ComfyUI_windows_portable_nvidia_or_cpu_nightly_pytorch.7z cd ComfyUI_windows_portable_nightly_pytorch From 755c48d78ea2381b3554de729e36acfb381ebc67 Mon Sep 17 00:00:00 2001 From: Hayden Reeve <39004735+HaydenReeve@users.noreply.github.com> Date: Tue, 2 Jul 2024 05:21:12 +0800 Subject: [PATCH 055/123] Fix several typos in example_node.py.example (#3204) This change includes corrections for several spelling errors in the documentation of example_node.py.example file. These were previously raised by #3157, but they missed a few. --- custom_nodes/example_node.py.example | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/custom_nodes/example_node.py.example b/custom_nodes/example_node.py.example index f06632593..57c9cbedf 100644 --- a/custom_nodes/example_node.py.example +++ b/custom_nodes/example_node.py.example @@ -12,9 +12,9 @@ class Example: Attributes ---------- RETURN_TYPES (`tuple`): - The type of each element in the output tulple. + The type of each element in the output tuple. RETURN_NAMES (`tuple`): - Optional: The name of each output in the output tulple. + Optional: The name of each output in the output tuple. FUNCTION (`str`): The name of the entry-point method. For example, if `FUNCTION = "execute"` then it will run Example().execute() OUTPUT_NODE ([`bool`]): @@ -44,7 +44,7 @@ class Example: * Key field_name (`string`): Name of a entry-point method's argument * Value field_config (`tuple`): + First value is a string indicate the type of field or a list for selection. - + Secound value is a config for type "INT", "STRING" or "FLOAT". + + Second value is a config for type "INT", "STRING" or "FLOAT". """ return { "required": { @@ -61,7 +61,7 @@ class Example: "min": 0.0, "max": 10.0, "step": 0.01, - "round": 0.001, #The value represeting the precision to round to, will be set to the step value by default. Can be set to False to disable rounding. + "round": 0.001, #The value representing the precision to round to, will be set to the step value by default. Can be set to False to disable rounding. "display": "number"}), "print_to_screen": (["enable", "disable"],), "string_field": ("STRING", { From b82d67d5bfa9a1f8c6d0167bf871cbd151c1005f Mon Sep 17 00:00:00 2001 From: Peter Crabtree Date: Mon, 1 Jul 2024 17:42:17 -0400 Subject: [PATCH 056/123] Add SamplerEulerAncestralCFG++ custom sampler node (#3901) (for eta and s_noise) --- comfy_extras/nodes_custom_sampler.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/comfy_extras/nodes_custom_sampler.py b/comfy_extras/nodes_custom_sampler.py index 69f1b9418..64a8c0631 100644 --- a/comfy_extras/nodes_custom_sampler.py +++ b/comfy_extras/nodes_custom_sampler.py @@ -293,6 +293,25 @@ class SamplerEulerAncestral: sampler = comfy.samplers.ksampler("euler_ancestral", {"eta": eta, "s_noise": s_noise}) return (sampler, ) +class SamplerEulerAncestralCFGPP: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "eta": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step":0.01, "round": False}), + "s_noise": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step":0.01, "round": False}), + }} + RETURN_TYPES = ("SAMPLER",) + CATEGORY = "sampling/custom_sampling/samplers" + + FUNCTION = "get_sampler" + + def get_sampler(self, eta, s_noise): + sampler = comfy.samplers.ksampler( + "euler_ancestral_cfg_pp", + {"eta": eta, "s_noise": s_noise}) + return (sampler, ) + class SamplerLMS: @classmethod def INPUT_TYPES(s): @@ -622,6 +641,7 @@ NODE_CLASS_MAPPINGS = { "SDTurboScheduler": SDTurboScheduler, "KSamplerSelect": KSamplerSelect, "SamplerEulerAncestral": SamplerEulerAncestral, + "SamplerEulerAncestralCFGPP": SamplerEulerAncestralCFGPP, "SamplerLMS": SamplerLMS, "SamplerDPMPP_3M_SDE": SamplerDPMPP_3M_SDE, "SamplerDPMPP_2M_SDE": SamplerDPMPP_2M_SDE, @@ -639,3 +659,7 @@ NODE_CLASS_MAPPINGS = { "AddNoise": AddNoise, "SamplerCustomAdvanced": SamplerCustomAdvanced, } + +NODE_DISPLAY_NAME_MAPPINGS = { + "SamplerEulerAncestralCFGPP": "SamplerEulerAncestralCFG++", +} \ No newline at end of file From 9dd549e253f0e2c5e6360f9349b0872af18d8962 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Mon, 1 Jul 2024 17:54:03 -0400 Subject: [PATCH 057/123] Add `--no-custom-node` cmd flag (#3903) * Add --no-custom-node cmd flag * nit --- comfy/cli_args.py | 1 + folder_paths.py | 8 +++++--- main.py | 13 +++++++++++-- nodes.py | 24 ++++++++++++++++++++---- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/comfy/cli_args.py b/comfy/cli_args.py index fb0d37ce7..b72bf3998 100644 --- a/comfy/cli_args.py +++ b/comfy/cli_args.py @@ -118,6 +118,7 @@ parser.add_argument("--quick-test-for-ci", action="store_true", help="Quick test parser.add_argument("--windows-standalone-build", action="store_true", help="Windows standalone build: Enable convenient things that most people using the standalone windows build will probably enjoy (like auto opening the page on startup).") parser.add_argument("--disable-metadata", action="store_true", help="Disable saving prompt metadata in files.") +parser.add_argument("--disable-all-custom-nodes", action="store_true", help="Disable loading all custom nodes.") parser.add_argument("--multi-user", action="store_true", help="Enables per-user storage.") diff --git a/folder_paths.py b/folder_paths.py index 234b73409..2cf45f12a 100644 --- a/folder_paths.py +++ b/folder_paths.py @@ -2,9 +2,11 @@ import os import time import logging -supported_pt_extensions = set(['.ckpt', '.pt', '.bin', '.pth', '.safetensors', '.pkl']) +supported_pt_extensions: set[str] = set(['.ckpt', '.pt', '.bin', '.pth', '.safetensors', '.pkl']) -folder_names_and_paths = {} +SupportedFileExtensionsType = set[str] +ScanPathType = list[str] +folder_names_and_paths: dict[str, tuple[ScanPathType, SupportedFileExtensionsType]] = {} base_path = os.path.dirname(os.path.realpath(__file__)) models_dir = os.path.join(base_path, "models") @@ -26,7 +28,7 @@ folder_names_and_paths["gligen"] = ([os.path.join(models_dir, "gligen")], suppor folder_names_and_paths["upscale_models"] = ([os.path.join(models_dir, "upscale_models")], supported_pt_extensions) -folder_names_and_paths["custom_nodes"] = ([os.path.join(base_path, "custom_nodes")], []) +folder_names_and_paths["custom_nodes"] = ([os.path.join(base_path, "custom_nodes")], set()) folder_names_and_paths["hypernetworks"] = ([os.path.join(models_dir, "hypernetworks")], supported_pt_extensions) diff --git a/main.py b/main.py index a374f2b12..2957dd2ff 100644 --- a/main.py +++ b/main.py @@ -5,6 +5,8 @@ import os import importlib.util import folder_paths import time +from comfy.cli_args import args + def execute_prestartup_script(): def execute_script(script_path): @@ -18,6 +20,9 @@ def execute_prestartup_script(): print(f"Failed to execute startup-script: {script_path} / {e}") return False + if args.disable_all_custom_nodes: + return + node_paths = folder_paths.get_folder_paths("custom_nodes") for custom_node_path in node_paths: possible_modules = os.listdir(custom_node_path) @@ -76,7 +81,7 @@ import yaml import execution import server from server import BinaryEventTypes -from nodes import init_custom_nodes +from nodes import init_builtin_extra_nodes, init_external_custom_nodes import comfy.model_management def cuda_malloc_warning(): @@ -214,7 +219,11 @@ if __name__ == "__main__": for config_path in itertools.chain(*args.extra_model_paths_config): load_extra_path_config(config_path) - init_custom_nodes() + init_builtin_extra_nodes() + if not args.disable_all_custom_nodes: + init_external_custom_nodes() + else: + logging.info("Skipping loading of custom nodes") cuda_malloc_warning() diff --git a/nodes.py b/nodes.py index 04775d290..a0d2178f4 100644 --- a/nodes.py +++ b/nodes.py @@ -1925,7 +1925,16 @@ def load_custom_node(module_path, ignore=set()): logging.warning(f"Cannot import {module_path} module for custom nodes: {e}") return False -def load_custom_nodes(): +def init_external_custom_nodes(): + """ + Initializes the external custom nodes. + + This function loads custom nodes from the specified folder paths and imports them into the application. + It measures the import times for each custom node and logs the results. + + Returns: + None + """ base_node_names = set(NODE_CLASS_MAPPINGS.keys()) node_paths = folder_paths.get_folder_paths("custom_nodes") node_import_times = [] @@ -1952,7 +1961,16 @@ def load_custom_nodes(): logging.info("{:6.1f} seconds{}: {}".format(n[0], import_message, n[1])) logging.info("") -def init_custom_nodes(): +def init_builtin_extra_nodes(): + """ + Initializes the built-in extra nodes in ComfyUI. + + This function loads the extra node files located in the "comfy_extras" directory and imports them into ComfyUI. + If any of the extra node files fail to import, a warning message is logged. + + Returns: + None + """ extras_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "comfy_extras") extras_files = [ "nodes_latent.py", @@ -1999,8 +2017,6 @@ def init_custom_nodes(): if not load_custom_node(os.path.join(extras_dir, node_file)): import_failed.append(node_file) - load_custom_nodes() - if len(import_failed) > 0: logging.warning("WARNING: some comfy_extras/ nodes did not import correctly. This may be because they are missing some dependencies.\n") for node in import_failed: From 1ef66b095586981633cd11906e6d2e555deab9f6 Mon Sep 17 00:00:00 2001 From: Bob Du Date: Tue, 2 Jul 2024 06:02:42 +0800 Subject: [PATCH 058/123] Add example for how to add custom API routes (#3597) --- custom_nodes/example_node.py.example | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/custom_nodes/example_node.py.example b/custom_nodes/example_node.py.example index 57c9cbedf..72ca3688c 100644 --- a/custom_nodes/example_node.py.example +++ b/custom_nodes/example_node.py.example @@ -106,6 +106,16 @@ class Example: # Set the web directory, any .js file in that directory will be loaded by the frontend as a frontend extension # WEB_DIRECTORY = "./somejs" + +# Add custom API routes, using router +from aiohttp import web +from server import PromptServer + +@PromptServer.instance.routes.get("/hello") +async def get_hello(request): + return web.json_response("hello") + + # A dictionary that contains all nodes you want to export with their names # NOTE: names should be globally unique NODE_CLASS_MAPPINGS = { From 52aaee251fcd87b7c554f4e9c1386b184236f81f Mon Sep 17 00:00:00 2001 From: shawnington <88048838+shawnington@users.noreply.github.com> Date: Tue, 2 Jul 2024 01:30:33 -0400 Subject: [PATCH 059/123] Fix to #3465. Prevent, resaving of duplicate images if overwrite not specified (#3472) * Fix to #3465. Prevent the, resaving of duplicate images if overwrite not specified This is a fix to #3465 Adds function compare_image_hash to do a sha256 hash comparison between an uploaded image and existing images with matching file names. This changes the behavior so that only images having the same filename that are actually different are saved to input, existing images are instead now opened instead of resaved with increment. Currently, exact duplicates with the same filename are resave saved with an incremented filename in the format: (n).ext with the code: ``` while os.path.exists(filepath): filename = f"{split[0]} ({i}){split[1]}" filepath = os.path.join(full_output_folder, filename) i += 1 ``` This commit changes this to: ``` while os.path.exists(filepath): if compare_image_hash(filepath, image): image_is_duplicate = True break filename = f"{split[0]} ({i}){split[1]}" filepath = os.path.join(full_output_folder, filename) i += 1 ``` a check for if image_is_duplicate = False is done before saving the file. Currently, if you load the same image of a cat named cat.jpg into the LoadImage node 3 times, you will get 3 new files in your input folder with incremented file names. With this change, you will now only have the single copy of cat.jpg, that will be re-opened instead of re-saved. However if you load 3 different images of cats named cat.jpg, you will get the expected behavior of having: cat.jpg cat (1).jpg cat (2).jpg This saves space and clutter. After checking my own input folder, I have 800+ images that are duplicates that were resaved with incremented file names amounting to more than 5GB of duplicated data. * fixed typo in expression --- server.py | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/server.py b/server.py index 30ea90c6c..5b98620ad 100644 --- a/server.py +++ b/server.py @@ -12,6 +12,7 @@ import json import glob import struct import ssl +import hashlib from PIL import Image, ImageOps from PIL.PngImagePlugin import PngInfo from io import BytesIO @@ -153,10 +154,24 @@ class PromptServer(): type_dir = folder_paths.get_output_directory() return type_dir, dir_type - + + def compare_image_hash(filepath, image): + # function to compare hashes of two images to see if it already exists, fix to #3465 + if os.path.exists(filepath): + a = hashlib.sha256() + b = hashlib.sha256() + with open(filepath, "rb") as f: + a.update(f.read()) + b.update(image.file.read()) + image.file.seek(0) + f.close() + return a.hexdigest() == b.hexdigest() + return False + def image_upload(post, image_save_function=None): image = post.get("image") overwrite = post.get("overwrite") + image_is_duplicate = False image_upload_type = post.get("type") upload_dir, image_upload_type = get_dir_by_type(image_upload_type) @@ -183,15 +198,19 @@ class PromptServer(): else: i = 1 while os.path.exists(filepath): + if compare_image_hash(filepath, image): #compare hash to prevent saving of duplicates with same name, fix for #3465 + image_is_duplicate = True + break filename = f"{split[0]} ({i}){split[1]}" filepath = os.path.join(full_output_folder, filename) i += 1 - if image_save_function is not None: - image_save_function(image, post, filepath) - else: - with open(filepath, "wb") as f: - f.write(image.file.read()) + if not image_is_duplicate: + if image_save_function is not None: + image_save_function(image, post, filepath) + else: + with open(filepath, "wb") as f: + f.write(image.file.read()) return web.json_response({"name" : filename, "subfolder": subfolder, "type": image_upload_type}) else: From 2f03201690e0fb8a3ec551a125b20d89c9019a02 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 2 Jul 2024 01:32:23 -0400 Subject: [PATCH 060/123] Remove some empty lines. --- server.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server.py b/server.py index 5b98620ad..38b1bab80 100644 --- a/server.py +++ b/server.py @@ -111,7 +111,7 @@ class PromptServer(): # On reconnect if we are the currently executing client send the current node if self.client_id == sid and self.last_node_id is not None: await self.send("executing", { "node": self.last_node_id }, sid) - + async for msg in ws: if msg.type == aiohttp.WSMsgType.ERROR: logging.warning('ws connection closed with exception %s' % ws.exception()) @@ -132,9 +132,9 @@ class PromptServer(): async def get_extensions(request): files = glob.glob(os.path.join( glob.escape(self.web_root), 'extensions/**/*.js'), recursive=True) - + extensions = list(map(lambda f: "/" + os.path.relpath(f, self.web_root).replace("\\", "/"), files)) - + for name, dir in nodes.EXTENSION_WEB_DIRS.items(): files = glob.glob(os.path.join(glob.escape(dir), '**/*.js'), recursive=True) extensions.extend(list(map(lambda f: "/extensions/" + urllib.parse.quote( @@ -154,7 +154,7 @@ class PromptServer(): type_dir = folder_paths.get_output_directory() return type_dir, dir_type - + def compare_image_hash(filepath, image): # function to compare hashes of two images to see if it already exists, fix to #3465 if os.path.exists(filepath): @@ -167,7 +167,7 @@ class PromptServer(): f.close() return a.hexdigest() == b.hexdigest() return False - + def image_upload(post, image_save_function=None): image = post.get("image") overwrite = post.get("overwrite") @@ -205,7 +205,7 @@ class PromptServer(): filepath = os.path.join(full_output_folder, filename) i += 1 - if not image_is_duplicate: + if not image_is_duplicate: if image_save_function is not None: image_save_function(image, post, filepath) else: From 01991f72ce1bdce31ff4bd6fc2fa64454b1526ad Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 2 Jul 2024 12:21:08 -0400 Subject: [PATCH 061/123] Fix SamplerEulerCFGpp node. --- comfy_extras/nodes_advanced_samplers.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/comfy_extras/nodes_advanced_samplers.py b/comfy_extras/nodes_advanced_samplers.py index cee3a10c4..820c250ef 100644 --- a/comfy_extras/nodes_advanced_samplers.py +++ b/comfy_extras/nodes_advanced_samplers.py @@ -60,7 +60,7 @@ from comfy.k_diffusion.sampling import to_d import comfy.model_patcher @torch.no_grad() -def sample_euler_cfgpp(model, x, sigmas, extra_args=None, callback=None, disable=None): +def sample_euler_pp(model, x, sigmas, extra_args=None, callback=None, disable=None): extra_args = {} if extra_args is None else extra_args temp = [0] @@ -75,11 +75,11 @@ def sample_euler_cfgpp(model, x, sigmas, extra_args=None, callback=None, disable for i in trange(len(sigmas) - 1, disable=disable): sigma_hat = sigmas[i] denoised = model(x, sigma_hat * s_in, **extra_args) - d = to_d(x, sigma_hat, temp[0]) + d = to_d(x - denoised + temp[0], sigmas[i], denoised) if callback is not None: callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigma_hat, 'denoised': denoised}) dt = sigmas[i + 1] - sigma_hat - x = denoised + sigmas[i + 1] * d + x = x + d * dt return x @@ -96,10 +96,10 @@ class SamplerEulerCFGpp: FUNCTION = "get_sampler" def get_sampler(self, version): - if version == "regular": - sampler = comfy.samplers.KSAMPLER(sample_euler_cfgpp) + if version == "alternative": + sampler = comfy.samplers.KSAMPLER(sample_euler_pp) else: - sampler = comfy.samplers.ksampler("euler_pp") + sampler = comfy.samplers.ksampler("euler_cfg_pp") return (sampler, ) NODE_CLASS_MAPPINGS = { From 3f46362d227fa0ca578a69aeb194951b9f87aea0 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" <4000772+mcmonkey4eva@users.noreply.github.com> Date: Tue, 2 Jul 2024 17:16:33 -0700 Subject: [PATCH 062/123] fix non-contiguous tensor saving (from channels-last) (#3932) --- comfy/sd.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/comfy/sd.py b/comfy/sd.py index dda0887ba..b28bfe358 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -627,5 +627,7 @@ def save_checkpoint(output_path, model, clip=None, vae=None, clip_vision=None, m sd = model.model.state_dict_for_saving(clip_sd, vae.get_sd(), clip_vision_sd) for k in extra_keys: sd[k] = extra_keys[k] + for k in sd: + sd[k] = sd[k].contiguous() comfy.utils.save_torch_file(sd, output_path, metadata=metadata) From 537f35c7bc76e611b53102d3b5a2926e46ec7362 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 2 Jul 2024 20:21:51 -0400 Subject: [PATCH 063/123] Don't update dict if contiguous. --- comfy/sd.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/comfy/sd.py b/comfy/sd.py index b28bfe358..4ba00a62c 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -627,7 +627,10 @@ def save_checkpoint(output_path, model, clip=None, vae=None, clip_vision=None, m sd = model.model.state_dict_for_saving(clip_sd, vae.get_sd(), clip_vision_sd) for k in extra_keys: sd[k] = extra_keys[k] + for k in sd: - sd[k] = sd[k].contiguous() + t = sd[k] + if not t.is_contiguous(): + sd[k] = t.contiguous() comfy.utils.save_torch_file(sd, output_path, metadata=metadata) From d7484ef30c97c077dde1c7ae07a16689bec86dd3 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 3 Jul 2024 11:34:32 -0400 Subject: [PATCH 064/123] Support loading checkpoints with the UNETLoader node. --- comfy/sd.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/comfy/sd.py b/comfy/sd.py index 4ba00a62c..e343e1fa8 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -563,24 +563,32 @@ def load_checkpoint_guess_config(ckpt_path, output_vae=True, output_clip=True, o return (model_patcher, clip, vae, clipvision) -def load_unet_state_dict(sd): #load unet in diffusers format +def load_unet_state_dict(sd): #load unet in diffusers or regular format + + #Allow loading unets from checkpoint files + checkpoint = False + diffusion_model_prefix = model_detection.unet_prefix_from_state_dict(sd) + temp_sd = comfy.utils.state_dict_prefix_replace(sd, {diffusion_model_prefix: ""}, filter_keys=True) + if len(temp_sd) > 0: + sd = temp_sd + checkpoint = True + parameters = comfy.utils.calculate_parameters(sd) unet_dtype = model_management.unet_dtype(model_params=parameters) load_device = model_management.get_torch_device() - if 'transformer_blocks.0.attn.add_q_proj.weight' in sd: #MMDIT SD3 + if checkpoint or "input_blocks.0.0.weight" in sd or 'clf.1.weight' in sd: #ldm or stable cascade + model_config = model_detection.model_config_from_unet(sd, "") + if model_config is None: + return None + new_sd = sd + elif 'transformer_blocks.0.attn.add_q_proj.weight' in sd: #MMDIT SD3 new_sd = model_detection.convert_diffusers_mmdit(sd, "") if new_sd is None: return None model_config = model_detection.model_config_from_unet(new_sd, "") if model_config is None: return None - elif "input_blocks.0.0.weight" in sd or 'clf.1.weight' in sd: #ldm or stable cascade - model_config = model_detection.model_config_from_unet(sd, "") - if model_config is None: - return None - new_sd = sd - else: #diffusers model_config = model_detection.model_config_from_diffusers_unet(sd) if model_config is None: From 086ac75228af3fea96be58ec45c2f6c17286e75d Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Wed, 3 Jul 2024 19:31:46 -0400 Subject: [PATCH 065/123] 3.8 Compatible type annotation (#3938) --- folder_paths.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/folder_paths.py b/folder_paths.py index 2cf45f12a..2baf8ce1c 100644 --- a/folder_paths.py +++ b/folder_paths.py @@ -1,12 +1,13 @@ import os import time import logging +from typing import Set, List, Dict, Tuple -supported_pt_extensions: set[str] = set(['.ckpt', '.pt', '.bin', '.pth', '.safetensors', '.pkl']) +supported_pt_extensions: Set[str] = set(['.ckpt', '.pt', '.bin', '.pth', '.safetensors', '.pkl']) -SupportedFileExtensionsType = set[str] -ScanPathType = list[str] -folder_names_and_paths: dict[str, tuple[ScanPathType, SupportedFileExtensionsType]] = {} +SupportedFileExtensionsType = Set[str] +ScanPathType = List[str] +folder_names_and_paths: Dict[str, Tuple[ScanPathType, SupportedFileExtensionsType]] = {} base_path = os.path.dirname(os.path.realpath(__file__)) models_dir = os.path.join(base_path, "models") From 24b969d3dace581ed3fb547eedfbdf502ad0f7e9 Mon Sep 17 00:00:00 2001 From: bymyself Date: Wed, 3 Jul 2024 17:30:07 -0700 Subject: [PATCH 066/123] Skip state check hook on first load (#3915) --- web/scripts/changeTracker.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/web/scripts/changeTracker.js b/web/scripts/changeTracker.js index 041c83122..39bc4a810 100644 --- a/web/scripts/changeTracker.js +++ b/web/scripts/changeTracker.js @@ -173,9 +173,11 @@ export class ChangeTracker { const onNodeAdded = LiteGraph.LGraph.prototype.onNodeAdded; LiteGraph.LGraph.prototype.onNodeAdded = function () { const v = onNodeAdded?.apply(this, arguments); - const ct = changeTracker(); - if (!ct.isOurLoad) { - ct.checkState(); + if (!app?.configuringGraph) { + const ct = changeTracker(); + if (!ct.isOurLoad) { + ct.checkState(); + } } return v; }; From 739b76630e0298561c39d0d3341bc2856e55d995 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 4 Jul 2024 15:14:13 -0400 Subject: [PATCH 067/123] Remove useless code. --- comfy/cldm/mmdit.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/comfy/cldm/mmdit.py b/comfy/cldm/mmdit.py index ee0282bc7..025c2fb5d 100644 --- a/comfy/cldm/mmdit.py +++ b/comfy/cldm/mmdit.py @@ -56,15 +56,6 @@ class ControlNet(comfy.ldm.modules.diffusionmodules.mmdit.MMDiT): if context is not None: context = self.context_embedder(context) - if self.register_length > 0: - context = torch.cat( - ( - repeat(self.register, "1 ... -> b ...", b=x.shape[0]), - default(context, torch.Tensor([]).type_as(x)), - ), - 1, - ) - output = [] blocks = len(self.joint_blocks) From 0e3dfd9e343d4aee7826fbc188e2af8ceb1bdde9 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Thu, 4 Jul 2024 20:49:07 -0400 Subject: [PATCH 068/123] Use relative path for custom/extra node module name (#3944) * Fix module name for comfy extra nodes * Use module name relative to root dir --- nodes.py | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/nodes.py b/nodes.py index a0d2178f4..81efecf65 100644 --- a/nodes.py +++ b/nodes.py @@ -1887,11 +1887,33 @@ NODE_DISPLAY_NAME_MAPPINGS = { EXTENSION_WEB_DIRS = {} -def load_custom_node(module_path, ignore=set()): - module_name = os.path.basename(module_path) + +def get_module_name(module_path: str) -> str: + """ + Returns the module name based on the given module path. + Examples: + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node.py") -> "custom_nodes.my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node") -> "custom_nodes.my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/") -> "custom_nodes.my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/__init__.py") -> "custom_nodes.my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/__init__") -> "custom_nodes.my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/__init__/") -> "custom_nodes.my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node.disabled") -> "custom_nodes.my + + Args: + module_path (str): The path of the module. + + Returns: + str: The module name. + """ + relative_path = os.path.relpath(module_path, folder_paths.base_path) if os.path.isfile(module_path): - sp = os.path.splitext(module_path) - module_name = sp[0] + relative_path = os.path.splitext(relative_path)[0] + return relative_path.replace(os.sep, '.') + + +def load_custom_node(module_path, ignore=set()): + module_name = get_module_name(module_path) try: logging.debug("Trying to load custom node {}".format(module_path)) if os.path.isfile(module_path): From 720b17442d39b5991e1d3c336f9d16a0f75c929c Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 4 Jul 2024 21:09:05 -0400 Subject: [PATCH 069/123] Temporary revert. --- nodes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes.py b/nodes.py index 81efecf65..03544be02 100644 --- a/nodes.py +++ b/nodes.py @@ -1913,7 +1913,7 @@ def get_module_name(module_path: str) -> str: def load_custom_node(module_path, ignore=set()): - module_name = get_module_name(module_path) + module_name = os.path.basename(module_path) try: logging.debug("Trying to load custom node {}".format(module_path)) if os.path.isfile(module_path): From bd2d3e27d786b89e9ef89d6eb083e94172126306 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 4 Jul 2024 21:43:23 -0400 Subject: [PATCH 070/123] Show comfy_extras warning at the end. Remove code. --- main.py | 8 ++------ nodes.py | 35 +++++++++++------------------------ 2 files changed, 13 insertions(+), 30 deletions(-) diff --git a/main.py b/main.py index 2957dd2ff..9650703a8 100644 --- a/main.py +++ b/main.py @@ -81,7 +81,7 @@ import yaml import execution import server from server import BinaryEventTypes -from nodes import init_builtin_extra_nodes, init_external_custom_nodes +import nodes import comfy.model_management def cuda_malloc_warning(): @@ -219,11 +219,7 @@ if __name__ == "__main__": for config_path in itertools.chain(*args.extra_model_paths_config): load_extra_path_config(config_path) - init_builtin_extra_nodes() - if not args.disable_all_custom_nodes: - init_external_custom_nodes() - else: - logging.info("Skipping loading of custom nodes") + nodes.init_extra_nodes(init_custom_nodes=not args.disable_all_custom_nodes) cuda_malloc_warning() diff --git a/nodes.py b/nodes.py index 03544be02..8f8abb494 100644 --- a/nodes.py +++ b/nodes.py @@ -1888,30 +1888,6 @@ NODE_DISPLAY_NAME_MAPPINGS = { EXTENSION_WEB_DIRS = {} -def get_module_name(module_path: str) -> str: - """ - Returns the module name based on the given module path. - Examples: - get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node.py") -> "custom_nodes.my_custom_node" - get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node") -> "custom_nodes.my_custom_node" - get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/") -> "custom_nodes.my_custom_node" - get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/__init__.py") -> "custom_nodes.my_custom_node" - get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/__init__") -> "custom_nodes.my_custom_node" - get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/__init__/") -> "custom_nodes.my_custom_node" - get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node.disabled") -> "custom_nodes.my - - Args: - module_path (str): The path of the module. - - Returns: - str: The module name. - """ - relative_path = os.path.relpath(module_path, folder_paths.base_path) - if os.path.isfile(module_path): - relative_path = os.path.splitext(relative_path)[0] - return relative_path.replace(os.sep, '.') - - def load_custom_node(module_path, ignore=set()): module_name = os.path.basename(module_path) try: @@ -2039,6 +2015,17 @@ def init_builtin_extra_nodes(): if not load_custom_node(os.path.join(extras_dir, node_file)): import_failed.append(node_file) + return import_failed + + +def init_extra_nodes(init_custom_nodes=True): + import_failed = init_external_custom_nodes() + + if init_custom_nodes: + init_external_custom_nodes() + else: + logging.info("Skipping loading of custom nodes") + if len(import_failed) > 0: logging.warning("WARNING: some comfy_extras/ nodes did not import correctly. This may be because they are missing some dependencies.\n") for node in import_failed: From cedbc94cc0551cfdeae01c48b922d546c816f898 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 4 Jul 2024 21:49:50 -0400 Subject: [PATCH 071/123] Forgot this in last commit. --- nodes.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nodes.py b/nodes.py index 8f8abb494..9c541eba8 100644 --- a/nodes.py +++ b/nodes.py @@ -1890,6 +1890,9 @@ EXTENSION_WEB_DIRS = {} def load_custom_node(module_path, ignore=set()): module_name = os.path.basename(module_path) + if os.path.isfile(module_path): + sp = os.path.splitext(module_path) + module_name = sp[0] try: logging.debug("Trying to load custom node {}".format(module_path)) if os.path.isfile(module_path): @@ -2019,7 +2022,7 @@ def init_builtin_extra_nodes(): def init_extra_nodes(init_custom_nodes=True): - import_failed = init_external_custom_nodes() + import_failed = init_builtin_extra_nodes() if init_custom_nodes: init_external_custom_nodes() From 1dc87df4c5f4925f8eb286236e71c9dd38941dd6 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 4 Jul 2024 22:03:37 -0400 Subject: [PATCH 072/123] Readme changes. --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2ce7c3e6b..35e3238a1 100644 --- a/README.md +++ b/README.md @@ -225,12 +225,11 @@ Use `--tls-keyfile key.pem --tls-certfile cert.pem` to enable TLS/SSL, the app w [Matrix space: #comfyui_space:matrix.org](https://app.element.io/#/room/%23comfyui_space%3Amatrix.org) (it's like discord but open source). +See also: [https://www.comfy.org/](https://www.comfy.org/) + # QA -### Why did you make this? +### Which GPU should I buy for this? -I wanted to learn how Stable Diffusion worked in detail. I also wanted something clean and powerful that would let me experiment with SD without restrictions. +[See this page for some recommendations](https://github.com/comfyanonymous/ComfyUI/wiki/Which-GPU-should-I-buy-for-ComfyUI) -### Who is this for? - -This is for anyone that wants to make complex workflows with SD or that wants to learn more how SD works. The interface follows closely how SD works and the code should be much more simple to understand than other SD UIs. From b4c2d03d476f97d9d91c0d7d0af7fde382084385 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Fri, 5 Jul 2024 12:10:22 -0400 Subject: [PATCH 073/123] Remove duplicate import. --- main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/main.py b/main.py index 9650703a8..196351a3d 100644 --- a/main.py +++ b/main.py @@ -58,7 +58,6 @@ import shutil import threading import gc -from comfy.cli_args import args import logging if os.name == "nt": From ce649d61c05ab0e905155b4a010d4f0459a0db8d Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Fri, 5 Jul 2024 23:48:17 -0400 Subject: [PATCH 074/123] Allow zeroing out of embeds with unused attention mask. --- comfy/sd1_clip.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/comfy/sd1_clip.py b/comfy/sd1_clip.py index 78e556b56..3b812b44c 100644 --- a/comfy/sd1_clip.py +++ b/comfy/sd1_clip.py @@ -169,7 +169,7 @@ class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder): tokens = torch.LongTensor(tokens).to(device) attention_mask = None - if self.enable_attention_masks: + if self.enable_attention_masks or self.zero_out_masked: attention_mask = torch.zeros_like(tokens) end_token = self.special_tokens.get("end", -1) for x in range(attention_mask.shape[0]): @@ -178,7 +178,11 @@ class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder): if tokens[x, y] == end_token: break - outputs = self.transformer(tokens, attention_mask, intermediate_output=self.layer_idx, final_layer_norm_intermediate=self.layer_norm_hidden_state) + attention_mask_model = None + if self.enable_attention_masks: + attention_mask_model = attention_mask + + outputs = self.transformer(tokens, attention_mask_model, intermediate_output=self.layer_idx, final_layer_norm_intermediate=self.layer_norm_hidden_state) self.transformer.set_input_embeddings(backup_embeds) if self.layer == "last": @@ -186,7 +190,7 @@ class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder): else: z = outputs[1].float() - if self.zero_out_masked and attention_mask is not None: + if self.zero_out_masked: z *= attention_mask.unsqueeze(-1).float() pooled_output = None From 80c45909985aa37e6803ed59b6753fc289ee365f Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sat, 6 Jul 2024 00:06:49 -0400 Subject: [PATCH 075/123] Allow specifying the padding token for the tokenizer. --- comfy/sd1_clip.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/comfy/sd1_clip.py b/comfy/sd1_clip.py index 3b812b44c..ed3dc2298 100644 --- a/comfy/sd1_clip.py +++ b/comfy/sd1_clip.py @@ -364,7 +364,7 @@ def load_embed(embedding_name, embedding_directory, embedding_size, embed_key=No return embed_out class SDTokenizer: - def __init__(self, tokenizer_path=None, max_length=77, pad_with_end=True, embedding_directory=None, embedding_size=768, embedding_key='clip_l', tokenizer_class=CLIPTokenizer, has_start_token=True, pad_to_max_length=True, min_length=None): + def __init__(self, tokenizer_path=None, max_length=77, pad_with_end=True, embedding_directory=None, embedding_size=768, embedding_key='clip_l', tokenizer_class=CLIPTokenizer, has_start_token=True, pad_to_max_length=True, min_length=None, pad_token=None): if tokenizer_path is None: tokenizer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "sd1_tokenizer") self.tokenizer = tokenizer_class.from_pretrained(tokenizer_path) @@ -380,6 +380,14 @@ class SDTokenizer: self.tokens_start = 0 self.start_token = None self.end_token = empty[0] + + if pad_token is not None: + self.pad_token = pad_token + elif pad_with_end: + self.pad_token = self.end_token + else: + self.pad_token = 0 + self.pad_with_end = pad_with_end self.pad_to_max_length = pad_to_max_length @@ -412,10 +420,6 @@ class SDTokenizer: Word id values are unique per word and embedding, where the id 0 is reserved for non word tokens. Returned list has the dimensions NxM where M is the input size of CLIP ''' - if self.pad_with_end: - pad_token = self.end_token - else: - pad_token = 0 text = escape_important(text) parsed_weights = token_weights(text, 1.0) @@ -467,7 +471,7 @@ class SDTokenizer: else: batch.append((self.end_token, 1.0, 0)) if self.pad_to_max_length: - batch.extend([(pad_token, 1.0, 0)] * (remaining_length)) + batch.extend([(self.pad_token, 1.0, 0)] * (remaining_length)) #start new batch batch = [] if self.start_token is not None: @@ -480,9 +484,9 @@ class SDTokenizer: #fill last batch batch.append((self.end_token, 1.0, 0)) if self.pad_to_max_length: - batch.extend([(pad_token, 1.0, 0)] * (self.max_length - len(batch))) + batch.extend([(self.pad_token, 1.0, 0)] * (self.max_length - len(batch))) if self.min_length is not None and len(batch) < self.min_length: - batch.extend([(pad_token, 1.0, 0)] * (self.min_length - len(batch))) + batch.extend([(self.pad_token, 1.0, 0)] * (self.min_length - len(batch))) if not return_word_ids: batched_tokens = [[(t, w) for t, w,_ in x] for x in batched_tokens] From b8e58a939463be85877c1244ee00763368723c07 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sat, 6 Jul 2024 00:33:25 -0400 Subject: [PATCH 076/123] Cleanup T5 code a bit. --- comfy/t5.py | 35 +++++++++++++++++++++-------------- comfy/t5_config_base.json | 1 + comfy/t5_config_xxl.json | 1 + 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/comfy/t5.py b/comfy/t5.py index 06dfe4766..d00b560a3 100644 --- a/comfy/t5.py +++ b/comfy/t5.py @@ -13,29 +13,36 @@ class T5LayerNorm(torch.nn.Module): x = x * torch.rsqrt(variance + self.variance_epsilon) return self.weight.to(device=x.device, dtype=x.dtype) * x +activations = { + "gelu_pytorch_tanh": lambda a: torch.nn.functional.gelu(a, approximate="tanh"), + "relu": torch.nn.functional.relu, +} + class T5DenseActDense(torch.nn.Module): - def __init__(self, model_dim, ff_dim, dtype, device, operations): + def __init__(self, model_dim, ff_dim, ff_activation, dtype, device, operations): super().__init__() self.wi = operations.Linear(model_dim, ff_dim, bias=False, dtype=dtype, device=device) self.wo = operations.Linear(ff_dim, model_dim, bias=False, dtype=dtype, device=device) # self.dropout = nn.Dropout(config.dropout_rate) + self.act = activations[ff_activation] def forward(self, x): - x = torch.nn.functional.relu(self.wi(x)) + x = self.act(self.wi(x)) # x = self.dropout(x) x = self.wo(x) return x class T5DenseGatedActDense(torch.nn.Module): - def __init__(self, model_dim, ff_dim, dtype, device, operations): + def __init__(self, model_dim, ff_dim, ff_activation, dtype, device, operations): super().__init__() self.wi_0 = operations.Linear(model_dim, ff_dim, bias=False, dtype=dtype, device=device) self.wi_1 = operations.Linear(model_dim, ff_dim, bias=False, dtype=dtype, device=device) self.wo = operations.Linear(ff_dim, model_dim, bias=False, dtype=dtype, device=device) # self.dropout = nn.Dropout(config.dropout_rate) + self.act = activations[ff_activation] def forward(self, x): - hidden_gelu = torch.nn.functional.gelu(self.wi_0(x), approximate="tanh") + hidden_gelu = self.act(self.wi_0(x)) hidden_linear = self.wi_1(x) x = hidden_gelu * hidden_linear # x = self.dropout(x) @@ -43,12 +50,12 @@ class T5DenseGatedActDense(torch.nn.Module): return x class T5LayerFF(torch.nn.Module): - def __init__(self, model_dim, ff_dim, ff_activation, dtype, device, operations): + def __init__(self, model_dim, ff_dim, ff_activation, gated_act, dtype, device, operations): super().__init__() - if ff_activation == "gelu_pytorch_tanh": - self.DenseReluDense = T5DenseGatedActDense(model_dim, ff_dim, dtype, device, operations) - elif ff_activation == "relu": - self.DenseReluDense = T5DenseActDense(model_dim, ff_dim, dtype, device, operations) + if gated_act: + self.DenseReluDense = T5DenseGatedActDense(model_dim, ff_dim, ff_activation, dtype, device, operations) + else: + self.DenseReluDense = T5DenseActDense(model_dim, ff_dim, ff_activation, dtype, device, operations) self.layer_norm = T5LayerNorm(model_dim, dtype=dtype, device=device, operations=operations) # self.dropout = nn.Dropout(config.dropout_rate) @@ -171,11 +178,11 @@ class T5LayerSelfAttention(torch.nn.Module): return x, past_bias class T5Block(torch.nn.Module): - def __init__(self, model_dim, inner_dim, ff_dim, ff_activation, num_heads, relative_attention_bias, dtype, device, operations): + def __init__(self, model_dim, inner_dim, ff_dim, ff_activation, gated_act, num_heads, relative_attention_bias, dtype, device, operations): super().__init__() self.layer = torch.nn.ModuleList() self.layer.append(T5LayerSelfAttention(model_dim, inner_dim, ff_dim, num_heads, relative_attention_bias, dtype, device, operations)) - self.layer.append(T5LayerFF(model_dim, ff_dim, ff_activation, dtype, device, operations)) + self.layer.append(T5LayerFF(model_dim, ff_dim, ff_activation, gated_act, dtype, device, operations)) def forward(self, x, mask=None, past_bias=None, optimized_attention=None): x, past_bias = self.layer[0](x, mask, past_bias, optimized_attention) @@ -183,11 +190,11 @@ class T5Block(torch.nn.Module): return x, past_bias class T5Stack(torch.nn.Module): - def __init__(self, num_layers, model_dim, inner_dim, ff_dim, ff_activation, num_heads, dtype, device, operations): + def __init__(self, num_layers, model_dim, inner_dim, ff_dim, ff_activation, gated_act, num_heads, dtype, device, operations): super().__init__() self.block = torch.nn.ModuleList( - [T5Block(model_dim, inner_dim, ff_dim, ff_activation, num_heads, relative_attention_bias=(i == 0), dtype=dtype, device=device, operations=operations) for i in range(num_layers)] + [T5Block(model_dim, inner_dim, ff_dim, ff_activation, gated_act, num_heads, relative_attention_bias=(i == 0), dtype=dtype, device=device, operations=operations) for i in range(num_layers)] ) self.final_layer_norm = T5LayerNorm(model_dim, dtype=dtype, device=device, operations=operations) # self.dropout = nn.Dropout(config.dropout_rate) @@ -216,7 +223,7 @@ class T5(torch.nn.Module): self.num_layers = config_dict["num_layers"] model_dim = config_dict["d_model"] - self.encoder = T5Stack(self.num_layers, model_dim, model_dim, config_dict["d_ff"], config_dict["dense_act_fn"], config_dict["num_heads"], dtype, device, operations) + self.encoder = T5Stack(self.num_layers, model_dim, model_dim, config_dict["d_ff"], config_dict["dense_act_fn"], config_dict["is_gated_act"], config_dict["num_heads"], dtype, device, operations) self.dtype = dtype self.shared = torch.nn.Embedding(config_dict["vocab_size"], model_dim, device=device) diff --git a/comfy/t5_config_base.json b/comfy/t5_config_base.json index facd85ef3..71f68327c 100644 --- a/comfy/t5_config_base.json +++ b/comfy/t5_config_base.json @@ -8,6 +8,7 @@ "dense_act_fn": "relu", "initializer_factor": 1.0, "is_encoder_decoder": true, + "is_gated_act": false, "layer_norm_epsilon": 1e-06, "model_type": "t5", "num_decoder_layers": 12, diff --git a/comfy/t5_config_xxl.json b/comfy/t5_config_xxl.json index bf4feadcf..28283b51a 100644 --- a/comfy/t5_config_xxl.json +++ b/comfy/t5_config_xxl.json @@ -8,6 +8,7 @@ "dense_act_fn": "gelu_pytorch_tanh", "initializer_factor": 1.0, "is_encoder_decoder": true, + "is_gated_act": true, "layer_norm_epsilon": 1e-06, "model_type": "t5", "num_decoder_layers": 24, From 404049114913f1a134656769a538779d7c927249 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sat, 6 Jul 2024 00:53:33 -0400 Subject: [PATCH 077/123] Better T5xxl detection. --- comfy/sd.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/comfy/sd.py b/comfy/sd.py index e343e1fa8..b39230bd7 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -432,9 +432,11 @@ def load_clip(ckpt_paths, embedding_directory=None, clip_type=CLIPType.STABLE_DI clip_target.clip = sd2_clip.SD2ClipModel clip_target.tokenizer = sd2_clip.SD2Tokenizer elif "encoder.block.23.layer.1.DenseReluDense.wi_1.weight" in clip_data[0]: - dtype_t5 = clip_data[0]["encoder.block.23.layer.1.DenseReluDense.wi_1.weight"].dtype - clip_target.clip = sd3_clip.sd3_clip(clip_l=False, clip_g=False, t5=True, dtype_t5=dtype_t5) - clip_target.tokenizer = sd3_clip.SD3Tokenizer + weight = clip_data[0]["encoder.block.23.layer.1.DenseReluDense.wi_1.weight"] + dtype_t5 = weight.dtype + if weight.shape[-1] == 4096: + clip_target.clip = sd3_clip.sd3_clip(clip_l=False, clip_g=False, t5=True, dtype_t5=dtype_t5) + clip_target.tokenizer = sd3_clip.SD3Tokenizer elif "encoder.block.0.layer.0.SelfAttention.k.weight" in clip_data[0]: clip_target.clip = sa_t5.SAT5Model clip_target.tokenizer = sa_t5.SAT5Tokenizer From ff63893d103d9c3168eaf9101fb3cebbc2abd8fa Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sat, 6 Jul 2024 02:42:53 -0400 Subject: [PATCH 078/123] Support other types of T5 models. --- comfy/t5.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/comfy/t5.py b/comfy/t5.py index d00b560a3..448c5aad3 100644 --- a/comfy/t5.py +++ b/comfy/t5.py @@ -190,11 +190,11 @@ class T5Block(torch.nn.Module): return x, past_bias class T5Stack(torch.nn.Module): - def __init__(self, num_layers, model_dim, inner_dim, ff_dim, ff_activation, gated_act, num_heads, dtype, device, operations): + def __init__(self, num_layers, model_dim, inner_dim, ff_dim, ff_activation, gated_act, num_heads, relative_attention, dtype, device, operations): super().__init__() self.block = torch.nn.ModuleList( - [T5Block(model_dim, inner_dim, ff_dim, ff_activation, gated_act, num_heads, relative_attention_bias=(i == 0), dtype=dtype, device=device, operations=operations) for i in range(num_layers)] + [T5Block(model_dim, inner_dim, ff_dim, ff_activation, gated_act, num_heads, relative_attention_bias=((not relative_attention) or (i == 0)), dtype=dtype, device=device, operations=operations) for i in range(num_layers)] ) self.final_layer_norm = T5LayerNorm(model_dim, dtype=dtype, device=device, operations=operations) # self.dropout = nn.Dropout(config.dropout_rate) @@ -223,7 +223,7 @@ class T5(torch.nn.Module): self.num_layers = config_dict["num_layers"] model_dim = config_dict["d_model"] - self.encoder = T5Stack(self.num_layers, model_dim, model_dim, config_dict["d_ff"], config_dict["dense_act_fn"], config_dict["is_gated_act"], config_dict["num_heads"], dtype, device, operations) + self.encoder = T5Stack(self.num_layers, model_dim, model_dim, config_dict["d_ff"], config_dict["dense_act_fn"], config_dict["is_gated_act"], config_dict["num_heads"], config_dict["model_type"] == "t5", dtype, device, operations) self.dtype = dtype self.shared = torch.nn.Embedding(config_dict["vocab_size"], model_dim, device=device) From 2dc84d14447782683862616eaf8c19c0c1feacf3 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sat, 6 Jul 2024 04:06:03 -0400 Subject: [PATCH 079/123] Add a way to set the timestep multiplier in the flow sampling. --- comfy/model_sampling.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/comfy/model_sampling.py b/comfy/model_sampling.py index 6bd3a5d79..2d95a83dc 100644 --- a/comfy/model_sampling.py +++ b/comfy/model_sampling.py @@ -190,11 +190,12 @@ class ModelSamplingDiscreteFlow(torch.nn.Module): else: sampling_settings = {} - self.set_parameters(shift=sampling_settings.get("shift", 1.0)) + self.set_parameters(shift=sampling_settings.get("shift", 1.0), multiplier=sampling_settings.get("multiplier", 1000)) - def set_parameters(self, shift=1.0, timesteps=1000): + def set_parameters(self, shift=1.0, timesteps=1000, multiplier=1000): self.shift = shift - ts = self.sigma(torch.arange(1, timesteps + 1, 1)) + self.multiplier = multiplier + ts = self.sigma((torch.arange(1, timesteps + 1, 1) / timesteps) * multiplier) self.register_buffer('sigmas', ts) @property @@ -206,10 +207,10 @@ class ModelSamplingDiscreteFlow(torch.nn.Module): return self.sigmas[-1] def timestep(self, sigma): - return sigma * 1000 + return sigma * self.multiplier def sigma(self, timestep): - return time_snr_shift(self.shift, timestep / 1000) + return time_snr_shift(self.shift, timestep / self.multiplier) def percent_to_sigma(self, percent): if percent <= 0.0: From 628f0b8ebc2c9a51205e5e5a9973f8db348a310f Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sun, 7 Jul 2024 09:22:32 -0400 Subject: [PATCH 080/123] Move audio nodes out of _for_testing. --- comfy_extras/nodes_audio.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/comfy_extras/nodes_audio.py b/comfy_extras/nodes_audio.py index 9950d58ed..64d241e98 100644 --- a/comfy_extras/nodes_audio.py +++ b/comfy_extras/nodes_audio.py @@ -19,7 +19,7 @@ class EmptyLatentAudio: RETURN_TYPES = ("LATENT",) FUNCTION = "generate" - CATEGORY = "_for_testing/audio" + CATEGORY = "latent/audio" def generate(self, seconds): batch_size = 1 @@ -34,7 +34,7 @@ class VAEEncodeAudio: RETURN_TYPES = ("LATENT",) FUNCTION = "encode" - CATEGORY = "_for_testing/audio" + CATEGORY = "latent/audio" def encode(self, vae, audio): sample_rate = audio["sample_rate"] @@ -53,7 +53,7 @@ class VAEDecodeAudio: RETURN_TYPES = ("AUDIO",) FUNCTION = "decode" - CATEGORY = "_for_testing/audio" + CATEGORY = "latent/audio" def decode(self, vae, samples): audio = vae.decode(samples["samples"]).movedim(-1, 1) @@ -132,7 +132,7 @@ class SaveAudio: OUTPUT_NODE = True - CATEGORY = "_for_testing/audio" + CATEGORY = "audio" def save_audio(self, audio, filename_prefix="ComfyUI", prompt=None, extra_pnginfo=None): filename_prefix += self.prefix_append @@ -195,7 +195,7 @@ class LoadAudio: ] return {"required": {"audio": (sorted(files), {"audio_upload": True})}} - CATEGORY = "_for_testing/audio" + CATEGORY = "audio" RETURN_TYPES = ("AUDIO", ) FUNCTION = "load" @@ -203,7 +203,6 @@ class LoadAudio: def load(self, audio): audio_path = folder_paths.get_annotated_filepath(audio) waveform, sample_rate = torchaudio.load(audio_path) - multiplier = 1.0 audio = {"waveform": waveform.unsqueeze(0), "sample_rate": sample_rate} return (audio, ) From bb663bcd6c81a4395100c5f8527a221037d366f8 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Mon, 8 Jul 2024 08:48:38 -0400 Subject: [PATCH 081/123] Rename clip_t5base to t5base for stable audio text encoder. --- comfy/sa_t5.py | 2 +- comfy/sd1_clip.py | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/comfy/sa_t5.py b/comfy/sa_t5.py index 37be5287e..acc302f67 100644 --- a/comfy/sa_t5.py +++ b/comfy/sa_t5.py @@ -19,4 +19,4 @@ class SAT5Tokenizer(sd1_clip.SD1Tokenizer): class SAT5Model(sd1_clip.SD1ClipModel): def __init__(self, device="cpu", dtype=None, **kwargs): - super().__init__(device=device, dtype=dtype, clip_name="t5base", clip_model=T5BaseModel, **kwargs) + super().__init__(device=device, dtype=dtype, name="t5base", clip_model=T5BaseModel, **kwargs) diff --git a/comfy/sd1_clip.py b/comfy/sd1_clip.py index ed3dc2298..0fe1f1d13 100644 --- a/comfy/sd1_clip.py +++ b/comfy/sd1_clip.py @@ -514,10 +514,16 @@ class SD1Tokenizer: class SD1ClipModel(torch.nn.Module): - def __init__(self, device="cpu", dtype=None, clip_name="l", clip_model=SDClipModel, **kwargs): + def __init__(self, device="cpu", dtype=None, clip_name="l", clip_model=SDClipModel, name=None, **kwargs): super().__init__() - self.clip_name = clip_name - self.clip = "clip_{}".format(self.clip_name) + + if name is not None: + self.clip_name = name + self.clip = "{}".format(self.clip_name) + else: + self.clip_name = clip_name + self.clip = "clip_{}".format(self.clip_name) + setattr(self, self.clip, clip_model(device=device, dtype=dtype, **kwargs)) self.dtypes = set() From faa57430b0ff882275b1afcf6610e8e9f8a5929b Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Mon, 8 Jul 2024 23:26:34 -0400 Subject: [PATCH 082/123] Controlnet union model basic implementation. This is only the model code itself, it currently defaults to an empty embedding [0] * 6 which seems to work better than treating it like a regular controlnet. TODO: Add nodes to select the image type. --- comfy/cldm/cldm.py | 113 +++++++++++++++++++++++++++++++++++++++++++- comfy/controlnet.py | 6 +++ 2 files changed, 118 insertions(+), 1 deletion(-) diff --git a/comfy/cldm/cldm.py b/comfy/cldm/cldm.py index f8a161594..3feb9bab0 100644 --- a/comfy/cldm/cldm.py +++ b/comfy/cldm/cldm.py @@ -13,7 +13,47 @@ from ..ldm.modules.diffusionmodules.util import ( from ..ldm.modules.attention import SpatialTransformer from ..ldm.modules.diffusionmodules.openaimodel import UNetModel, TimestepEmbedSequential, ResBlock, Downsample from ..ldm.util import exists +from ..ldm.cascade.common import OptimizedAttention +from collections import OrderedDict import comfy.ops +from comfy.ldm.modules.attention import optimized_attention + +class OptimizedAttention(nn.Module): + def __init__(self, c, nhead, dropout=0.0, dtype=None, device=None, operations=None): + super().__init__() + self.heads = nhead + self.c = c + + self.in_proj = operations.Linear(c, c * 3, bias=True, dtype=dtype, device=device) + self.out_proj = operations.Linear(c, c, bias=True, dtype=dtype, device=device) + + def forward(self, x): + x = self.in_proj(x) + q, k, v = x.split(self.c, dim=2) + out = optimized_attention(q, k, v, self.heads) + return self.out_proj(out) + +class QuickGELU(nn.Module): + def forward(self, x: torch.Tensor): + return x * torch.sigmoid(1.702 * x) + +class ResBlockUnionControlnet(nn.Module): + def __init__(self, dim, nhead, dtype=None, device=None, operations=None): + super().__init__() + self.attn = OptimizedAttention(dim, nhead, dtype=dtype, device=device, operations=operations) + self.ln_1 = operations.LayerNorm(dim, dtype=dtype, device=device) + self.mlp = nn.Sequential( + OrderedDict([("c_fc", operations.Linear(dim, dim * 4, dtype=dtype, device=device)), ("gelu", QuickGELU()), + ("c_proj", operations.Linear(dim * 4, dim, dtype=dtype, device=device))])) + self.ln_2 = operations.LayerNorm(dim, dtype=dtype, device=device) + + def attention(self, x: torch.Tensor): + return self.attn(x) + + def forward(self, x: torch.Tensor): + x = x + self.attention(self.ln_1(x)) + x = x + self.mlp(self.ln_2(x)) + return x class ControlledUnetModel(UNetModel): #implemented in the ldm unet @@ -53,6 +93,7 @@ class ControlNet(nn.Module): transformer_depth_middle=None, transformer_depth_output=None, attn_precision=None, + union_controlnet=False, device=None, operations=comfy.ops.disable_weight_init, **kwargs, @@ -280,6 +321,65 @@ class ControlNet(nn.Module): self.middle_block_out = self.make_zero_conv(ch, operations=operations, dtype=self.dtype, device=device) self._feature_size += ch + if union_controlnet: + self.num_control_type = 6 + num_trans_channel = 320 + num_trans_head = 8 + num_trans_layer = 1 + num_proj_channel = 320 + # task_scale_factor = num_trans_channel ** 0.5 + self.task_embedding = nn.Parameter(torch.empty(self.num_control_type, num_trans_channel, dtype=self.dtype, device=device)) + + self.transformer_layes = nn.Sequential(*[ResBlockUnionControlnet(num_trans_channel, num_trans_head, dtype=self.dtype, device=device, operations=operations) for _ in range(num_trans_layer)]) + self.spatial_ch_projs = operations.Linear(num_trans_channel, num_proj_channel, dtype=self.dtype, device=device) + #----------------------------------------------------------------------------------------------------- + + control_add_embed_dim = 256 + class ControlAddEmbedding(nn.Module): + def __init__(self, in_dim, out_dim, num_control_type, dtype=None, device=None, operations=None): + super().__init__() + self.num_control_type = num_control_type + self.in_dim = in_dim + self.linear_1 = operations.Linear(in_dim * num_control_type, out_dim, dtype=dtype, device=device) + self.linear_2 = operations.Linear(out_dim, out_dim, dtype=dtype, device=device) + def forward(self, control_type, dtype, device): + c_type = torch.zeros((self.num_control_type,), device=device) + c_type[control_type] = 1.0 + c_type = timestep_embedding(c_type.flatten(), self.in_dim, repeat_only=False).to(dtype).reshape((-1, self.num_control_type * self.in_dim)) + return self.linear_2(torch.nn.functional.silu(self.linear_1(c_type))) + + self.control_add_embedding = ControlAddEmbedding(control_add_embed_dim, time_embed_dim, self.num_control_type, dtype=self.dtype, device=device, operations=operations) + else: + self.task_embedding = None + self.control_add_embedding = None + + def union_controlnet_merge(self, hint, control_type, emb, context): + # Equivalent to: https://github.com/xinsir6/ControlNetPlus/tree/main + inputs = [] + condition_list = [] + + for idx in range(min(1, len(control_type))): + controlnet_cond = self.input_hint_block(hint[idx], emb, context) + feat_seq = torch.mean(controlnet_cond, dim=(2, 3)) + if idx < len(control_type): + feat_seq += self.task_embedding[control_type[idx]] + + inputs.append(feat_seq.unsqueeze(1)) + condition_list.append(controlnet_cond) + + x = torch.cat(inputs, dim=1) + x = self.transformer_layes(x) + controlnet_cond_fuser = None + for idx in range(len(control_type)): + alpha = self.spatial_ch_projs(x[:, idx]) + alpha = alpha.unsqueeze(-1).unsqueeze(-1) + o = condition_list[idx] + alpha + if controlnet_cond_fuser is None: + controlnet_cond_fuser = o + else: + controlnet_cond_fuser += o + return controlnet_cond_fuser + def make_zero_conv(self, channels, operations=None, dtype=None, device=None): return TimestepEmbedSequential(operations.conv_nd(self.dims, channels, channels, 1, padding=0, dtype=dtype, device=device)) @@ -287,7 +387,18 @@ class ControlNet(nn.Module): t_emb = timestep_embedding(timesteps, self.model_channels, repeat_only=False).to(x.dtype) emb = self.time_embed(t_emb) - guided_hint = self.input_hint_block(hint, emb, context) + guided_hint = None + if self.control_add_embedding is not None: + control_type = kwargs.get("control_type", []) + + emb += self.control_add_embedding(control_type, emb.dtype, emb.device) + if len(control_type) > 0: + if len(hint.shape) < 5: + hint = hint.unsqueeze(dim=0) + guided_hint = self.union_controlnet_merge(hint, control_type, emb, context) + + if guided_hint is None: + guided_hint = self.input_hint_block(hint, emb, context) out_output = [] out_middle = [] diff --git a/comfy/controlnet.py b/comfy/controlnet.py index d00395139..84286f1fa 100644 --- a/comfy/controlnet.py +++ b/comfy/controlnet.py @@ -413,6 +413,12 @@ def load_controlnet(ckpt_path, model=None): if k in controlnet_data: new_sd[diffusers_keys[k]] = controlnet_data.pop(k) + if "control_add_embedding.linear_1.bias" in controlnet_data: #Union Controlnet + controlnet_config["union_controlnet"] = True + for k in list(controlnet_data.keys()): + new_k = k.replace('.attn.in_proj_', '.attn.in_proj.') + new_sd[new_k] = controlnet_data.pop(k) + leftover_keys = controlnet_data.keys() if len(leftover_keys) > 0: logging.warning("leftover keys: {}".format(leftover_keys)) From ade7aa1b0ce7944f50f66af5d8742299ac49d07f Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 9 Jul 2024 11:05:05 -0400 Subject: [PATCH 083/123] Remove useless import. --- comfy/cldm/cldm.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/comfy/cldm/cldm.py b/comfy/cldm/cldm.py index 3feb9bab0..d4d32b87e 100644 --- a/comfy/cldm/cldm.py +++ b/comfy/cldm/cldm.py @@ -13,7 +13,6 @@ from ..ldm.modules.diffusionmodules.util import ( from ..ldm.modules.attention import SpatialTransformer from ..ldm.modules.diffusionmodules.openaimodel import UNetModel, TimestepEmbedSequential, ResBlock, Downsample from ..ldm.util import exists -from ..ldm.cascade.common import OptimizedAttention from collections import OrderedDict import comfy.ops from comfy.ldm.modules.attention import optimized_attention @@ -388,7 +387,7 @@ class ControlNet(nn.Module): emb = self.time_embed(t_emb) guided_hint = None - if self.control_add_embedding is not None: + if self.control_add_embedding is not None: #Union Controlnet control_type = kwargs.get("control_type", []) emb += self.control_add_embedding(control_type, emb.dtype, emb.device) From d160073829b836fce97046ebb5f145fa1c677ae3 Mon Sep 17 00:00:00 2001 From: bymyself Date: Tue, 9 Jul 2024 08:23:26 -0700 Subject: [PATCH 084/123] Fix loadGraphData call during restore (#3976) --- web/scripts/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/scripts/app.js b/web/scripts/app.js index 67e488bf9..8b4478a32 100644 --- a/web/scripts/app.js +++ b/web/scripts/app.js @@ -1599,7 +1599,7 @@ export class ComfyApp { if (json) { const workflow = JSON.parse(json); const workflowName = getStorageValue("Comfy.PreviousWorkflow"); - await this.loadGraphData(workflow, true, workflowName); + await this.loadGraphData(workflow, true, true, workflowName); return true; } }; From c3db344746163f9ab942591020043d47ca34e4f0 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 9 Jul 2024 11:52:31 -0400 Subject: [PATCH 085/123] Fix ConditioningZeroOut when there is no pooled output. --- nodes.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nodes.py b/nodes.py index 9c541eba8..a230f725b 100644 --- a/nodes.py +++ b/nodes.py @@ -232,8 +232,9 @@ class ConditioningZeroOut: c = [] for t in conditioning: d = t[1].copy() - if "pooled_output" in d: - d["pooled_output"] = torch.zeros_like(d["pooled_output"]) + pooled_output = d.get("pooled_output", None) + if pooled_output is not None: + d["pooled_output"] = torch.zeros_like(pooled_output) n = [torch.zeros_like(t[0]), d] c.append(n) return (c, ) From f1a01c2c7e2678f34c72212d2a8640237f31fa43 Mon Sep 17 00:00:00 2001 From: Extraltodeus Date: Tue, 9 Jul 2024 22:20:49 +0200 Subject: [PATCH 086/123] Add sampler_pre_cfg_function (#3979) * Update samplers.py * Update model_patcher.py --- comfy/model_patcher.py | 9 +++++++++ comfy/samplers.py | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/comfy/model_patcher.py b/comfy/model_patcher.py index b949031e9..efac251ca 100644 --- a/comfy/model_patcher.py +++ b/comfy/model_patcher.py @@ -57,6 +57,12 @@ def set_model_options_post_cfg_function(model_options, post_cfg_function, disabl model_options["disable_cfg1_optimization"] = True return model_options +def set_model_options_pre_cfg_function(model_options, pre_cfg_function, disable_cfg1_optimization=False): + model_options["sampler_pre_cfg_function"] = model_options.get("sampler_pre_cfg_function", []) + [pre_cfg_function] + if disable_cfg1_optimization: + model_options["disable_cfg1_optimization"] = True + return model_options + class ModelPatcher: def __init__(self, model, load_device, offload_device, size=0, current_device=None, weight_inplace_update=False): self.size = size @@ -130,6 +136,9 @@ class ModelPatcher: def set_model_sampler_post_cfg_function(self, post_cfg_function, disable_cfg1_optimization=False): self.model_options = set_model_options_post_cfg_function(self.model_options, post_cfg_function, disable_cfg1_optimization) + def set_model_sampler_pre_cfg_function(self, pre_cfg_function, disable_cfg1_optimization=False): + self.model_options = set_model_options_pre_cfg_function(self.model_options, pre_cfg_function, disable_cfg1_optimization) + def set_model_unet_function_wrapper(self, unet_wrapper_function: UnetWrapperFunction): self.model_options["model_function_wrapper"] = unet_wrapper_function diff --git a/comfy/samplers.py b/comfy/samplers.py index c0aa12916..bbf9219f7 100644 --- a/comfy/samplers.py +++ b/comfy/samplers.py @@ -275,6 +275,12 @@ def sampling_function(model, x, timestep, uncond, cond, cond_scale, model_option conds = [cond, uncond_] out = calc_cond_batch(model, conds, x, timestep, model_options) + + for fn in model_options.get("sampler_pre_cfg_function", []): + args = {"conds":conds, "conds_out": out, "cond_scale": cond_scale, "timestep": timestep, + "input": x, "sigma": timestep, "model": model, "model_options": model_options} + out = fn(args) + return cfg_function(model, out[0], out[1], cond_scale, x, timestep, model_options=model_options, cond=cond, uncond=uncond_) From 83f70a88fbc4866050dae90d78ec66aebe8e341a Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Tue, 9 Jul 2024 17:07:15 -0400 Subject: [PATCH 087/123] Add __module__ to node info (#3936) Use more explicit name 'python_module' Parse abs ath Move parse to nodes.py --- nodes.py | 29 ++++++++++++++++++++++++++--- server.py | 1 + 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/nodes.py b/nodes.py index a230f725b..8d8b153f8 100644 --- a/nodes.py +++ b/nodes.py @@ -1889,7 +1889,29 @@ NODE_DISPLAY_NAME_MAPPINGS = { EXTENSION_WEB_DIRS = {} -def load_custom_node(module_path, ignore=set()): +def get_relative_module_name(module_path: str) -> str: + """ + Returns the module name based on the given module path. + Examples: + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node.py") -> "custom_nodes.my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node") -> "custom_nodes.my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/") -> "custom_nodes.my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/__init__.py") -> "custom_nodes.my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/__init__") -> "custom_nodes.my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/__init__/") -> "custom_nodes.my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node.disabled") -> "custom_nodes.my + Args: + module_path (str): The path of the module. + Returns: + str: The module name. + """ + relative_path = os.path.relpath(module_path, folder_paths.base_path) + if os.path.isfile(module_path): + relative_path = os.path.splitext(relative_path)[0] + return relative_path.replace(os.sep, '.') + + +def load_custom_node(module_path: str, ignore=set()) -> bool: module_name = os.path.basename(module_path) if os.path.isfile(module_path): sp = os.path.splitext(module_path) @@ -1913,9 +1935,10 @@ def load_custom_node(module_path, ignore=set()): EXTENSION_WEB_DIRS[module_name] = web_dir if hasattr(module, "NODE_CLASS_MAPPINGS") and getattr(module, "NODE_CLASS_MAPPINGS") is not None: - for name in module.NODE_CLASS_MAPPINGS: + for name, node_cls in module.NODE_CLASS_MAPPINGS.items(): if name not in ignore: - NODE_CLASS_MAPPINGS[name] = module.NODE_CLASS_MAPPINGS[name] + NODE_CLASS_MAPPINGS[name] = node_cls + node_cls.RELATIVE_PYTHON_MODULE = get_relative_module_name(module_path) if hasattr(module, "NODE_DISPLAY_NAME_MAPPINGS") and getattr(module, "NODE_DISPLAY_NAME_MAPPINGS") is not None: NODE_DISPLAY_NAME_MAPPINGS.update(module.NODE_DISPLAY_NAME_MAPPINGS) return True diff --git a/server.py b/server.py index 38b1bab80..ce7c7532d 100644 --- a/server.py +++ b/server.py @@ -416,6 +416,7 @@ class PromptServer(): info['name'] = node_class info['display_name'] = nodes.NODE_DISPLAY_NAME_MAPPINGS[node_class] if node_class in nodes.NODE_DISPLAY_NAME_MAPPINGS.keys() else node_class info['description'] = obj_class.DESCRIPTION if hasattr(obj_class,'DESCRIPTION') else '' + info['python_module'] = getattr(obj_class, "RELATIVE_PYTHON_MODULE", "nodes") info['category'] = 'sd' if hasattr(obj_class, 'OUTPUT_NODE') and obj_class.OUTPUT_NODE == True: info['output_node'] = True From 8d3f979b633dab9824c59bf8a06c748a533eec0b Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Tue, 9 Jul 2024 17:12:57 -0400 Subject: [PATCH 088/123] Check unhandled exception in test log in test action (#3987) * Upload console logs * Check unhandled exception --- .github/workflows/test-browser.yml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-browser.yml b/.github/workflows/test-browser.yml index 65483b00f..7beb0c696 100644 --- a/.github/workflows/test-browser.yml +++ b/.github/workflows/test-browser.yml @@ -42,7 +42,7 @@ jobs: working-directory: ComfyUI - name: Start ComfyUI server run: | - python main.py --cpu & + python main.py --cpu 2>&1 | tee console_output.log & wait-for-it --service 127.0.0.1:8188 -t 600 working-directory: ComfyUI - name: Install ComfyUI_frontend dependencies @@ -55,9 +55,22 @@ jobs: - name: Run Playwright tests run: npx playwright test working-directory: ComfyUI_frontend + - name: Check for unhandled exceptions in server log + run: | + if grep -qE "Exception|Error" console_output.log; then + echo "Unhandled exception/error found in server log." + exit 1 + fi + working-directory: ComfyUI - uses: actions/upload-artifact@v4 if: always() with: name: playwright-report path: ComfyUI_frontend/playwright-report/ retention-days: 30 + - uses: actions/upload-artifact@v4 + if: always() + with: + name: console-output + path: ComfyUI/console_output.log + retention-days: 30 From 90389b3b8a69c08c3ed0bcc9d87a92246578a8e3 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Wed, 10 Jul 2024 11:28:15 -0400 Subject: [PATCH 089/123] Update bug issue template (#3996) * Update issue template * nit --- .github/ISSUE_TEMPLATE/bug-report.yml | 83 ++++++++++++++------------- 1 file changed, 43 insertions(+), 40 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 87bef3681..39d1992d7 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -1,45 +1,48 @@ name: Bug Report description: "Something is broken inside of ComfyUI. (Do not use this if you're just having issues and need help, or if the issue relates to a custom node)" -labels: [ "Potential Bug" ] +labels: ["Potential Bug"] body: - - type: markdown - attributes: - value: | - Before submitting a **Bug Report**, please ensure the following: + - type: markdown + attributes: + value: | + Before submitting a **Bug Report**, please ensure the following: - **1:** You are running the latest version of ComfyUI. - **2:** You have looked at the existing bug reports and made sure this isn't already reported. - **3:** This is an actual bug in ComfyUI, not just a support question and not caused by an custom node. A bug is when you can specify exact steps to replicate what went wrong and others will be able to repeat your steps and see the same issue happen. + - **1:** You are running the latest version of ComfyUI. + - **2:** You have looked at the existing bug reports and made sure this isn't already reported. + - **3:** You confirmed that the bug is not caused by a custom node. You can disable all custom nodes by passing + `--disable-all-custom-nodes` command line argument. + - **4:** This is an actual bug in ComfyUI, not just a support question. A bug is when you can specify exact + steps to replicate what went wrong and others will be able to repeat your steps and see the same issue happen. - If unsure, ask on the [ComfyUI Matrix Space](https://app.element.io/#/room/%23comfyui_space%3Amatrix.org) or the [Comfy Org Discord](https://discord.gg/comfyorg) first. - - type: textarea - attributes: - label: Expected Behavior - description: "What you expected to happen." - validations: - required: true - - type: textarea - attributes: - label: Actual Behavior - description: "What actually happened. Please include a screenshot of the issue if possible." - validations: - required: true - - type: textarea - attributes: - label: Steps to Reproduce - description: "Describe how to reproduce the issue. Please be sure to attach a workflow JSON or PNG, ideally one that doesn't require custom nodes to test. If the bug open happens when certain custom nodes are used, most likely that custom node is what has the bug rather than ComfyUI, in which case it should be reported to the node's author." - validations: - required: true - - type: textarea - attributes: - label: Debug Logs - description: "Please copy the output from your terminal logs here." - render: powershell - validations: - required: true - - type: textarea - attributes: - label: Other - description: "Any other additional information you think might be helpful." - validations: - required: false + If unsure, ask on the [ComfyUI Matrix Space](https://app.element.io/#/room/%23comfyui_space%3Amatrix.org) or the [Comfy Org Discord](https://discord.gg/comfyorg) first. + - type: textarea + attributes: + label: Expected Behavior + description: "What you expected to happen." + validations: + required: true + - type: textarea + attributes: + label: Actual Behavior + description: "What actually happened. Please include a screenshot of the issue if possible." + validations: + required: true + - type: textarea + attributes: + label: Steps to Reproduce + description: "Describe how to reproduce the issue. Please be sure to attach a workflow JSON or PNG, ideally one that doesn't require custom nodes to test. If the bug open happens when certain custom nodes are used, most likely that custom node is what has the bug rather than ComfyUI, in which case it should be reported to the node's author." + validations: + required: true + - type: textarea + attributes: + label: Debug Logs + description: "Please copy the output from your terminal logs here." + render: powershell + validations: + required: true + - type: textarea + attributes: + label: Other + description: "Any other additional information you think might be helpful." + validations: + required: false From e44fa5667fd0a5469b1b5efa08187282779f4d44 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 10 Jul 2024 19:31:22 -0400 Subject: [PATCH 090/123] Support returning text encoder attention masks. --- comfy/sd1_clip.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/comfy/sd1_clip.py b/comfy/sd1_clip.py index 0fe1f1d13..4da2b46fd 100644 --- a/comfy/sd1_clip.py +++ b/comfy/sd1_clip.py @@ -38,7 +38,9 @@ class ClipTokenWeightEncoder: if has_weights or sections == 0: to_encode.append(gen_empty_tokens(self.special_tokens, max_token_len)) - out, pooled = self.encode(to_encode) + o = self.encode(to_encode) + out, pooled = o[:2] + if pooled is not None: first_pooled = pooled[0:1].to(model_management.intermediate_device()) else: @@ -57,8 +59,11 @@ class ClipTokenWeightEncoder: output.append(z) if (len(output) == 0): - return out[-1:].to(model_management.intermediate_device()), first_pooled - return torch.cat(output, dim=-2).to(model_management.intermediate_device()), first_pooled + r = (out[-1:].to(model_management.intermediate_device()), first_pooled) + else: + r = (torch.cat(output, dim=-2).to(model_management.intermediate_device()), first_pooled) + r = r + tuple(map(lambda a: a[:sections].flatten().unsqueeze(dim=0).to(model_management.intermediate_device()), o[2:])) + return r class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder): """Uses the CLIP transformer encoder for text (from huggingface)""" @@ -70,7 +75,7 @@ class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder): def __init__(self, version="openai/clip-vit-large-patch14", device="cpu", max_length=77, freeze=True, layer="last", layer_idx=None, textmodel_json_config=None, dtype=None, model_class=comfy.clip_model.CLIPTextModel, special_tokens={"start": 49406, "end": 49407, "pad": 49407}, layer_norm_hidden_state=True, enable_attention_masks=False, zero_out_masked=False, - return_projected_pooled=True): # clip-vit-base-patch32 + return_projected_pooled=True, return_attention_masks=False): # clip-vit-base-patch32 super().__init__() assert layer in self.LAYERS @@ -96,6 +101,7 @@ class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder): self.layer_norm_hidden_state = layer_norm_hidden_state self.return_projected_pooled = return_projected_pooled + self.return_attention_masks = return_attention_masks if layer == "hidden": assert layer_idx is not None @@ -169,7 +175,7 @@ class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder): tokens = torch.LongTensor(tokens).to(device) attention_mask = None - if self.enable_attention_masks or self.zero_out_masked: + if self.enable_attention_masks or self.zero_out_masked or self.return_attention_masks: attention_mask = torch.zeros_like(tokens) end_token = self.special_tokens.get("end", -1) for x in range(attention_mask.shape[0]): @@ -200,6 +206,9 @@ class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder): elif outputs[2] is not None: pooled_output = outputs[2].float() + if self.return_attention_masks: + return z, pooled_output, attention_mask + return z, pooled_output def encode(self, tokens): From 391c1046cff8a3877a2ba343057579ab4278c5b1 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 10 Jul 2024 20:06:50 -0400 Subject: [PATCH 091/123] More flexibility with text encoder return values. Text encoders can now return other values to the CONDITIONING than the cond and pooled output. --- comfy/sd.py | 12 ++++++++++-- comfy/sd1_clip.py | 21 +++++++++++++++++---- nodes.py | 5 +++-- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/comfy/sd.py b/comfy/sd.py index b39230bd7..25454f836 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -130,7 +130,7 @@ class CLIP: def tokenize(self, text, return_word_ids=False): return self.tokenizer.tokenize_with_weights(text, return_word_ids) - def encode_from_tokens(self, tokens, return_pooled=False): + def encode_from_tokens(self, tokens, return_pooled=False, return_dict=False): self.cond_stage_model.reset_clip_options() if self.layer_idx is not None: @@ -140,7 +140,15 @@ class CLIP: self.cond_stage_model.set_clip_options({"projected_pooled": False}) self.load_model() - cond, pooled = self.cond_stage_model.encode_token_weights(tokens) + o = self.cond_stage_model.encode_token_weights(tokens) + cond, pooled = o[:2] + if return_dict: + out = {"cond": cond, "pooled_output": pooled} + if len(o) > 2: + for k in o[2]: + out[k] = o[2][k] + return out + if return_pooled: return cond, pooled return cond diff --git a/comfy/sd1_clip.py b/comfy/sd1_clip.py index 4da2b46fd..565ad69da 100644 --- a/comfy/sd1_clip.py +++ b/comfy/sd1_clip.py @@ -62,7 +62,16 @@ class ClipTokenWeightEncoder: r = (out[-1:].to(model_management.intermediate_device()), first_pooled) else: r = (torch.cat(output, dim=-2).to(model_management.intermediate_device()), first_pooled) - r = r + tuple(map(lambda a: a[:sections].flatten().unsqueeze(dim=0).to(model_management.intermediate_device()), o[2:])) + + if len(o) > 2: + extra = {} + for k in o[2]: + v = o[2][k] + if k == "attention_mask": + v = v[:sections].flatten().unsqueeze(dim=0).to(model_management.intermediate_device()) + extra[k] = v + + r = r + (extra,) return r class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder): @@ -206,8 +215,12 @@ class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder): elif outputs[2] is not None: pooled_output = outputs[2].float() + extra = {} if self.return_attention_masks: - return z, pooled_output, attention_mask + extra["attention_mask"] = attention_mask + + if len(extra) > 0: + return z, pooled_output, extra return z, pooled_output @@ -547,8 +560,8 @@ class SD1ClipModel(torch.nn.Module): def encode_token_weights(self, token_weight_pairs): token_weight_pairs = token_weight_pairs[self.clip_name] - out, pooled = getattr(self, self.clip).encode_token_weights(token_weight_pairs) - return out, pooled + out = getattr(self, self.clip).encode_token_weights(token_weight_pairs) + return out def load_sd(self, sd): return getattr(self, self.clip).load_sd(sd) diff --git a/nodes.py b/nodes.py index 8d8b153f8..5778f0609 100644 --- a/nodes.py +++ b/nodes.py @@ -55,8 +55,9 @@ class CLIPTextEncode: def encode(self, clip, text): tokens = clip.tokenize(text) - cond, pooled = clip.encode_from_tokens(tokens, return_pooled=True) - return ([[cond, {"pooled_output": pooled}]], ) + output = clip.encode_from_tokens(tokens, return_pooled=True, return_dict=True) + cond = output.pop("cond") + return ([[cond, output]], ) class ConditioningCombine: @classmethod From ffe0bb0a33a8a8d9a999dafb540558646127d443 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 10 Jul 2024 20:33:12 -0400 Subject: [PATCH 092/123] Remove useless code. --- comfy/sd.py | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/comfy/sd.py b/comfy/sd.py index 25454f836..d0832ad3a 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -28,36 +28,6 @@ import comfy.t2i_adapter.adapter import comfy.supported_models_base import comfy.taesd.taesd -def load_model_weights(model, sd): - m, u = model.load_state_dict(sd, strict=False) - m = set(m) - unexpected_keys = set(u) - - k = list(sd.keys()) - for x in k: - if x not in unexpected_keys: - w = sd.pop(x) - del w - if len(m) > 0: - logging.warning("missing {}".format(m)) - return model - -def load_clip_weights(model, sd): - k = list(sd.keys()) - for x in k: - if x.startswith("cond_stage_model.transformer.") and not x.startswith("cond_stage_model.transformer.text_model."): - y = x.replace("cond_stage_model.transformer.", "cond_stage_model.transformer.text_model.") - sd[y] = sd.pop(x) - - if 'cond_stage_model.transformer.text_model.embeddings.position_ids' in sd: - ids = sd['cond_stage_model.transformer.text_model.embeddings.position_ids'] - if ids.dtype == torch.float32: - sd['cond_stage_model.transformer.text_model.embeddings.position_ids'] = ids.round() - - sd = comfy.utils.clip_text_transformers_convert(sd, "cond_stage_model.model.", "cond_stage_model.transformer.") - return load_model_weights(model, sd) - - def load_lora_for_models(model, clip, lora, strength_model, strength_clip): key_map = {} if model is not None: From 5e1fced6392ca4fef404e01094fbcbec77bdd31f Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 11 Jul 2024 11:37:31 -0400 Subject: [PATCH 093/123] Cleaner support for loading different diffusion model types. --- comfy/model_detection.py | 5 +++++ comfy/sd.py | 8 ++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/comfy/model_detection.py b/comfy/model_detection.py index 0b678480f..783a03eb7 100644 --- a/comfy/model_detection.py +++ b/comfy/model_detection.py @@ -105,6 +105,9 @@ def detect_unet_config(state_dict, key_prefix): unet_config["audio_model"] = "dit1.0" return unet_config + if '{}input_blocks.0.0.weight'.format(key_prefix) not in state_dict_keys: + return None + unet_config = { "use_checkpoint": False, "image_size": 32, @@ -239,6 +242,8 @@ def model_config_from_unet_config(unet_config, state_dict=None): def model_config_from_unet(state_dict, unet_key_prefix, use_base_if_no_match=False): unet_config = detect_unet_config(state_dict, unet_key_prefix) + if unet_config is None: + return None model_config = model_config_from_unet_config(unet_config, state_dict) if model_config is None and use_base_if_no_match: return comfy.supported_models_base.BASE(unet_config) diff --git a/comfy/sd.py b/comfy/sd.py index d0832ad3a..66033b63e 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -546,21 +546,17 @@ def load_checkpoint_guess_config(ckpt_path, output_vae=True, output_clip=True, o def load_unet_state_dict(sd): #load unet in diffusers or regular format #Allow loading unets from checkpoint files - checkpoint = False diffusion_model_prefix = model_detection.unet_prefix_from_state_dict(sd) temp_sd = comfy.utils.state_dict_prefix_replace(sd, {diffusion_model_prefix: ""}, filter_keys=True) if len(temp_sd) > 0: sd = temp_sd - checkpoint = True parameters = comfy.utils.calculate_parameters(sd) unet_dtype = model_management.unet_dtype(model_params=parameters) load_device = model_management.get_torch_device() + model_config = model_detection.model_config_from_unet(sd, "") - if checkpoint or "input_blocks.0.0.weight" in sd or 'clf.1.weight' in sd: #ldm or stable cascade - model_config = model_detection.model_config_from_unet(sd, "") - if model_config is None: - return None + if model_config is not None: new_sd = sd elif 'transformer_blocks.0.attn.add_q_proj.weight' in sd: #MMDIT SD3 new_sd = model_detection.convert_diffusers_mmdit(sd, "") From f45157e3acbef1c0edf7d31fc73ee83e7913a994 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 11 Jul 2024 11:46:51 -0400 Subject: [PATCH 094/123] Fix error message never being shown. --- comfy/sd.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/comfy/sd.py b/comfy/sd.py index 66033b63e..eeffa423a 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -489,13 +489,13 @@ def load_checkpoint_guess_config(ckpt_path, output_vae=True, output_clip=True, o load_device = model_management.get_torch_device() model_config = model_detection.model_config_from_unet(sd, diffusion_model_prefix) + if model_config is None: + raise RuntimeError("ERROR: Could not detect model type of: {}".format(ckpt_path)) + unet_dtype = model_management.unet_dtype(model_params=parameters, supported_dtypes=model_config.supported_inference_dtypes) manual_cast_dtype = model_management.unet_manual_cast(unet_dtype, load_device, model_config.supported_inference_dtypes) model_config.set_inference_dtype(unet_dtype, manual_cast_dtype) - if model_config is None: - raise RuntimeError("ERROR: Could not detect model type of: {}".format(ckpt_path)) - if model_config.clip_vision_prefix is not None: if output_clipvision: clipvision = clip_vision.load_clipvision_from_sd(sd, model_config.clip_vision_prefix, True) From 9f291d75b344d7f7e83b7bd18447f430c99fcb28 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 11 Jul 2024 16:51:06 -0400 Subject: [PATCH 095/123] AuraFlow model implementation. --- comfy/ldm/aura/mmdit.py | 479 +++++++++ comfy/model_base.py | 12 + comfy/model_detection.py | 8 + comfy/sd.py | 4 + comfy/supported_models.py | 24 +- comfy/text_encoders/aura_t5.py | 22 + comfy/text_encoders/t5_pile_config_xl.json | 22 + .../t5_pile_tokenizer/added_tokens.json | 102 ++ .../t5_pile_tokenizer/special_tokens_map.json | 125 +++ .../t5_pile_tokenizer/tokenizer.model | Bin 0 -> 499723 bytes .../t5_pile_tokenizer/tokenizer_config.json | 945 ++++++++++++++++++ requirements.txt | 3 +- 12 files changed, 1744 insertions(+), 2 deletions(-) create mode 100644 comfy/ldm/aura/mmdit.py create mode 100644 comfy/text_encoders/aura_t5.py create mode 100644 comfy/text_encoders/t5_pile_config_xl.json create mode 100644 comfy/text_encoders/t5_pile_tokenizer/added_tokens.json create mode 100644 comfy/text_encoders/t5_pile_tokenizer/special_tokens_map.json create mode 100644 comfy/text_encoders/t5_pile_tokenizer/tokenizer.model create mode 100644 comfy/text_encoders/t5_pile_tokenizer/tokenizer_config.json diff --git a/comfy/ldm/aura/mmdit.py b/comfy/ldm/aura/mmdit.py new file mode 100644 index 000000000..c465619bd --- /dev/null +++ b/comfy/ldm/aura/mmdit.py @@ -0,0 +1,479 @@ +#AuraFlow MMDiT +#Originally written by the AuraFlow Authors + +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from comfy.ldm.modules.attention import optimized_attention + +def modulate(x, shift, scale): + return x * (1 + scale.unsqueeze(1)) + shift.unsqueeze(1) + + +def find_multiple(n: int, k: int) -> int: + if n % k == 0: + return n + return n + k - (n % k) + + +class MLP(nn.Module): + def __init__(self, dim, hidden_dim=None, dtype=None, device=None, operations=None) -> None: + super().__init__() + if hidden_dim is None: + hidden_dim = 4 * dim + + n_hidden = int(2 * hidden_dim / 3) + n_hidden = find_multiple(n_hidden, 256) + + self.c_fc1 = operations.Linear(dim, n_hidden, bias=False, dtype=dtype, device=device) + self.c_fc2 = operations.Linear(dim, n_hidden, bias=False, dtype=dtype, device=device) + self.c_proj = operations.Linear(n_hidden, dim, bias=False, dtype=dtype, device=device) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + x = F.silu(self.c_fc1(x)) * self.c_fc2(x) + x = self.c_proj(x) + return x + + +class MultiHeadLayerNorm(nn.Module): + def __init__(self, hidden_size=None, eps=1e-5, dtype=None, device=None): + # Copy pasta from https://github.com/huggingface/transformers/blob/e5f71ecaae50ea476d1e12351003790273c4b2ed/src/transformers/models/cohere/modeling_cohere.py#L78 + + super().__init__() + self.weight = nn.Parameter(torch.empty(hidden_size, dtype=dtype, device=device)) + self.variance_epsilon = eps + + def forward(self, hidden_states): + input_dtype = hidden_states.dtype + hidden_states = hidden_states.to(torch.float32) + mean = hidden_states.mean(-1, keepdim=True) + variance = (hidden_states - mean).pow(2).mean(-1, keepdim=True) + hidden_states = (hidden_states - mean) * torch.rsqrt( + variance + self.variance_epsilon + ) + hidden_states = self.weight.to(torch.float32) * hidden_states + return hidden_states.to(input_dtype) + +class SingleAttention(nn.Module): + def __init__(self, dim, n_heads, mh_qknorm=False, dtype=None, device=None, operations=None): + super().__init__() + + self.n_heads = n_heads + self.head_dim = dim // n_heads + + # this is for cond + self.w1q = operations.Linear(dim, dim, bias=False, dtype=dtype, device=device) + self.w1k = operations.Linear(dim, dim, bias=False, dtype=dtype, device=device) + self.w1v = operations.Linear(dim, dim, bias=False, dtype=dtype, device=device) + self.w1o = operations.Linear(dim, dim, bias=False, dtype=dtype, device=device) + + self.q_norm1 = ( + MultiHeadLayerNorm((self.n_heads, self.head_dim), dtype=dtype, device=device) + if mh_qknorm + else operations.LayerNorm(self.head_dim, elementwise_affine=False, dtype=dtype, device=device) + ) + self.k_norm1 = ( + MultiHeadLayerNorm((self.n_heads, self.head_dim), dtype=dtype, device=device) + if mh_qknorm + else operations.LayerNorm(self.head_dim, elementwise_affine=False, dtype=dtype, device=device) + ) + + #@torch.compile() + def forward(self, c): + + bsz, seqlen1, _ = c.shape + + q, k, v = self.w1q(c), self.w1k(c), self.w1v(c) + q = q.view(bsz, seqlen1, self.n_heads, self.head_dim) + k = k.view(bsz, seqlen1, self.n_heads, self.head_dim) + v = v.view(bsz, seqlen1, self.n_heads, self.head_dim) + q, k = self.q_norm1(q), self.k_norm1(k) + + output = optimized_attention(q.permute(0, 2, 1, 3), k.permute(0, 2, 1, 3), v.permute(0, 2, 1, 3), self.n_heads, skip_reshape=True) + c = self.w1o(output) + return c + + + +class DoubleAttention(nn.Module): + def __init__(self, dim, n_heads, mh_qknorm=False, dtype=None, device=None, operations=None): + super().__init__() + + self.n_heads = n_heads + self.head_dim = dim // n_heads + + # this is for cond + self.w1q = operations.Linear(dim, dim, bias=False, dtype=dtype, device=device) + self.w1k = operations.Linear(dim, dim, bias=False, dtype=dtype, device=device) + self.w1v = operations.Linear(dim, dim, bias=False, dtype=dtype, device=device) + self.w1o = operations.Linear(dim, dim, bias=False, dtype=dtype, device=device) + + # this is for x + self.w2q = operations.Linear(dim, dim, bias=False, dtype=dtype, device=device) + self.w2k = operations.Linear(dim, dim, bias=False, dtype=dtype, device=device) + self.w2v = operations.Linear(dim, dim, bias=False, dtype=dtype, device=device) + self.w2o = operations.Linear(dim, dim, bias=False, dtype=dtype, device=device) + + self.q_norm1 = ( + MultiHeadLayerNorm((self.n_heads, self.head_dim), dtype=dtype, device=device) + if mh_qknorm + else operations.LayerNorm(self.head_dim, elementwise_affine=False, dtype=dtype, device=device) + ) + self.k_norm1 = ( + MultiHeadLayerNorm((self.n_heads, self.head_dim), dtype=dtype, device=device) + if mh_qknorm + else operations.LayerNorm(self.head_dim, elementwise_affine=False, dtype=dtype, device=device) + ) + + self.q_norm2 = ( + MultiHeadLayerNorm((self.n_heads, self.head_dim), dtype=dtype, device=device) + if mh_qknorm + else operations.LayerNorm(self.head_dim, elementwise_affine=False, dtype=dtype, device=device) + ) + self.k_norm2 = ( + MultiHeadLayerNorm((self.n_heads, self.head_dim), dtype=dtype, device=device) + if mh_qknorm + else operations.LayerNorm(self.head_dim, elementwise_affine=False, dtype=dtype, device=device) + ) + + + #@torch.compile() + def forward(self, c, x): + + bsz, seqlen1, _ = c.shape + bsz, seqlen2, _ = x.shape + seqlen = seqlen1 + seqlen2 + + cq, ck, cv = self.w1q(c), self.w1k(c), self.w1v(c) + cq = cq.view(bsz, seqlen1, self.n_heads, self.head_dim) + ck = ck.view(bsz, seqlen1, self.n_heads, self.head_dim) + cv = cv.view(bsz, seqlen1, self.n_heads, self.head_dim) + cq, ck = self.q_norm1(cq), self.k_norm1(ck) + + xq, xk, xv = self.w2q(x), self.w2k(x), self.w2v(x) + xq = xq.view(bsz, seqlen2, self.n_heads, self.head_dim) + xk = xk.view(bsz, seqlen2, self.n_heads, self.head_dim) + xv = xv.view(bsz, seqlen2, self.n_heads, self.head_dim) + xq, xk = self.q_norm2(xq), self.k_norm2(xk) + + # concat all + q, k, v = ( + torch.cat([cq, xq], dim=1), + torch.cat([ck, xk], dim=1), + torch.cat([cv, xv], dim=1), + ) + + output = optimized_attention(q.permute(0, 2, 1, 3), k.permute(0, 2, 1, 3), v.permute(0, 2, 1, 3), self.n_heads, skip_reshape=True) + + c, x = output.split([seqlen1, seqlen2], dim=1) + c = self.w1o(c) + x = self.w2o(x) + + return c, x + + +class MMDiTBlock(nn.Module): + def __init__(self, dim, heads=8, global_conddim=1024, is_last=False, dtype=None, device=None, operations=None): + super().__init__() + + self.normC1 = operations.LayerNorm(dim, elementwise_affine=False, dtype=dtype, device=device) + self.normC2 = operations.LayerNorm(dim, elementwise_affine=False, dtype=dtype, device=device) + if not is_last: + self.mlpC = MLP(dim, hidden_dim=dim * 4, dtype=dtype, device=device, operations=operations) + self.modC = nn.Sequential( + nn.SiLU(), + operations.Linear(global_conddim, 6 * dim, bias=False, dtype=dtype, device=device), + ) + else: + self.modC = nn.Sequential( + nn.SiLU(), + operations.Linear(global_conddim, 2 * dim, bias=False, dtype=dtype, device=device), + ) + + self.normX1 = operations.LayerNorm(dim, elementwise_affine=False, dtype=dtype, device=device) + self.normX2 = operations.LayerNorm(dim, elementwise_affine=False, dtype=dtype, device=device) + self.mlpX = MLP(dim, hidden_dim=dim * 4, dtype=dtype, device=device, operations=operations) + self.modX = nn.Sequential( + nn.SiLU(), + operations.Linear(global_conddim, 6 * dim, bias=False, dtype=dtype, device=device), + ) + + self.attn = DoubleAttention(dim, heads, dtype=dtype, device=device, operations=operations) + self.is_last = is_last + + #@torch.compile() + def forward(self, c, x, global_cond, **kwargs): + + cres, xres = c, x + + cshift_msa, cscale_msa, cgate_msa, cshift_mlp, cscale_mlp, cgate_mlp = ( + self.modC(global_cond).chunk(6, dim=1) + ) + + c = modulate(self.normC1(c), cshift_msa, cscale_msa) + + # xpath + xshift_msa, xscale_msa, xgate_msa, xshift_mlp, xscale_mlp, xgate_mlp = ( + self.modX(global_cond).chunk(6, dim=1) + ) + + x = modulate(self.normX1(x), xshift_msa, xscale_msa) + + # attention + c, x = self.attn(c, x) + + + c = self.normC2(cres + cgate_msa.unsqueeze(1) * c) + c = cgate_mlp.unsqueeze(1) * self.mlpC(modulate(c, cshift_mlp, cscale_mlp)) + c = cres + c + + x = self.normX2(xres + xgate_msa.unsqueeze(1) * x) + x = xgate_mlp.unsqueeze(1) * self.mlpX(modulate(x, xshift_mlp, xscale_mlp)) + x = xres + x + + return c, x + +class DiTBlock(nn.Module): + # like MMDiTBlock, but it only has X + def __init__(self, dim, heads=8, global_conddim=1024, dtype=None, device=None, operations=None): + super().__init__() + + self.norm1 = operations.LayerNorm(dim, elementwise_affine=False, dtype=dtype, device=device) + self.norm2 = operations.LayerNorm(dim, elementwise_affine=False, dtype=dtype, device=device) + + self.modCX = nn.Sequential( + nn.SiLU(), + operations.Linear(global_conddim, 6 * dim, bias=False, dtype=dtype, device=device), + ) + + self.attn = SingleAttention(dim, heads, dtype=dtype, device=device, operations=operations) + self.mlp = MLP(dim, hidden_dim=dim * 4, dtype=dtype, device=device, operations=operations) + + #@torch.compile() + def forward(self, cx, global_cond, **kwargs): + cxres = cx + shift_msa, scale_msa, gate_msa, shift_mlp, scale_mlp, gate_mlp = self.modCX( + global_cond + ).chunk(6, dim=1) + cx = modulate(self.norm1(cx), shift_msa, scale_msa) + cx = self.attn(cx) + cx = self.norm2(cxres + gate_msa.unsqueeze(1) * cx) + mlpout = self.mlp(modulate(cx, shift_mlp, scale_mlp)) + cx = gate_mlp.unsqueeze(1) * mlpout + + cx = cxres + cx + + return cx + + + +class TimestepEmbedder(nn.Module): + def __init__(self, hidden_size, frequency_embedding_size=256, dtype=None, device=None, operations=None): + super().__init__() + self.mlp = nn.Sequential( + operations.Linear(frequency_embedding_size, hidden_size, dtype=dtype, device=device), + nn.SiLU(), + operations.Linear(hidden_size, hidden_size, dtype=dtype, device=device), + ) + self.frequency_embedding_size = frequency_embedding_size + + @staticmethod + def timestep_embedding(t, dim, max_period=10000): + half = dim // 2 + freqs = 1000 * torch.exp( + -math.log(max_period) * torch.arange(start=0, end=half) / half + ).to(t.device) + args = t[:, None] * freqs[None] + embedding = torch.cat([torch.cos(args), torch.sin(args)], dim=-1) + if dim % 2: + embedding = torch.cat( + [embedding, torch.zeros_like(embedding[:, :1])], dim=-1 + ) + return embedding + + #@torch.compile() + def forward(self, t, dtype): + t_freq = self.timestep_embedding(t, self.frequency_embedding_size).to(dtype) + t_emb = self.mlp(t_freq) + return t_emb + + +class MMDiT(nn.Module): + def __init__( + self, + in_channels=4, + out_channels=4, + patch_size=2, + dim=3072, + n_layers=36, + n_double_layers=4, + n_heads=12, + global_conddim=3072, + cond_seq_dim=2048, + max_seq=32 * 32, + device=None, + dtype=None, + operations=None, + ): + super().__init__() + self.dtype = dtype + + self.t_embedder = TimestepEmbedder(global_conddim, dtype=dtype, device=device, operations=operations) + + self.cond_seq_linear = operations.Linear( + cond_seq_dim, dim, bias=False, dtype=dtype, device=device + ) # linear for something like text sequence. + self.init_x_linear = operations.Linear( + patch_size * patch_size * in_channels, dim, dtype=dtype, device=device + ) # init linear for patchified image. + + self.positional_encoding = nn.Parameter(torch.empty(1, max_seq, dim, dtype=dtype, device=device)) + self.register_tokens = nn.Parameter(torch.empty(1, 8, dim, dtype=dtype, device=device)) + + self.double_layers = nn.ModuleList([]) + self.single_layers = nn.ModuleList([]) + + + for idx in range(n_double_layers): + self.double_layers.append( + MMDiTBlock(dim, n_heads, global_conddim, is_last=(idx == n_layers - 1), dtype=dtype, device=device, operations=operations) + ) + + for idx in range(n_double_layers, n_layers): + self.single_layers.append( + DiTBlock(dim, n_heads, global_conddim, dtype=dtype, device=device, operations=operations) + ) + + + self.final_linear = operations.Linear( + dim, patch_size * patch_size * out_channels, bias=False, dtype=dtype, device=device + ) + + self.modF = nn.Sequential( + nn.SiLU(), + operations.Linear(global_conddim, 2 * dim, bias=False, dtype=dtype, device=device), + ) + + self.out_channels = out_channels + self.patch_size = patch_size + self.n_double_layers = n_double_layers + self.n_layers = n_layers + + self.h_max = round(max_seq**0.5) + self.w_max = round(max_seq**0.5) + + @torch.no_grad() + def extend_pe(self, init_dim=(16, 16), target_dim=(64, 64)): + # extend pe + pe_data = self.positional_encoding.data.squeeze(0)[: init_dim[0] * init_dim[1]] + + pe_as_2d = pe_data.view(init_dim[0], init_dim[1], -1).permute(2, 0, 1) + + # now we need to extend this to target_dim. for this we will use interpolation. + # we will use torch.nn.functional.interpolate + pe_as_2d = F.interpolate( + pe_as_2d.unsqueeze(0), size=target_dim, mode="bilinear" + ) + pe_new = pe_as_2d.squeeze(0).permute(1, 2, 0).flatten(0, 1) + self.positional_encoding.data = pe_new.unsqueeze(0).contiguous() + self.h_max, self.w_max = target_dim + print("PE extended to", target_dim) + + def pe_selection_index_based_on_dim(self, h, w): + h_p, w_p = h // self.patch_size, w // self.patch_size + original_pe_indexes = torch.arange(self.positional_encoding.shape[1]) + original_pe_indexes = original_pe_indexes.view(self.h_max, self.w_max) + starth = self.h_max // 2 - h_p // 2 + endh =starth + h_p + startw = self.w_max // 2 - w_p // 2 + endw = startw + w_p + original_pe_indexes = original_pe_indexes[ + starth:endh, startw:endw + ] + return original_pe_indexes.flatten() + + def unpatchify(self, x, h, w): + c = self.out_channels + p = self.patch_size + + x = x.reshape(shape=(x.shape[0], h, w, p, p, c)) + x = torch.einsum("nhwpqc->nchpwq", x) + imgs = x.reshape(shape=(x.shape[0], c, h * p, w * p)) + return imgs + + def patchify(self, x): + B, C, H, W = x.size() + pad_h = (self.patch_size - H % self.patch_size) % self.patch_size + pad_w = (self.patch_size - W % self.patch_size) % self.patch_size + + x = torch.nn.functional.pad(x, (0, pad_w, 0, pad_h), mode='reflect') + x = x.view( + B, + C, + (H + 1) // self.patch_size, + self.patch_size, + (W + 1) // self.patch_size, + self.patch_size, + ) + x = x.permute(0, 2, 4, 1, 3, 5).flatten(-3).flatten(1, 2) + return x + + def apply_pos_embeds(self, x, h, w): + h = (h + 1) // self.patch_size + w = (w + 1) // self.patch_size + max_dim = max(h, w) + + cur_dim = self.h_max + pos_encoding = self.positional_encoding.reshape(1, cur_dim, cur_dim, -1).to(device=x.device, dtype=x.dtype) + + if max_dim > cur_dim: + pos_encoding = F.interpolate(pos_encoding.movedim(-1, 1), (max_dim, max_dim), mode="bilinear").movedim(1, -1) + cur_dim = max_dim + + from_h = (cur_dim - h) // 2 + from_w = (cur_dim - w) // 2 + pos_encoding = pos_encoding[:,from_h:from_h+h,from_w:from_w+w] + return x + pos_encoding.reshape(1, -1, self.positional_encoding.shape[-1]) + + def forward(self, x, timestep, context, **kwargs): + # patchify x, add PE + b, c, h, w = x.shape + + # pe_indexes = self.pe_selection_index_based_on_dim(h, w) + # print(pe_indexes, pe_indexes.shape) + + x = self.init_x_linear(self.patchify(x)) # B, T_x, D + x = self.apply_pos_embeds(x, h, w) + # x = x + self.positional_encoding[:, : x.size(1)].to(device=x.device, dtype=x.dtype) + # x = x + self.positional_encoding[:, pe_indexes].to(device=x.device, dtype=x.dtype) + + # process conditions for MMDiT Blocks + c_seq = context # B, T_c, D_c + t = timestep + + c = self.cond_seq_linear(c_seq) # B, T_c, D + c = torch.cat([self.register_tokens.to(device=c.device, dtype=c.dtype).repeat(c.size(0), 1, 1), c], dim=1) + + global_cond = self.t_embedder(t, x.dtype) # B, D + + if len(self.double_layers) > 0: + for layer in self.double_layers: + c, x = layer(c, x, global_cond, **kwargs) + + if len(self.single_layers) > 0: + c_len = c.size(1) + cx = torch.cat([c, x], dim=1) + for layer in self.single_layers: + cx = layer(cx, global_cond, **kwargs) + + x = cx[:, c_len:] + + fshift, fscale = self.modF(global_cond).chunk(2, dim=1) + + x = modulate(x, fshift, fscale) + x = self.final_linear(x) + x = self.unpatchify(x, (h + 1) // self.patch_size, (w + 1) // self.patch_size)[:,:,:h,:w] + return x diff --git a/comfy/model_base.py b/comfy/model_base.py index 80f6667ec..0e0e69d3b 100644 --- a/comfy/model_base.py +++ b/comfy/model_base.py @@ -6,6 +6,7 @@ from comfy.ldm.cascade.stage_b import StageB from comfy.ldm.modules.encoders.noise_aug_modules import CLIPEmbeddingNoiseAugmentation from comfy.ldm.modules.diffusionmodules.upscaling import ImageConcatWithNoiseAugmentation from comfy.ldm.modules.diffusionmodules.mmdit import OpenAISignatureMMDITWrapper +import comfy.ldm.aura.mmdit import comfy.ldm.audio.dit import comfy.ldm.audio.embedders import comfy.model_management @@ -598,6 +599,17 @@ class SD3(BaseModel): area = input_shape[0] * input_shape[2] * input_shape[3] return (area * 0.3) * (1024 * 1024) +class AuraFlow(BaseModel): + def __init__(self, model_config, model_type=ModelType.FLOW, device=None): + super().__init__(model_config, model_type, device=device, unet_model=comfy.ldm.aura.mmdit.MMDiT) + + def extra_conds(self, **kwargs): + out = super().extra_conds(**kwargs) + cross_attn = kwargs.get("cross_attn", None) + if cross_attn is not None: + out['c_crossattn'] = comfy.conds.CONDRegular(cross_attn) + return out + class StableAudio1(BaseModel): def __init__(self, model_config, seconds_start_embedder_weights, seconds_total_embedder_weights, model_type=ModelType.V_PREDICTION_CONTINUOUS, device=None): diff --git a/comfy/model_detection.py b/comfy/model_detection.py index 783a03eb7..dd5bff82a 100644 --- a/comfy/model_detection.py +++ b/comfy/model_detection.py @@ -105,6 +105,12 @@ def detect_unet_config(state_dict, key_prefix): unet_config["audio_model"] = "dit1.0" return unet_config + if '{}double_layers.0.attn.w1q.weight'.format(key_prefix) in state_dict_keys: #aura flow dit + unet_config = {} + unet_config["max_seq"] = state_dict['{}positional_encoding'.format(key_prefix)].shape[1] + unet_config["cond_seq_dim"] = state_dict['{}cond_seq_linear.weight'.format(key_prefix)].shape[1] + return unet_config + if '{}input_blocks.0.0.weight'.format(key_prefix) not in state_dict_keys: return None @@ -253,6 +259,8 @@ def model_config_from_unet(state_dict, unet_key_prefix, use_base_if_no_match=Fal def unet_prefix_from_state_dict(state_dict): if "model.model.postprocess_conv.weight" in state_dict: #audio models unet_key_prefix = "model.model." + elif "model.double_layers.0.attn.w1q.weight" in state_dict: #aura flow + unet_key_prefix = "model." else: unet_key_prefix = "model.diffusion_model." return unet_key_prefix diff --git a/comfy/sd.py b/comfy/sd.py index eeffa423a..6028029d6 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -21,6 +21,7 @@ from . import sd2_clip from . import sdxl_clip from . import sd3_clip from . import sa_t5 +import comfy.text_encoders.aura_t5 import comfy.model_patcher import comfy.lora @@ -415,6 +416,9 @@ def load_clip(ckpt_paths, embedding_directory=None, clip_type=CLIPType.STABLE_DI if weight.shape[-1] == 4096: clip_target.clip = sd3_clip.sd3_clip(clip_l=False, clip_g=False, t5=True, dtype_t5=dtype_t5) clip_target.tokenizer = sd3_clip.SD3Tokenizer + elif weight.shape[-1] == 2048: + clip_target.clip = comfy.text_encoders.aura_t5.AuraT5Model + clip_target.tokenizer = comfy.text_encoders.aura_t5.AuraT5Tokenizer elif "encoder.block.0.layer.0.SelfAttention.k.weight" in clip_data[0]: clip_target.clip = sa_t5.SAT5Model clip_target.tokenizer = sa_t5.SAT5Tokenizer diff --git a/comfy/supported_models.py b/comfy/supported_models.py index 21fdb7ec7..ccf8c333e 100644 --- a/comfy/supported_models.py +++ b/comfy/supported_models.py @@ -7,6 +7,7 @@ from . import sd2_clip from . import sdxl_clip from . import sd3_clip from . import sa_t5 +import comfy.text_encoders.aura_t5 from . import supported_models_base from . import latent_formats @@ -556,7 +557,28 @@ class StableAudio(supported_models_base.BASE): def clip_target(self, state_dict={}): return supported_models_base.ClipTarget(sa_t5.SAT5Tokenizer, sa_t5.SAT5Model) +class AuraFlow(supported_models_base.BASE): + unet_config = { + "cond_seq_dim": 2048, + } -models = [Stable_Zero123, SD15_instructpix2pix, SD15, SD20, SD21UnclipL, SD21UnclipH, SDXL_instructpix2pix, SDXLRefiner, SDXL, SSD1B, KOALA_700M, KOALA_1B, Segmind_Vega, SD_X4Upscaler, Stable_Cascade_C, Stable_Cascade_B, SV3D_u, SV3D_p, SD3, StableAudio] + sampling_settings = { + "multiplier": 1.0, + } + + unet_extra_config = {} + latent_format = latent_formats.SDXL + + vae_key_prefix = ["vae."] + text_encoder_key_prefix = ["text_encoders."] + + def get_model(self, state_dict, prefix="", device=None): + out = model_base.AuraFlow(self, device=device) + return out + + def clip_target(self, state_dict={}): + return supported_models_base.ClipTarget(comfy.text_encoders.aura_t5.AuraT5Tokenizer, comfy.text_encoders.aura_t5.AuraT5Model) + +models = [Stable_Zero123, SD15_instructpix2pix, SD15, SD20, SD21UnclipL, SD21UnclipH, SDXL_instructpix2pix, SDXLRefiner, SDXL, SSD1B, KOALA_700M, KOALA_1B, Segmind_Vega, SD_X4Upscaler, Stable_Cascade_C, Stable_Cascade_B, SV3D_u, SV3D_p, SD3, StableAudio, AuraFlow] models += [SVD_img2vid] diff --git a/comfy/text_encoders/aura_t5.py b/comfy/text_encoders/aura_t5.py new file mode 100644 index 000000000..0e84189aa --- /dev/null +++ b/comfy/text_encoders/aura_t5.py @@ -0,0 +1,22 @@ +from comfy import sd1_clip +from transformers import LlamaTokenizerFast +import comfy.t5 +import os + +class PT5XlModel(sd1_clip.SDClipModel): + def __init__(self, device="cpu", layer="last", layer_idx=None, dtype=None): + textmodel_json_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "t5_pile_config_xl.json") + super().__init__(device=device, layer=layer, layer_idx=layer_idx, textmodel_json_config=textmodel_json_config, dtype=dtype, special_tokens={"end": 2, "pad": 1}, model_class=comfy.t5.T5, enable_attention_masks=True, zero_out_masked=True) + +class PT5XlTokenizer(sd1_clip.SDTokenizer): + def __init__(self, embedding_directory=None): + tokenizer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "t5_pile_tokenizer") + super().__init__(tokenizer_path, pad_with_end=False, embedding_size=2048, embedding_key='pile_t5xl', tokenizer_class=LlamaTokenizerFast, has_start_token=False, pad_to_max_length=False, max_length=99999999, min_length=256, pad_token=1) + +class AuraT5Tokenizer(sd1_clip.SD1Tokenizer): + def __init__(self, embedding_directory=None): + super().__init__(embedding_directory=embedding_directory, clip_name="pile_t5xl", tokenizer=PT5XlTokenizer) + +class AuraT5Model(sd1_clip.SD1ClipModel): + def __init__(self, device="cpu", dtype=None, **kwargs): + super().__init__(device=device, dtype=dtype, name="pile_t5xl", clip_model=PT5XlModel, **kwargs) diff --git a/comfy/text_encoders/t5_pile_config_xl.json b/comfy/text_encoders/t5_pile_config_xl.json new file mode 100644 index 000000000..ee4e03f97 --- /dev/null +++ b/comfy/text_encoders/t5_pile_config_xl.json @@ -0,0 +1,22 @@ +{ + "d_ff": 5120, + "d_kv": 64, + "d_model": 2048, + "decoder_start_token_id": 0, + "dropout_rate": 0.1, + "eos_token_id": 2, + "dense_act_fn": "gelu_pytorch_tanh", + "initializer_factor": 1.0, + "is_encoder_decoder": true, + "is_gated_act": true, + "layer_norm_epsilon": 1e-06, + "model_type": "umt5", + "num_decoder_layers": 24, + "num_heads": 32, + "num_layers": 24, + "output_past": true, + "pad_token_id": 1, + "relative_attention_num_buckets": 32, + "tie_word_embeddings": false, + "vocab_size": 32128 +} diff --git a/comfy/text_encoders/t5_pile_tokenizer/added_tokens.json b/comfy/text_encoders/t5_pile_tokenizer/added_tokens.json new file mode 100644 index 000000000..3f5132007 --- /dev/null +++ b/comfy/text_encoders/t5_pile_tokenizer/added_tokens.json @@ -0,0 +1,102 @@ +{ + "": 32099, + "": 32089, + "": 32088, + "": 32087, + "": 32086, + "": 32085, + "": 32084, + "": 32083, + "": 32082, + "": 32081, + "": 32080, + "": 32098, + "": 32079, + "": 32078, + "": 32077, + "": 32076, + "": 32075, + "": 32074, + "": 32073, + "": 32072, + "": 32071, + "": 32070, + "": 32097, + "": 32069, + "": 32068, + "": 32067, + "": 32066, + "": 32065, + "": 32064, + "": 32063, + "": 32062, + "": 32061, + "": 32060, + "": 32096, + "": 32059, + "": 32058, + "": 32057, + "": 32056, + "": 32055, + "": 32054, + "": 32053, + "": 32052, + "": 32051, + "": 32050, + "": 32095, + "": 32049, + "": 32048, + "": 32047, + "": 32046, + "": 32045, + "": 32044, + "": 32043, + "": 32042, + "": 32041, + "": 32040, + "": 32094, + "": 32039, + "": 32038, + "": 32037, + "": 32036, + "": 32035, + "": 32034, + "": 32033, + "": 32032, + "": 32031, + "": 32030, + "": 32093, + "": 32029, + "": 32028, + "": 32027, + "": 32026, + "": 32025, + "": 32024, + "": 32023, + "": 32022, + "": 32021, + "": 32020, + "": 32092, + "": 32019, + "": 32018, + "": 32017, + "": 32016, + "": 32015, + "": 32014, + "": 32013, + "": 32012, + "": 32011, + "": 32010, + "": 32091, + "": 32009, + "": 32008, + "": 32007, + "": 32006, + "": 32005, + "": 32004, + "": 32003, + "": 32002, + "": 32001, + "": 32000, + "": 32090 +} diff --git a/comfy/text_encoders/t5_pile_tokenizer/special_tokens_map.json b/comfy/text_encoders/t5_pile_tokenizer/special_tokens_map.json new file mode 100644 index 000000000..19fb1d5f4 --- /dev/null +++ b/comfy/text_encoders/t5_pile_tokenizer/special_tokens_map.json @@ -0,0 +1,125 @@ +{ + "additional_special_tokens": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "bos_token": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false + }, + "eos_token": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false + }, + "unk_token": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false + } +} diff --git a/comfy/text_encoders/t5_pile_tokenizer/tokenizer.model b/comfy/text_encoders/t5_pile_tokenizer/tokenizer.model new file mode 100644 index 0000000000000000000000000000000000000000..22bccbcb41ec929cf0c9dbe8f41036db82e5e773 GIT binary patch literal 499723 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

6chr$CNJq|oX{wwE3<`zH)AeR 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�@n8 z@F;JXC#NIZ{@Z9|A3;$dMY7Av@}O;Sih&S40W^PBSEvbXHT6`VjMXIs?v+n81G*l| zUlK)HUjHg{sR%x4Svn)qF4#7CJvJ#oRNkROs8~nnSE6Si$)}5v z2hg@^%%qaLA_~_l3PO|rY!~$${PdH|`Z~}srHOccn1U&RPn8?5Arha~hD!!Sq_f_& z8G+F4Of>r(;1;-1T>u(8^Zuh8rs1If1Xvo6*ID#a7`uc}+~8b1fnR`7WS|{_DKyev z&E?CP6Y*=FTDTm5;K|cd%w&=?mBsWbFgn)QSO3~I_PZ{f8Z&^YtAgEhR`uEM0<8iq z%ddiE1i3!>0BDDDM1U(r&(!1~#5|2r$B-@y&l}1DQRY&7NuBBy%nS-hXP^EYT7s%x zTi$b?IRSTiG=?64Te# zXIzpSDFdR(LwvGFkZy+@m!+0+FlEN$e`Dw31~RWtp(Riih-Z?FyN;x>+#O%i8s4Fi zcnYK#HomD-XtP+|`w$gz0Cv+jAJ?K#_0?61t@ss{7MR>P%uo^LF`};X#hu#B^xk8d4nn(POV3|UfJNe}9~C$TYe0CHz6O&zl2>5mdv_#fO0Z7> zz;t>wYzk>vd=VDt`nAhLJ(M78io+y+LNU3!O60v66151jET{Y~CfJ#Hgu<_U5aM=p zKeDDEBsfXdE~IChd~B-i)r>%l7faa@w98)Kdp8+!#|^jWPh)7x(XYf#>SV{`*N=C> zn1dUO7_R_WP5g{#4YZn!ihf3GMi3?G$=m}-Gvst8sguRPKH*3GwZJ63q>6PE4QLCG z4pj?w!G7QZaZ`ejgSUu@?*huv_94G$NdSuOy^m@cL0iZTt!{FlY{ZV}7}64*h^?^+ z*yiOpTRf+`O9)(inW6wt5c7nO>Dk_?Awqh47wDR}Q_6yD{_6cSWKPaj<>OF^gJms3 zEP;04P#kPU&kxr9{p{39_P9qZ6x&roP#Ixb01p=}0MIvT2G1h^Lam!E4nAkgKlXbq>9 z{F;j4YjoVTRl`M1>Do06V|IY3#73T4u>sx-RVDyS4DC?Qj0P*w5Jw>E#O@*b0^LqH z!sD%jF+mnfUs3C>pkyS7j_ABTe$UQ z)VEQ20BPjR93w=1=+YYce2<-wdzEUtlR7fiy1O;xmk>}Ihzv2}PV1=ST1UrWT zK$q5Jkt}N_-&o1E|2FCvgdusl9*%7QWu93)%TNXFZoqpA^t!apw#VwC3v#{nbqiJ> z%Zwm3@%W0540w!#zK{c46eoD~B?8+ziwmd;!Up=y&G7sJ>D@<3S2*8knp;ncH^vW~XsGjQ$v0JEp6lu1jux0?57R2!kY;_aevP36q&S|B z((&OGgdj_*o30bG;Tf-(WKPIzR-@JkrXjexq>Iv9g zAa%vVZXZN5fbDrYJTFr)f?k5f4ASkB`C9#hWF~0(HQ8KpkHjB zfGC+k3587$b(pBAQ@!NnG}{_Ij0tBT+kzcVBsu_N3*7-pUT<@1#BM=jKZK&f+5pn% zw|hE}2rzgseoQF^Q5ffb%GC|nrlH}+{r`**D?IPx8lyTuug9xS2|$UfuDJ^JpxtcZ zmiPn+-`m*F+J#hu-`0Ov@)2O%6cF*y9ruce|4NDjD^vf=X)< zf&^>&p}DqWk*w;BojSc9@zwk^CB#z3k9~EWeM6V(Gia;3ycQ28j|i~2dC`Hqd7U>- zpp1d8Pd%_V0l8QDx%L>32rCEBCwQjidr;namRT^+BBmgO|Fs{cvCN>&o#m$b%Yh?@ zS{o*Bs3a-hpsFz&Ei|BZjhXq8zEfjImsOJ!Yim;NNRc~Hp6m&Kg0Ki{}$oKPP#z9nwWgWBk1W|*pNO}0LuO& zqf8yg-m%7GfX!F_qWJ*w`;Xv95p_tisyYw^(4=m)Ys`;Yp^Q9Fd#j%<95Wo9~FdO3img#Ow9<0ng%+?%ngXn|p@vAhjw#wRp(c4~N9U#1kO zy78_m069uWe+IHGw&RH32yAQdLwvk1hI)j!De6X0+4jdSLn~Z=10A}F5Ewo(@?XJc#-h!k6h971IZGa2#A)ii- zPlV?@1-qp%?bgW9CBP~z^?ipXBSZqNXstFf*ng{Bfq9)a?#Zj&5`wvOGKs_!P}y`? z2-AMS|A(%3i*h`>&in9)#bqUM)?ya2;s8hE5Ls3Fi zS5>3>QU%pz8r}3L;7}4FOBNy9p-Q3@Vr0#)qR$RSR1g^J<12_}*kI?LF$ zdslZ+x(>IpxHZuSTU0AvO&CCMM?<~Z-Hbi(kt4W%mxLy`&3%}|(;hMuM9B^=nVT7` z$2045gXy2?kVtMTva)!Aq5yOaU1hjZ0%byt70wEnoZY@hCUJUAALCUFI(&n^o<6Tr zqMAmmD5yDWgJ6iG3h$9&111OKAm0FS zru({eyAL}^xM}xemFu=Yc(A46Ko{T!Anc3u6QsmbY#o%{7`_`NziaBxCqR;FX(}+q zO`dkxE|)q%Dq(f9hf_5so(j%AT%@%sITe5l9r1E-w!U40N>oQa&sPBv)nn4D+IjyL zIm2nD-_i0`6G(BCRb-z#Y(ub!PkulaQ|L_%Q2P!|b;usm86T`IQYzGNlgyRl+a z1!q}!pA7p;KR1Qj9N2m;3Weg@$L0I1&+n%1b$+66w5Y8hr#<~Wtz3=3uFmuwy0|uh zVEJ+@iaY}y|Mghij4?5^S3dFYBgOx}|0m0jcmGW$4j)n>s@%>Z<~Q%(Mj{Euo0KJ> zvnIn14-r|#0cd&RZgmxC&ey`)Zyl_1NAV$WGx>7#gmTyhQ}{j|=heFa=jl*->;uu7 z9-15Aq#*Cgpx-Ek^2<*^VmSFoUHBAWF|9J^r7q6=;k6hw*?qJDJ@;r)4AN701xQw> zZbp6JI*lXo-8DS z2;(kK0gCGU4Kj(-nP$|hY=WgR?Z#CdtWMnZ6zrC-&L+ISr{~SuV0fnxW*5l2{`PM% z*zM!YG_p8h=+NrYvFL-CMi4Aqj-`{+mrw;|nu23QO+(}v1joooJ*Gi(D9X`Qboz9m zwmT@M0CN6b#6js2n3OPB7IuCshH&B>11Tz;G9mkQ`%zTl!b;PA+PWjZ0GEwrLUuvc z9Qz6yFZCh7P8+`gP7=Hm+vemHND3^VQFkT)gnjZp;ih(f{2oe};dYA^7Giv@3!3xH zL@MmTB8 z5=EyAa%ab8M_LQ$ra1IKf=V<56+u;>0d7nFU|okgM+tAo0jY_xPWr_uyD1p{R^!|q zGDyL(ONvb92_M9)FSobQz&7Qt03zXaUF#^}w)8Y|_TBFaG)W>hf~x>?_IWGXAIF+& z6E~VWQu~B6(<&JvM_mY3!S(D0Nk0YAAvKLS65*LvSjcty=An%7Yv2JztnO+*4>v+y zXJ(D`X6a*=k+m{7hX6Cr$yBbrn2xXtM~lfm4Y`J>sAN*Bgqx_gy+}|2nRhPfXf?A6 z!P>v06AtwR!zO4GNJKl25p+9!x=JffDqRT3j_w-YzC%9NbZdZ{I2ZTGMurr>tE!|E zhkOz>7`NG3-=uPp)fBd-uycov3rx9RStxcDffhh;hLwA=h}*H;x81u+3OXH<#pK=g zOMZ0-&NKFDDbWeu6!+~E{5i7#)#60R3Vj~}X=ALNyy8Z@bnBs25G815am954cJ*LA zfr&1vN9NN+)eXkQZPyu8V#NR)`NoZCRhm%oek8#`W{pn^AeUnAO{%>pL9+m|M>#4G zh-+OdOI6&&=&?T4l*%!l7fXAAMcY%(X1B&X$`w%F44`FhElSCd# zQ6tjdSTrZM0M{y3!RUx*_N3cYMgiuh6;t|y1wWh@kIt_Eg+w?JKsIp` zEvL}|6$4hQ&_XqR$E-32o^>b|lc(vi_2Ex=;)ayl2CXf1$6WyI)1XR=eULfkXfU(j zLBdaIW67*PW$#k6d4MIvWHYo20gf@tLSAtrt@?Fxiqq=`h+%PWBX=0-(sirzD1i8K z`4EmuxE<}m-bUmX0-2|$R;>kCY&9*0*MVl3d)|E91QQW8lYFM22RhN-wO8!W_HirM zh>RX_0D{+*6*7o3D;AjRlSn51EcOhhxSjY-nXaAryJgay<6H5>*EB3!cb1_P`LPPo$hRxt84bP9nS?8rQ5-R^x2T${MbD3kUd=_#x>&~l*j zVQAk4!`fC%uloKjt_TfMKyFv4)PgOrma63h=nBHbA=}fPrXXG?2NJc;!;?<{?5)Qd z`LhrXou68t0>~V_6Q|}%U_#!ydy`x`B<82pN>o!w59jOlWw}VVbebSfGi6~rj{CMD z5mij8y13znOIyga4{-I+fM2E81mFIN*&hVQ#zU9dwIs`s%;@IH2YfS4k?gW)fQV)g zT<#gogt3n~6c{+ta!#(Z_?%Q&Z!UoGd-q*d<4d??vI zZJGkyi6x&|!YqtvegGy1 z2ir|r&98zM~!C{%Swmf_h~&%%^))1PEd*td@w4e~)}Lt9-3Gu18v#;C*C-oC_x;g* z#XYclU27&I+|E6R+{qabhIYeH))YX(`|A&VTxAB%bY`Qp^OqlM@gw(cq|e2TI7MJY znbW165(uUr>IsjE-S57NSgW|R7L6uO)u9f>spv=p(r!W^Tbw{r9c-r$I5F;Hm{1Va zbAtBme5wfzPDdkwQldr>oYM_WBqqSDyhfWiO*peAl!7lG(TmN2j*c}Jm6P1BMuv8D z8M}bnQ8TS4uL<7K5=#Z>4w#|f?tz9GiW& z%cdRdCd^CjDz@OoqAtB&R*MEukuD=yH3V_n6N*_~(-Q6kh`tf6S|)(g@NLGKJvrD< zL75wPyEFHnEGiw>yM5fMkVqImJbJ3BTM3fW;=nj^09u4RT`5ghA-IQUEcygP2n4D_ zBg=PI$-SLnjT|SX=SVw?UEHql>RIEsW8dC~YIg>>Ri$ENGqT5luK!GMt9Go%rH?6y zbe=JAnAwAZDnm|lkcGg}XvWsL?jjShYM2MAuKRVMLh`(-rHLZYg?asnZ2^>^IJSBm z8Y_b(Z;aj}5P%D|nzbd6rS6 zC*myqF$5%edl}jLGd=30wY(wF;$RUu_UlIu`;-DZ#)%}@!lrOd0A`5!vQ|4!A;3_2 zOm%9Ej(8-456;1k8hu8$I)g%d^wdOtk%Hf64GE>D;If;d2reBQLsd+Xa$k-ty!x3> z=JGg+h697&rCtN9J=+^9f)UF~W(1*>yg9r^Wh&d7!$UC;t^kSZ?02-YwPe5=lnTDV zP8fBl`KvgSf?pkIQ7rpmo`wUnLH1=73qaWKGE{GwuFExO6ktwyP?jdPV^8k(P^Y@d z)8qY~JpojwK7c}qWN%U=k3lYkZ|F+VAboi^+Vr8lxlvCIr%45pLmtefwvP>V4pd<$ z>BE&64V;3rURtkmsv)1IAZ#?#U!8-=S_|h4CtRHAw%bQ&6PQ)2O)s9$)3@94q|2qh z?a=w>-V2^izOOX$0OHhxV+GTF7Pkm+%OkstF7qV^z)CpsECZ-5>w3RFO-tLFcel_mW*HVbRSdXfMDPnJ4N5A&kdyrW?ZKj|a zlA&at*rHyv(6y->`T>=dBg>|?#$OAR^p$449L z0C8vYX6C4VYsadycczMU4Pq|rx1(*vxj#ep@s8~!kWzo9$Ctv2V(!;o62hie9)cs|#HUuE zz%CXslP?<5Htk9(B_O)ct*|mq%X*UzuL2^P^f1_xF?>w_p(;letRi|q*cxt2uQ@Cc4KLoN{m}#JY>9udO_yxASP5mL`Zjq2s;K>pWi~b-4yVl3`+HYaIFK! zeVi_CvcVul9H+4BC-g`IAdIf6Qyb!To56w8*ryzMHw1tFz83v6@W7o)(4h=ju+9y z@!zULvynoH&T%06YiQK#2ExLS6jPt8@2k=*f^xJ z8j#^0Qg=%^rW`}w7d?vPeFQ1=~KPvQw3#0kV(fc>&So2F_6`;@>vHW zlY4bEij#zVQ>_VrKaBEme*%%Tz!rX(M2q&=;d$f(E;|5o!hlJq!@7x}4N+L@K|tsC z)m-**6T1u#M2$NJlVjE=G>0A-$q)mzaR_qJ!wSuBO@D-Lp}4f)R#Q9%dN@hNLHQn` zOrVmRv!06kDS)(}i|uLp`qlEMP%tp7XS}YcZeW%uJWw0vRW6`dS!;0(ah@=Dj}Xo! z7>45ZIa$y37P5GtonDj;!QblyADu23cGmT%L=iVx*LnqMm+XU8a&(QG9IV8xnu>!- zCZw=rgc5)5bEw%LJ<-}o&F%y3-_~&xf!`Bv0C+c#PhwBgR(d3lCLWe1Pye9k1fv4B zfv}3b26T*@_%Of&=mMBq9v#>$AK=0BkVR zi@lK%&?37XFXxQGSp&qm3JHCZC{(Wf9cC)0P~eZwno=P z%jABL{=(nwKi9g?9N>gh#l+?%6ti+8UdPM*<|60pLur{X4}ti(cMzRGA^Gq6CU?<< zvtQS(IgO4=5L}sL_$w~DmK_J`xgWhT5V7yKC?QL@vkDMTMWAp8-oaGA8onCP(Pb3? z)kDe}hE}X`HWK0Kdf4D;LU69Au&Am9CPi%Q(puwogc}^ZX3HAgLn4n%muwCMnAI9q zF4Y_L{C!+9?K?1;;UW-<2Rf-Y!eI0u3#ubsL)_V1aIc+S0UJ5QmQF^Dahn-EO%)F^ zO(3CL4K7b{nvr`Ok78Igg<@@EMiAu#-I!jZnVQ*?dpR+Sz5trDdvSqfp0I5SUV;%y zyfl{k`w=e&Mx*P=8F}O-L>WJS(9c@m3;Wwo9iA z+7OVX%>Q(7BDuvw0bL+jT33tJ!|jA_P$T*vi%pk#P_TVDwi+9AAgB41!>_bSLkQN$ zrWV>p>1%G?BA;;zk6{5_ww^$6K6pgbwkS^_EmmV+zArL`>WJ^CqMid`ORL;*sB&hU zte0MZRm7E{IqtvliBF=w|L@-iJ{|ERUE<08R%no2RX`qKQ7ltB3n1cr<+HD#cijGJ zU6L&UEhR3ttM3L=4)iPqx(7IqGKEKrMm_iEj3i>TQU#LEvsNs))j+7}{xV9p2g~Lv zA`OsJxqqaYXfxr1JxvE%U^B&nDe4Bo@8P;eVJYadtu0#cZo=FSq}S}FPxmw(>nHES z5X3QcmmRSwb`B& zxW9FU`V4|0p4>vExUIxH@p?le`|!`bUf1-8+6Y%mZBL?k5sftv>2O*=iyi>8e}9i@ zC{pOA(D$Uo9*|VyecHa=k2Lc>#%&Hbq6Z#;ozE64a(p<1@YiBl^Ru6&4ueP(BZr7! zY_C;6(K7*A3%qcEIunddgDKGEz8&k#l+bg3PJX7}L8S?8Aeajf>99^lIhZG}U*_45 zOOQF%QA?Ei4;CD+zY{k2@(>81rR12O6u=U=4%-xQlbhRY*{OxL53L6J#7&CWhbLIY zfQ4Q4!vKqfr4tR-su0WpJIhpp8kn53ITUSq9Y`8CnbFhWG(gtOc4msV3B{uDBcM{P zKS304kzgBSN#4433*Fjtj|B%h{Vpg|SeUZvfyv!{-Tmw1raV7KH^(^14t0mI{{Y|! zujvB8(0*Qx7$v_oovs-J&D`c<(Pje4`KL`%gLVqRJ<`k3DV+J=m)U^2rIAC#Lyex5|?_SusCmPY!Dc8F%Q z2`1ZTY?Ny$v6Z}a!VRs0T@W5HTvT1_K!N!>p534N_IuP;AnfgU$k9(NO{#?x`#v6`YkOMle*2 zS_-ha^?>45PxxURU~Yh&KFh)J)NvCE>^(own6{O?Imp)4nm`*0%y2#eZ96C`pf~FR zETA$2h+aZE9n}ZHR^59fv@gdHh~?;j3=eR-ejd;u>}hRa=7{yuwIxem6(QJb=b#n_2_0}K|-`+m+i8^kTGtMVbvjOHjtaz)S zH6d97`!vI9!dm{CP6$2YCS`IIbE1wR8u2a!&H7? z{1V#6Nfy$}@2|)xxZu)()-tpFx!;XIvK*DiiI8{nVoL${qI2P9 zjz)|{NY+`r3{wKa2A)*+vi&&L6eoZxK!l-acB>w20A@30%hfnQ?xOw9YZ3C@|7y$EI@KTxkX9*MKIi6(Sf8AZer83?)srl2r!66NEoab_zm+V z1Fl~nohra_GF%|p8d&A8%g)x<&?L|;=QW~ffXoxs(l6;WA*J3-?U(8*H27N6ZfQGx z!tn|^846(sl9S|oEVv7H8tUhJ3BAsd;yy@vj?JE90P${X!C`>g(&J>j4tx$FxXIx9 zbu?fjD2}&@*}*Z$yxSxl6=VX*#dKBs45ta+*HX${+XS~o#^9A(YpClK zk`uTYPeTEb0*q>Wfquc3qISrzLZy)wG?l-wu5#h;F?|-j!5oN`p6;YaG%ukba}Ic^ z(&hf~LQa?u(%Nkvg2nobT|@;bIEZY$+iG+X0x_uLg5eT~)K7-$kIMjONS!{fxlyel zA-$uMZ=zw`h~c$&Q7_IcBYH47mPKmze)A66#YwCjX1I=G0ghF7kfY=@At4tIs``XU z3v7Mg<93Z`)cBsR2oXegyU6CZ2a0 z={9g$bJ1;4bs>-wswZ=8*lB^0G3=MD+Vh2qo> zj?_*AohMo0LBU{`ej4BJdcZvMCp3+5ZSo?0Qe*D`1%t`k$@{cImv-;To>}heArQ8c zP*)z{WY?nV0?8!nZ9+vOohhY^l^k?2^DNtwEb7{D1w>-;yucD}E1KPD1|ea9uL{u_ z!YCPIz#7#xxS3gjok20Ds~o4N!a6(|(N@kJguu>N8nFH6 zO9)hnRanmb-a;hta*FC<9ui!g{7D@D29Po_=}JZsBwcArUczlP&{(TEFGDa}tJnP= zQUwa>EZ?9x#_4!|o;`?a3aYkSooEe;bI^`un>yI4q78l$H&7aoNbr7`Baz;l5L^Op zXuQ}0!nZe;+5m4nF5WZC6yCwZ3GwJD33tIxh@+c6(A$Hg;{V5JrH|XWWS>=K`8W~O ztL z#r`~ftK+@eg_IlnwT ztJ7`;2n4@Diy6&V5$r64ISdL#35rU+?ktyaTNr=UJ*I907xkG^LN5+WODTqDXh4)| zqSUkJqH9pxXhlPSVyNanMdNsE46Pf`T&!d`yqV(RCPlP7EhtD|YyR}p0E(k-mUU7{ zhW*iEb)k@pw$7RLa61>9T14#w&5Yg=x0kon~ zC1ba_zu($W%XkTJ3Njt2wh*RszaKJ)lcjmw4zRw#i3mR`QGnC-(w90)R|Q#sGAoQ7RvH9I7Rv3d^@m};JVl`s9JKTa zuVFy|?Ss+a&OWuUh1-nXz^4sTDLDB+s<)R8^CJ5$$T`}M`Cbo9BotQkj@vBQOfFit z@6H1{#zFGM_E#LE7()5vC;lzk%B|g>G7md~>?*|`p+qx=06S-2(aQi60CJ*l{!q2? z6lk%tK(4h04H>2mv#{QL4z#qG-FT6928k&BEZzlx%)f9WG6y;NE!!2jgy1ZkFlw9!n+4rz*|AZgLJGvZ75x>#3m%v*Xf>z=$qBJODjk>8H&lH(hzeNU!5!3( z)B3r89rc4O=sGiEjY@0&RMs`ZY+)Vj(zK%?PXm}Gg*|1$Hz5$U9^GrDpr6=ft z-P!E`N%%4Lb_v@BIUcN{X|U9D=!56nJ0YFEVH{8X9_shUD0o!`z@DI+(eP(sS-8=N zbY#e>lo(=-fyirLXEQJrr9G+%B5daWz2I^lk#Av#`K8Yblv(WK(oXT zo+GIuQ1wE6RtdMI#%x)Ys0_h5!O|5CZRO>++8A0&kfYFO8;A<(do=B68f3n82SANq z-Tpe(LR<|H2|rLn+{Ep44q~3(O5ZM?|7t@a&nMrK#i33LZX0;r6uh3<_wPY*PPF8% zDxW@?{uAlsIAK;P;B5f5RPL*M43l@At4}B$OnhpRHAJMUrvOj4#L^_;x8p$gX~LZ9 zA^vH?NCWAdgPq<(9Xp-bTQ?{V_0Y}*7*XzVdqE0Mfj_T0bP2R%S+!sz2EG4b1jj6i zrvG_R=Ks`o=n7CQ4tDLe(^G^XasEY|5=*|^4%UW68G?(=3h$ixUGxexRFt0DSpuWJ zIQ3k`?aaKb3R43T`ASS;>HsS67wJYCINdh9Aj?gVxs=rzeb;i(+qbCPIL+{z*`^i* zk_*GYUEIWT&DZ~XMlwN19DSpGTNpX^S7EJufZI$mhCss!?#3Fa;Tf;0XtF;Bl3QQb zpkhtHZaOuYqf?E}9HR5{cRq)PL1y^@6FQV~p1#TK_UgdQ3?j0jHzdS`BiMNn&A=RF z2012)mK~A}46>E`BkSvh>8n7eR%tbxdcSSt~B zb}=o4jv=_G@zD*W(}6@`(et-moaSr!?lszPpo-f&gzDqAGU7gjhd9Un^i>wL2RJiL zus%v@AEpm%%Oi%=BZzKu-Z;{R#2D-Z-_|181W4{E#0y&+r%+&FOI2oy+ey@AlLci% zfb#?7KEs(cX0e%k;qPKSZ;re8iNB6`Y3;pklIiXeA9Tkl2G#i7f3_%E8j<8d6q)Bqs^8WbcH(>4giQ&S(aIrrC2K2{Lh`661D)|M8ZZ{oFUh?=9^Z z+{VF?PE z++bQujRrW@RrTOCAiVC&%t;+LSU3vC4VxR070!%S-kA`pnbaLMA9{SUFX=Fz@m2x~# zI5z$23W_vco7X53VBP6;fhowb*}B;|*z2O%{p7I8H%p<|%0&McU{@3N2@hDiL9dWP zR?;hO__*GY5Oae_kIq-e4fCMI2#bZKDI z4Q+tAI?%FU2Z#`~Wf_xE)-k$}Ncxvwqe;f8a;|Qpj~h1D;tkJZfc3l5+R_5j0D`lx zGk98T8A5SFv5qzZqA}*&%J3K@USsjhpZa`AwA-gpNXmz@rhu%d{F+W4oI5yjWJ#Pi zBWR7GSdlX067$OoNW>p!P3O2tc}tIWpjP{ANhP`W7fdrTVlItl6NL^h?!gqGz{~R} zwnYHZ@?sMDwEIW}qKw-d`0+)mdj*oqh<1;>BeDd|LgLm!SZu07A@;McYeZ5r;PRpx zVgO04w-99mH#uN`Rz;u*vS6_`jCO&jYgI!koW$lwSUU#Hj8#z$=q`w^2e3pBV_@6| zJHnf~40jA9hMhOhDpkOY3c? z4y?CCvOaNY?|M8`at_F5udI5|0%{00gJ^Dd_tY<6_zO>E=K#{u>J%Bf1eq5s)5Wwt z_fJAN+lU~K)A4M_#l-^Hxej#}lQ+kKka7v^xSk#PiJmePm-*XSt%ZP~I3UBI3O9_f z{iZ&kYQ(mH=3F%pDN!-PI(Qw3!d8}1EKV1aJ*;2JlppGa=477v=uHcP8Gpm}Bf&(+ zqkj)I3hNkBAC_ZH)bQ**KVH}~T%2+0r@;S_iu*B;sJGgf&eXJH047Jfau0DUM~9Jz z5y)KeNSe%ej~$fP*3dETjKd?1fKS0$InPe1PoX%Yda`RHR+-Kn!^wxL!nny3&Cocm zn*&LkJiSG+o*SL~37SF4APSU+E4hEVP~tNk%gh7e|5MsXE+ns~T0AHM$-qxtHizKC zrk##0nja!BLnLzcENNgX0CO?@4KxgrY&4aq;&z56iDS^?}$)AwNGH&9$LYx(xq{VCKe6wV_&Sq3` zS}K_DL!ZD*DqKcXk*-6r%o!49&!04)xqN&9V-U@k-*B>0qHaNfhYbxj+R1mBlfXJj z)Uof5%p`VkJNd1LB-R7MrQX>>my2*}n(d)EA(~7d#XCepAUxwo$L>QxDFCBHROyes zcrkHksqDkESnfE5;bra%v$>_s-tp_ow?$53thhNnxs_H+Ts+UG4;g3J@X zwx=n@CD=myMTD07<0uSgx_%yKU-J+ab%$XT9~7XFBv<*m>LiOmWW(_vKnY-;vndM7 zhLrAoXjB)r3@T7v=rF3Ga=!!t-GuepDsH0WycIoOEroo#6K#1N0;OlQPIK*m43vHg zeH&<~j;aAf_dxTCHg3{l=`P!L=|CXM^m;mR+XY#KtZtxdptHb6iJv{|JN(Wj=P=PZ zh^QZ`Um0XR8Y@wEjTpVEw2eS2G`l)fGPc(fVkC_Th$Jbv(Hflsts-9ZCWWcJDGRKX zQ-2NhEU6|?Ga%fr9zNHs^#Wx5=whSl%H00!*K3M>X{2)X1JwJ^B4H+OG4{#>oiO*K z5JdqD%WM1Ui;4i`{2H~fgp(vQ<5FdZB6(7)0GvJ(@7)73w*bbs)#Tstcj4)Cz?>Zz43yWCPM}JFUd-n?Zv**dTZFr^ygeRTGYU3nR zZ?`me?*Od8nja19LO?Ru1xA0k#f=;AJ}4_}+4lXh!|wj%8z>RCMR$Ei*A9nZGqZW)e=nOvH%WQ~2QN*(6Uc~JY5}k_d;j5V` zL4;|}snh^{>*OH?qc&@805VN(NI$4?o^_!3Nt<&c&Q zC4=GUdc5U<+v%;nMWdTOreHmZg^)HRE0_1!#cl@z>BXx4*J*r#6bjio?cpR|zXgZe z@oIKB7s@*UR9TJ0kk9!wia*O%%Qtp!&@qAS!Hrw`3*x!cY}i z$7<$43MErFowmEQC+ApV6p{Org_IwtlH`Fdz^fFl0>}yRtyX7>5S)40BhvND5)|{M zqcEr%OlJ3WMzDh08i|{baprQ#{u}CptGFp6Zft4*@<3-87Z~aecchVPBMXORU0P>= zBV~OtyGGxFX0Er9MjMo=HIBY_{P|uSGwCKzwi+mpJ+QN=g$d&CL$E3|0%pmDdJGBH z)c@%a&LD-*(f&9zHiSe@v_gZ90h!d;0AP$bwl8{9MJSnIW51vTh7X3^VezR9bUtWXb}+|B34nxLIOd5OmmHj8N#}$1 z?MJC0>RR%9OG>T-oi^{Z#A0;Ap_vci-86WIgEG`{fWf5=(r4;^QOwy`gm(;KpTLYq*JJ--KPAAK1la`4ZDd?-Zkk$mk#hP~5 zTew}lA4t6*^S~3ioP9^j4jX2*ySU9Uuh=8up8cNcPGTRo)8t~TRzQ#K`HHS53~)=s zf2nGYhErHteU+XOghkgGD+fe4hUUc1zN&tC0!ABH<6($!3Xs~KZfF)TwHMtSS~~|= zEUU`;4CrXs6w=CM7B*%Va{$pW#8fnwATqzWaRv{$?<|BPQRG1xM{&!q0CtvFXwAq* z5ke+CY|rZkcnJzhxp5Em;za0saef20JHuGP$*j;WIRs}Dsld1$)g#6dI#W`ELjJK- zNlJBqlYX0X5o*RESd9l{x(Tv8)r;CXNedcsxxr{jB5wno8P=W=TgTp1o>dj^F3|DG znoSQx+IN@lTu0LYr_Ji|2T17{0y(41qiKhH7LCHtU@u+-839P26G!Y5+^kQJ_n|5B(7*^QFaEIC^ul~0;dZBmzk)^30{rW zNuU$dMTpoB{O5~2vA!T_=OH)k_zP*N?agsW_O|i%Ua_U}BI8B%bJ>hN&MsINPP^J1DnAV9r zYJ`EAKf2e>PE}s`BZ@BX1E6f6+j+0o$8OanL@De81d{s~At`RTp`Sbe{&Z}Ns0*M> zIx*ZRWmC>mgy%l3rU0Lv-3-kU<%U{{T2?0`~@mLQPq`eRb6;wB~7T&baJBbsh) z_t!yLx?#4j0Y=y(CVvJb>+C3ylM4ght)O7c{n-=m_+1(uYRZm!NAVRm z_)tI|pyKCK2?Y@1;}9fO7`Jt$-D;RC`McY3{J3mDUqFl%fHTikELd4epWfa(QjMu5 zg7$l8aB7Kg&r|j~1gqtNR*)LND2_CCP28~fpcU7JS}9=cyS9OrAtwvt5J1NP`~Wcu z_SZT@1S35V65D;QO}M^+7x<4Ij;2gU(*__%%T2VH!4K_E>HIy^S+`< z&ICw{5iwX0h<%zqxuZMp=Rk_{XUpgmr)9Yk#$GSLIZMrh8uX-H7AhsO_byJlJ6n0y8{iz5orTqccZ^MIeIF>1Q-;Kk~Yv8?zco5@$V zi*!=H1;x^>sT8(>$YVv8-f6py;Pe4pbV1_c(@{Mpes>D0kbhOrwz1zCEJ z!t&j@effNcrHWZXHJZ5#kn?&iCeJ`;BF+_{YzQ#Pr9aiDW9wfNgkwMlzZVPuU7Uz$_L@jgdsvHADWPN*&R%e((uY`5;5!hU6qa7~C5RmWA z`p55~SObnV{2n?5kiC1hLNf)KtJsQ-#cD`!^`;L0&u}|~*JX6;0;r<(BQ37a4bFZ; zhgvQH5}KEQavv@-^N6F#s1(e1$d9ZP0L1@}%0aU&`^n4N{8iVh^lA167whKps%9?(%UYoN*NgNf|!^)>3O-7EL*qFdY) zl1=0>^d~F@9)?ZzkultCwblKM!IUtW?96NjPE1jVU3v`!cM8Q!c{~k-Z7#%LUtAkK zPa#%xQhNqOJ0Ji4$#+n3^21gKO7_<}J-axSa0$tZL1J+h`cFe-45MN^4I=qA+ifaM z1$*xCW(vF&K?|iGsqrq^8}`5ODRk~{K};RcI1s^Hm#%Rl%Xq&>g{TTfmMaQYvmak^ zi;=K(u+<#T)9yqyhURh(mvk*e(S&4P;tfcY4Z(t=Z$sZe#6mAlh3h20whYR3fs20V zAsN>&qX&(Wv*AbP`uhjOYoaft_p1C>y6oRxvI?mT)zK=tARB-WY7gb$u%~ zvL}$tCnr$Qw;^WwV`*?|$Oc06pyxp6k`ay0BhDberY@S0+y%(VO@CLX*5+V1-G|dl zJ2kn@eLt9xO+}pv(OyFylEkje3rz#uB!i85 zY#hVV&>ynRpkg_)ug;IhO5fODUisTUL#vG&S+Wemfq-baA-H?tWLNAfPNBf_fghwf z2RTO@Y(t`HFoOHstEd^Li&~g0u-%clzt%Y?@^G2Ho(|$N;|~^@ju)}EHC2X0zP5A{ zrGT5HIX|SyM-gP!G^>_?N>E%9vLhj72$>Lfv!1>J34O5qOB74#1KoKdhAITu*K;H_ zoR;rejbcy-I-?IyJ|Lrw7gbzSM8W z(TCWP=s|SRTBQ#3L1g~q+fp!YqPfmQ6%7MmPRmuXs0lQ4({E^MGfH?hD&!b!!O)9n zvNnN0#MgCc>NExBo*w063WkNZcQ!SHKL=ThD=n@99&Uz}ytC}GJY;?*lO)-t55PtJCWP&YL5ea8k!>kynK_Wlq{1B}QHPd=m> zPky}efnUph(Yd#AyWF&8_oD;MD$qLS(I|9XD3q~l=(LwSTPzVMralx>q2EK}cJFH+ zZ;(PRO!f?+nBg@=jM5<>v9mwWTEQ5wSUS-;%2>@n?cS)pKb=`I?*==i?xSdnIh(#%?KtO^kx6y9$+hhj@=~nHxdJmQ2R3-T_eFzNJQ_#3e zjYboJy>1N*n*LU1SzF0(%dZo)Ay}<7<-L>q@3WzT;<^yBD%jU4iXIqk@QT#yXf=7# zBf;cx`ud)&?F<}Xd6Q?v6x$F?4qsz@GQx?JwPi+a8ap7R`F7kmn}Ct!&wl1JRAjp! z>D}-tZrG)NkK_C2>9hL2uIbFcS;NRtG|mK3jUkcbyPrjsI4y7%U({t>CPHTECHKR~ z9m79lkvCYrdiy%n7+^VI@RIhs2zFdN)}a=#SeFMX5TZg$}fm+W-^$k(Sq*xU<5_!HrfzjRq|=NNvro=ARva znviVVp~}>SeSvFaoJ=FupB&#A>wmL2yU?oJah0CTh6E%U>RY< z0Cmj4=94a0TwVHOO4wE1kjnje#06ZI4b(i)pWlrG9tAL>VQFKrv4P5=A)1qqh^>@9 z-&Vg>20ArLhlVN@2#$|&8R3^wfW)1HL!KTOg%d?REK5}==sjrA8J67N{?dt z44`O#=}Racr;EWdU2q$e6_|L2q2qwJXjr;9iGY0n5|tT1jy5&n>*LM@wsoj$t;Y^| z#sNmO{L+`chH@~3VBXlLfHhPwf<$bw20gZ$JvbDN8{Qb%Ycci|WZq<{ff^0YIuds9 z)kvH}fyKvB3}yh*$wm`nnK!wBM7CvbXpYm7@!|{3!==5-{~-$gQ7D)pNW9^c2RbBo zw_&ybhS{refEqUus>+mblJ>RbHR^oXVZt#t{IKFigh2k_b zC_;+trO$PCh@wRK?598*&qG(oiJ*NDvM_*vlCtBm!{m((F3ogC5X}EuYBv6we&jGDFnp3rTN~}-y-(dqdy12`%0bWIt#VSV!;J&56D=ujW@2)(j21G5g+Im z442d~HEFqz7EEzyfI18$;zOJTJInMQMVu;?Tfc&Kaa&e5cuk7JScc&EnX=KBRublf z7WrHPJKMWDK2il*GweW8R>edu1-YZKONKWzZBTE!{~^`;3yIbg(zXj&jx*5YzI zeYmQ%?hepJXr+ZAGkWnZ6w1iEzw{-Bkv#ypVig+Y;wF;UU!%_2xk}X-;B*DWs5&D! zO2H74bBn!Sco~7SLaEG-lQ*Zo(D@{J^T;C=7f6yHf5ewl-0;HfQG|UCFsmmY*huBf zL097;Hr%!~r`f<+vi38FZdq<&079Ems23X1Vr8G@@7!N3xLe+ayL^H%Qz!tDBTa@% zZxKY!kg#X^B`^^^i}OY0^yO8plU0BgjP8_%LCK{QBF-XL6MRQg)*6tcXfj_z#C3a~ z>8Q*PQE>A7JHLQ-L6$HRJLwmUY93P(+775%fG|7hvwQbZZ9+B1$32iEp@k&peK48P zi!W%{fF*RYG5}bC*nC63K*{95^I?a)6RRd;fa7Gr@psUzJs-q5>{9@m-PCQLsXf+X z%zti=mLBh&;r84lGs(otU7RMqz{61=v{iEF#_U0329_8v!B%uU0B%zcKVE!u9TlKl zFd5-`SSVagKsn7dHiERaEUA9r2`2G5z;qj7+<&E-J) zzY!Qs#y-I~`90p1m4*q}A|y>cDyLD=DMaTM8{}voXuh^I3ZZVNNI11X0yD6)!n{BB z{4bzn(aLM`|sA#qfyRX3|*O-aJqWyB!0L+EJam064(Rm3puq$f?+d zS|3c#_f&I^{aI^E-T1(O(Ij6D0V)qnw2{!rUYyAVi~-0&$5k{pm>AOSpM1!Nr$95x z=sc`KO`({9XJHfg9E`M1-j}J$89?0VRMQ1+S0Rd)H(BP8U_%otG;j%WVcC0tkqBDs zNwBi8vz7-EGxjTptpMQDb=6+<2{IE`#FL*o!o;ftUAI@Q_klMfiqpF1EC zXOA$+)NJg&EgACa@o#E9unI(Stj7>t z4dC?kCVL3J4ry@`Mn_SZfl$aB{)!zmvfTtw1~y2mh12}dKt7OW+EC2z$=6Xkh}^)c z-%IF%ts72r>da6N0?ab;jb+=uArg;H?HHI1c>D?n>K!B+licjk&@jsJAMgt*@(*(v?ORd_b;R5(G$_2<0d=?hrXg!qXN+UpMBX!Sc-|F z{bW7+S@P$s=~4S}n;H5O)yE113r{DS_jy)?766*Fq*DR=8bntiSq2AKh@nh?VS`TN zP;<>XFePdLp$LV-S4P?`b*> z$n+d0RZhW{m5iX1?i2!Skg-^1JO^6#9Ak)Q4`+$OBqkcMixdZYliJ6eCqiv&SB2#g zf=iR0e$1Uj*0}AAs&Qvh@GH7tr^i|dvsYSsC>AYaLWTf39aMrwd|X77pvxfV;hBxx zRv-{*aHHT$;DxT^VlcY)H|*hOvxgc4CqszrGC>_0lJg>O17OZ#?+M}%wHvQYc8oozIf2a`Wp zxYZLeh2)LNFoaSBJJM@c(Y^zd+Z8P}m4QS|Swu1wgY~E#O8~f~mB|jyR3TU{2i)F| zK^zp7B-_xhgQ#>T?=ysI_+zeqsz$?O69VZl`6Xj502#Y=16AX65uW~IHMbqGhC#Y2 z(M^6dR1Bkg39rS=vwbjeYGV(r0xVpLjB4%x0*U<1PgA>b!Y4&f{muyFByIV741U=@ z$1{i%NG>sNsl=T6`yCoH&=drV_tmVO<94ca-FoYImcDGjV3FIf-ByBNj>A-Y8EBn<{62b3 z=-w(7I-xJUOI-$$1RIOA*|;s4S`5YN_QN&<8pZ7d4wUgGaFKD&RG`!3|47#l+WwT& zPUsZ3qxExEU9g$^4}Ko4CST0Yj%csJe30W5l54YC1F8=hnL=AwNn=_nBULu3dG6@A{u~FwXNGF)HDI{_ zI(9A{`a0Dd68T1Zp1NLw$=PkL*`V$JD&!syf8}xe+jvJxJ!}CIVL$%HPriz_0T!4p zFdS!>JLv*@rBW%|CFM)VGa>aolSyoQssSh^tLI>5ZdhPkS1 z1CsTJq=~+nFgB=Yu3P?|6I%psr|)%vbxTGGJ1P9*EnU6nf?akvBl?1VwFkjtn%I10 z{Q^e%5aEhfzme`Sz+63GgoQpR3y>(dCqE#@p~G6KBYSKevU5JRdnYbi;ifDxUHiWJ zoKt(9d_-DP+z8{BxF&v%)3U>~%8t$p%n}9R#vJMbiUq=La=4p=VdX_Eq~TU7f5GtU zcTn?xy(qv>wV;&;T9cpp6iQB>cjEW~&|+YqD|=pwy95!|?%qSyI2S^Q9uG}Ja(u6_ z0$-UYyqt=c2uH&hCr$} zc}R)@ODB1&Z>K5lLO^r3!Y*tNU|G4`_rdVUDUuyo#y`%&hWVF)0fSO}h5!;_wO2=A zM<7RYGt3K(6UGiFEKd@?#wZo-f)U%NKZ9~{lJ8hXKF95>uwbd;K7#f0af(8X6Z}q66ja18j)Cf- z!NvZO-cg>W7@md6;d8L6=l6J#n`!I}$P)R1E(JWq812(77UO80FQCIlX2^IBBF2*s zWIX@UFs zBr83YwS?Ohi}$ZtUyQ<6b%3p>RLmM~V$<{ z7YxyD3Vt&?<t>5-2yPExt6(cL6{ay3@WfM#z+8V02{bN3()fS;!i zR#sQ3#lWl`M0{{{0l~UIKHgL0T(P}c4w=QobfNb zg4RLEnInqSr@B98yc)+S8bA`F-5@UYJWU7o0mK%7?57pFHW;yAc^zfj3uV`18KMie z=-!r%I=XEL&UQSE*H8WjEau{W48aPYev>8{;SQi!*t{fx@P`T0$$>}d3r4|TRiijg zA?`8xLjPcLO1ne?rvS@kndf15v;{JS1pg1()N!0no|XQvD>1X@9X`FV^9tjOHdFb*9_Q@pt()~-q>RqgaTHBVy;+9@Cm^>B#O)a$%i!8xJg;&SWvG$ zc4Wn(g&RhfnF6;>CJ8i)+Z=4LZy>RDp}06{|EmYGVxQ{9WIqMxKx#bvbqvKtL6cUh zQuBiWD0xMVv0bcTTBC-hGm8_SVe#_FqIhK)<{o6kUP>_f<|1AspD0gmf@i_ zT7y93Te8!s`<->LGjzal3kjzI#WR9foA}5TyqO}pZj)`TM3CJHQf))9J~uQL>;Rn$ zQldC_lQ$<1(0+n6fM`F3K6rBSEowEGJho1LKvaViHU|Aepk*9ZNo8-70szq&%}(l% zO;8WRS~B^XK*$*CXdZJ4MoL#$H=W|72yCeBKTp9JFN0_Hi`#n_xGikj%>BK1R$vaz z*}kdC*Ci0fAIAf2x&Pj|h1@u&&YdQi!bcJW9SK*~U( z)hHgF11x}_niMQSBto^nwyIi9p=_Ze4rSCJx{kLN+fj8$E&-c5+KVO|P!IalBJtI+>T4wJ+M>eu^ILa`JfMpbRN8*zc|LN z?9)@}%=7?=a$cjw8`{~T)fwSL3M@bJ#TZ~IXq)FL3uJUl6Np*;{7dc%{3&XN;)3y% zkssepAy|pZt?T)D3dFXO77S+)oVA)p02e^Ab_;dkIS0Xpo?PwE%^UeKlnsy+W z({tk3Jfli<~7xCisso{g{?86jjj_G{$ zN=GbZohPb>#EZ%B460*qV^@mdE)B_rqYLE$=Rjpm7Je>qlM`NsW|WXS3y-*OmB%fq z$BB}HJ>F4iEaE0}FDTt5oaUOt52zgIns*~!u&ekhwu8~S-Ou%oLKU~`f$nN^DMhVT zEqzSaPBpHBEx5>?f;1e*->qLq?YNyZug;@(pmQCT1%4FIvpe|SI~2eUZflTXW;E^) zQuGhv!T25|H+PSSu@Cb742%wj9kd-KbnHN~JcING=@YepLy+^8T}{`pa|97#U)`bT zk8xW-wYYjVv0pTir?{P=JL{ZSp90M=uNmnI>iJK7tAj){u=%51-&p5`npi)%NYT_~ zRA`>Qs)xzlOE7uNF3;xvhe)K($t@PFsI++q7QuarLjeR!I;|zoB9IcnsvJeU1Rz^a zWD%f@+Z8}#L(Q}+4!X{JZm1sMtZ0sp466``my;e})?Bp)v{bxkP`9_vfl0;Qhlua3~_r$`jqo5wqSrFX*q^LxO>tr$wijbD732hV z>FjNyeG1L$Z|kMYbALdlr(Z|cAb97*CHsHd$oB#Qs=zcAxttrE9jnk^0*I%!C5tB1 z=>IYJKKXMP%HwttG5#n3Ef93CqFqe>aS5~pBn>)j+NUzW)rHl~r!h;dKtgRhEU89* zm(u44VSd}6*VeReR|7b$`+LvTk=7v)Uv?P&$GXVafaGGJlies9j7I9K=s9^EZ0Ytz z8w_gCh7a*E`P7SduoVI`GP!XT{4jnqtIN}l#aq2vnmOXR-Q$T81*jdQ~ zRW!F_L#qI?s2O`vJd5D09_?)(>KYIg+!2t|SeGmVvpT-NAJ&N~P!QUorYlP+Fejd= z;6PG4@Imof^1Lne)PX2(J@n8>e!S0%&VkbTo9G;;)w=wIwNRAq@7BV!R0rT3O#eu2 zNEb|sJG^L15+nGLttUV@U#&5I!--(lA0gSP-K;I6W(Ro(=gj2h7t3fEwsCCdfZX#kWL9IvwWYKcs$9tH~ z^fkKy%0df5mSxRA+R6U`OQOWyfnXVI^SBt=1(O1UUo8vtK&t&OR9pH6-bp9Dd{N0r9Xk0&+BeY?tckx9)|Hb z+!o2%d(ut;jNZS%5`Gbz$|Gcfoq_#h<*&!tjGEqb!Y&^?OV)( zV+VBTh&(JBrBA|o1^OIAL4vwJ$-yK_-NXcRLma9Tr|BE&ZHy_WP~6t*`OEB~iF1g~ zJgwNnFx4=FZG9iyu(Vf)`eiz zZZas=ptR>8YO*w#piDRj^+4BB)kGXav3PG?r!4pb^mxFz6$;qU-r32H5y&#&`8m(c z#*kR?1-!*65^_}qS?caJ!=fED zr_HhgY6g-CZk3Uv2EY+d-&cumrm(RM)B;A0&==41779fxJVcuNMax(*xb zxY0!QAgH>?cmUc4Who7m(lOYzm7{Prgf@T#XTHWi1Xx7e0*dokBPeA0wJ)IW^zn&sMYoKEVkSXG_cYxNp68Yeu_k;;zN3}neLl|#Ki7YTJG@H~g$h;+}K<{S*q zake@uR=NLu5#&ZNnFkYxEOdJMRe(UI^g;ky21swWQL>#^eh%&0sqKvlPNyh~o@f`G z=}zUK>X5&9g{qr;7$u@rpvA>VB217s9ANQ=VKW6dc;X3W3ksaQv8pZfHo)q@>5~FafrwSZy>t6exR2Dr&-@w3Y_wE&0kVSG zCQ!AU+nZRgq3%l%`C*-u>id6$a5U|s_5v&k-L@>)>&;lSECRBAwZn{zA-PuVN>H89 z`m=bfxC|kxH;GnoyN+rX#p^0d=>v|K>I7UB!eYp#JzA&``b(M1w5r z(-$}F$6bx@YZloATA|BqEr$J*R`zvv!LbeWGL+hTcGno)l12wI!hAq^@1{8DuUIZY zQ$0u|$v7E#_5sf3CgTYtcnrZ>yU77T^zP7mVNGucPTo$ zDQS{uaS}4DDV;(iaUBUn=>S)aC$Y!|B);+$mVsut%?1Z)X=^UPWNDAD<~Xg&>#WRO zf`||!qA;KPKNq>-0E))1c?d*#U(?$HZZVH72F6xJkjwJ}j_7HrtCT3LiN=+?G8FjR z(KAERI?y~l+*9AW1U4f&)m{aWR7*W=4R_Y^>D>+FQ+HTaSEJ1aS+iFck76_-kq-{R zQRZ6!PI6&h1oP)xFYko4p<7$L{HRjefnW*V(OO^^2#4Bnv#O0(>5BvR)AzS2=49zO zeIIvy2lfvuNO3E32!V`nGM3R+STi4`D74$idh!?o`No1GRU9`Gp`>Xvc?z<;UU0|` zb%V_;sZ-B^^Zl`%sYc^!@1og##?b8(XoiJg_eprb&7Tu*SAAKtrPrhLy*f z`;BpvGA9z)zeUwRr+oHht@@+x^f8lgc$sFnTbD2Er`Zo7}N6hzQ>mm?{-h`y5S*hp@74smJGjZy zo!s$kX`Qv@2!8cf>A!J0c6J^QTL`U_VmMSW>jJGECMb+gdtkJ4^5+EY<3`xpA4bXP zyKAzzHn89Gc*<><{2u5!!w87S%o2IKXD$x$fW@DRt{@jeNQ$kpLbB|?Am;v9^b3+<`c1wdNe!wi=al_*EsIhZSO zL^)Dxeb+$hpQ|ej7KPKav}aYSx4N0wxNM`ZC9u<+5m&8LwdI;+jZYAQN(NDUC|nou+3Hq6|NB%Po9R(0yakx+Z>b}JY@>;siH z2J?FjmTJ(sqmRz$=|6C^br-Y`Ca)SYG=I5aq)2988;y?k*x`@TK1@=htpzy_gqfk5 z*G++uK{i54M{{UtyUsG(g?!E9r{-cnvMLQS_C($1P(lscprk!lSGOz%+VN}i+M8f> zbi_ffTDn<6QOjT1#^ME2tmd@UM(RjJ=!RtNx^VLSw#_*f4=a-H0l#YjHjSC`Lm)i7 zRvqXgu&YUqYdXp;{^Ooj2N`nQ_9=W?RjLM} zp>k)gGiaAk)KyDqjH;qsK?p}DrFIR%k(=L||KuVlvGH~+;3km7xCXT?rX`dxT;4*p zHbd`8p=_*r=M^v6JHaSrAD6=9|F<+p|-5n!?ug} zIFM8PUo4l8r=XHJuUe9R4oN4k4{i99B-(B<+6W}k!`0Vp2GiPmfzC~R?Fpm-#7JfA zO@p?45my$<2C+MRUN$@Wi1o_JE-1=yd#qZ%2kt~>o>2N6&bJe-N$+EOfS2_gh1Ho~ z`zA#vnzKeUEF6AM)KqFNu=?gYEVTgQv^xcV36jM80>$>9y;`!n2BwiZ5_gY91f>|S zcNuRAcUsc9U8wD~r9S>aI~g>&j3A>oy}>QH6^MBGOx3bEP`TD7N`fDMohAiScpkCs zqlYLd$$?t)ew4U--)6!6FUOB_sCf#eVmWTyJ+}NDEwU|N1qS?|wK%onbHOrb8z5{% z>r`8neKVLc@69bN0|-gu)pqV^D~$19e3?@7sr8EST4CG)DxZxVTl2esl%&>MYmI$R zem*x{8}-9LD$D9ERt%Br-mzgC6;3%^edT%Ny36x8T9~qSR5Ok#gfQJMKby<wkAKy0jNz#mIXeHvya-t~;ETgz;QcD9J2C;mHV~ zsW;z^x2tIH0%4F39~FamsJAzWou2!T^&sU4_OK`HH=k2=9_0&d!nVO*_&M6{@!9d> z@+pk5kE*48E}YD^)dfWxzE~em)UM9tx?9vnfBrgy378bumExl{eK@VbaUs-fxD zK6UEnvKgx}?~Xpg5sIqu-Y%4kqrI@{!cEK#AdX(QL>-hKMgg^e+6)jJN z@scZgp97te%d7bxsSW>m`?;>tHAn-bKlvMF>B5zMTkay0fndcrz53&-0C1A3>p82| z4x*HherN|q=dq*zz(SjLeHWZ6WVyTqv!_qNq-?p?&4y7l9!E4^qk>pzrgKy{HoxDe zny1ox|8d(-p`$63w76{rxv3s0dZOI-slUhHzEE!-UFs8Yb4K%2z0y;Tm)=zjpqH75{Gcahsjq2O^mhv+ZiD zwfxGVQq+e423#dnUHu~{LjKW%-=gUb{ywQMQ+6OFovhvO=U_zgCO_qN+w+G1BKkI$ zr*9y?8@p?Hz5vQPoD^vN6H)SaZRDAA12({Hn}z+E&S?`c%B+ zDwVnZ!?&1~(k&q1qKvGT3NH2WCnsu(ccqU%V$_Rp4WSI~yvnmE{L`z=bx>a|KvmLu z@MC7GT^6u}68Rix7ZonUibBE+eI;P_{kr@5Zh$E@)!heVb>_TSYr-k;Yvxqc@DKst zL#jZnGCl%TiG!I5J`SSvZy!+wAnE-2Z>pltg`=8sw$D!ShX1m$^B4T7003S!uI2el z`*4ifYpAD7+XE=653Txa?IV0pmxo|&5GB0UtV9|+5HQeglinrFTs|_4*&`V7z4KFx zlEbK_=jK{78sNHXgR-MQc>iiq^Eg`AtBYmIbz&-?)L5Llf$-X9zYAblZh4H;HI(!Y zwd(_`I$S|ZdR$jp?|!XM;`MUcT?FyJ{S}H9j9R^oXCSczOP$m|P`YI(je)FI0<7}^ zcY&_gYxj~pXwIAWQL$Q=J5|HC7T6A>>R%p$$%{K3Sv-QJZsNpL9s^ZTYF*{2FyY60 zt!mM8gjlr6XSSBz3DG6?ZacHSF*q+_NniA3@tGt3BvwhturEC4~6S?hj z5kXO2sXNDS3Wt*;E)%2f9vd>Lc*}64@Oqia3W${n0=X-Q=h^eKwKH@d3KJi?I1pEB z`MGnueVCu;XRW+8w}?jwR6XAITpj}$;yq8*!eJ;23D1M;f~eN^ZTPQJ+YMs0uN#9# zs#&69DAI{pm%G3~VsOy>KC~5*ZFlY{z`nB{W=G*(tt^Tx&M5G`2bRnO%6SP&H zOK?|>JpGORD+tlX;Tn5h1F66`pwzyY*bnN!P1_v5*~gxp5PJ#iDjlPtTDY@F zALWBKyuJ&kUhdU1+=mFSrVR9(ud6>cp=>879wJ5jr>f~`7i2y{OA)MW))fJd5mJOB zZ2%uQZ^^0F@SlUpaK935_^;Q|tL6e5A=x`b!NN8JNtZ#@-rN8}N@pvGq__5XcCMC6 z2YYP14DW#D#51j(C4?f2ZvBtek-{jyDtZTHs9CEEZcH0S5xN$`@V1gXilQ2yuNL*V zu;iz*P&}27Rj#+rwpu)gki>uK7hQw0(8Kp@(s2n)zaM8)p1*C6_zHTsJmQ$gWOGbM z3Kw-+rd%c#QHbd$-&_3w^9EF|S%bi(K4$eoZRmy)k&R8(aAPH3W}JN&P+n7kA34GF z7im8PWw7{C>xFCm=O&4C_Ymgz{)_*gKh3%yQrMHV_xKo0DGtR2htVV9*~Ppn`SU*d z>h}!-HvBj1U(bJ_PHY4TdHh{9Vsrn~*>PeU0MjgcV)>kgsixRl5z{ZV(GX5cn}et_ zG?l8V07Qo6l2(%0g%Xa>w#67Q30u8vvpj4LBVy!8jh{w^iTM>%ucLyg!S#g2aY#a> z_{Y^)Oo5TOt0;Xpm!HYBjTRTcRO%CxXD4gch9I$-2<8eDK8?j&uXPPYdIycgoAb~j ztXNswya^;VJL@&OTS7>w_EzT0VDzBO=}K1m7-Jt8Xxs%Au^mgkFC63UHhm?yhL++S zXk&$k`P@Z@Y2!iMm==-vAc z22O1Ve04=Ka;o8x+$sD#pVhOf)jw|dZ(B~huW555kR;m;kDI}KJAJmfmkc08j&p60 zxV4Y4`VZO*U4wlDmprlL9k2w4E&P=pb_IICpiPYS^s#d=X&6p^r^er}6}C|XVz4+O zt)oEHsyek}LB~-@%yga7g`>2wI_PiuUIvaxazjH@p5QP4GP4$p`fPu8x1nA^OS^H{ zaOxU_?e_c&u`Gh?4N&=lH}krQDD(DC!jfNnK1puwfBZ9UP8kTYU{JMuD}?F(>5xGsp$kjJA=w(o1zcz^ zWX%Cd0j-3?BB_J!_@YKKgJq z2amxdZM0g1i;S8yNt+Q;J9HxE(KT!x zKug6h)oq2UQlAzc%;&lc&(zlX(hdX#s5x7^iFp^SeCso|J%Kessp~z5!Bjgw`t$6c zdXc2w##~2*Q#{69%M{1+!1xtnuW^|^VbptmIwi_BQq2tbF zewuFs#|=+g#^+XVv1MW3Ot)JsHUr_p+2`^w8py9!yk)l)ke#bNJvx!Q(xCGrj!#p1(x{)U?yGX62!!(Tw`y#bZ=1rH z-0}Wf)kA%o%Fohrw;Z*DVP5sCG0Q?9Ujt96m*9w0cFXN7VISkr>K)u%gR8Nbn5?17 zB7}9BwYlp}FzK^|TFzcV&^Ua@HrBFW>TZ?0?Ln^~MLEL`rqebowf1^0Vcze5-rrjH zHCXCZJs-4NWF8_&eZP`D5=`pn&v2@&w%{>RH8y$|gQ2HTDxbZEy3?{o0nZUhl0zv= z{~y*hQ}bF=G8}9~OL_Q6)Uxwt1RNf5Npa1w1_FtfYZ2{(l4~!34+=+;@4IEB>cS2b zrJY=V4{BFptITvRoQzx-S~HJf1a;0kVb~Z2lyh{9z6DcGo>(SnbZ{IgQgpSYDfbkd zoIN7cj9?B$Vw|u{{TF~_<@MjPt4sOS#6iAS0(e&7>KdT5iuXbNw%Egcb+P_UFsFQv*dZMC^b51Qkdo}db`%_p_}zV4PA0<$l*8{q zH68_`%MaQuI7eamI4(!e!o+bw!!;#{85Ol&&YOeMrg-bEyIghwEyA^lJ72?}ODN%E zyn28upq!fja$7Hl!xz{0T3uM|kb!9<(VKhFJA-o07$xTW-sm8x}DZMx?S155vlZYUTHTAQ(;>NyseoBiS$D{+A0`rxR|QC zkU@mVuMW!W=zr#lc)^HmS5G){a<*P8+!I1sWwxP)5#)QiiZLpj;?{;^-DX1nXvyHs zS1BLrthk!LsUGgFvHlzw(O36fSL-aGNPT9UL@o(O2ya-Mqs+ zIN8>G=q4l?eJRxo6G2-5YJLFAA?POF&4K~0OE zt66P_{vjL*pL7)*wjUu#ZLZCh9|IWCiPEsJl=qGueDe(|hSKyphcMqFZ}^{EEqd*L^q4X;S%6c3 zdMl$%94_@yI1QI_VRiQ7pP^d8uWD5qsYSGK+Ri26?PflBjXf_3rjor^o{q~PRxY%3 zSAY_FJp1k@=DJJ9eK5MKOZ2oMYX~XT>2~AHLzw#Z9yvg-!eL84R@bp;J0GKEl(zST z<-ZH3N@`F0L|!wrqiHzo?JXao4gX6k>5;vZESO&oRnNQ`>~e2y{y_ipzS?8onxFT2 z^JTVHdj?@58~i2(3wB$7e>b=2)`cCr65$PXZ;zmY*pQ^-gssrguy8nV13o1OHt%#_ z9Z$^JdJAMqILw`0{k!lSOvOlY@E_TQSE>M+YIwt(X3G2!{90e{UB;lr~i> zA$tPruE?4r4TEy+ZfY2Xl2NUoovWeIQKSe>i%k^AVFDei`R0^xl5Y0`&Vi}(XD8q7 z+~*b&eSa;JUJ}NdeoVJkg}j1*?FlXNHNhlhCxDW{Tgjj)f zw{}i#5v61OuT@)r6P74JfAwbi5}LB^YfJOXK!i3@RcHlNx?lK?RoT1wmW1*ObTu6J z(Za%!928i~2TqVubiya=p`b^?5yk7O+hZs;oC$0jc0EPJ$F#RLm@g1MPSn1|hX1X7 zZXLebi;Y1zIi%&?3?=GZjc5lz$$XIeZ~+FEiHTgKJeZHI=+&%r2b2PgngeQ>b|I9F z7;f#!$FgxYI&+fYp7d=)!DdvWNb=Ldsboii^`5X^2cvbAs&+LNXzkDx0+Ie|)%7{y z*uT*yjbVQwKfnC)cIp-;wDLhB>nr(X{IoIUHDRfa_5K2j`O%Zulq?*9IHbaQ!SH0w zz1iDxzOJ4iGFd@LH8EMh#9g@Cs%Xa_TRhrE#*h8cHphY#Wbc^1@?n0dBT*Fp2r3n{ zeV4}ofxc~8|5Px-t_x<2#-1mlJLsrl!~ecs;cKZ{d#NZJ(ZZOs2R_&g%kxC}j0^}% z_*I{76_nwb6SLGd2qYKVl~qZ1+><`K%bJt9Q|qcDy{5 z=@ufwnRaA*4akV)+t#*^w6=nhQIn{b7S)nRaEjyDV|D6}5yJ6ktpz;=Dd;z~anA+i z#gyK9gQowF^>~MCA$=p5biD?l`fP?%Vc$AoV$8$`P%!r^gD-1`w)WAzFNpI&IBe8b zk%H|&z{dFM-*01~T_7d3Nl?83D~CNHVTTWjJr^Gh=Od(7%gtsK#BjSMgjqwqQq3BV z!{JaB<9@DdMxkccnoxOuWwyM!Thq3Hk{PPChk7f5t9#A&E}@gquaVFd!P15cKQVX> zN`{&|-W!WB0oavc{5OFr-$&9W=A}TK@2jSA8BE){*CBI*o0|8po{AZoGC87lEYa3SH4}!m+0}>Tvi{ z;##K@cR9cD`?3K}!C+E;U~{|1?RQa<*!c@}*yTQ~ywkawd#(Sqj%Kp$9-nLu(2wAf zof7~LF4cz2V+4gBI!wue$;&$^ZQJ-c3P$T-ZVgj5{GY8*JQV12BhV~^IyVbfydQCh zx=OoXS|!T_obGFdVk;Up$^CU73>HlrMpJuD+3qffU&rH06YNEs=?KU)8fkP+s6( zJ=x9v$AhJ}C9qo>_#xY|=2}N4mQkb42fx#7#hi2{AI3k0b%Szk+gE>S?H|*2ewWRw z)rYQuDZy;pad-$T{cK$+@~HpKOG!-bF^og!(@IWHA!W6U+FY`pgY5pBzr?Kn?^bN9 zw4!YUlEGMe^kXv|^J)9QmF@tNbUT0Wtx)8|&823xgMA9GkC)HS4p>h657Mz<#-Dq? z>L_R%S%TeT6~j=}W?buZA&sMiCl%SU+fi7G`>Fx&BM*5GuiApCp28)l&93H9sCD0L zZ8k0d1orXE+vr<3`sk)&EcXgpiet=DOT^a@N^ZZG#1=ukj+L(qwf8A>8;%-_r9K6R z8LH=9Mo59m%dS3KK~aF0e}=*ZBj38Qygg)aA4wKe{`IfZc#rnKragzM#?}}?LXW^m z#xrT~V>sN~u&9Cc)5Mq7TstcUh85Q{&e!Eeo(L>fhK_t~!wZ64v)$&ACnUJBr}4Hr znd@UVp@n6mdEJy+vpK2kd-H1>wg@JReYJPSQU*}S|HOr2=*9kH+Y4se)l?v*RfQ`1)P20`hzck8ojw;e^gxy@+@KoTd;jT`sLbSE51c%QU}G`sS>-;g9!849Pc{F(5je$lRZeSUMo}^-tPYx2 zM7Ier*2g?$Q?E5$J*5p|iThYjDd*;D`i`ThuW#1KYeHCotD>mqKnmE6EobuUPkyT$ zE9L^m-@EtQU)wMbM3Q^!!0`eYmfM=DOfI6NP>vUhaS2u_e(C4Fw&Aj%{M%0V72#yr zxes4ONJ`~&P(!h6iSBgC*EU=i#%?XBavdGA zo3Ye?**5q;0qMzuQr4|ZuWS2Y87+LcGpHR~xs4+43?EhisSVY-4mQ?jhl_&imHD_C6T7j7-`@_U!F4o-crK@2FjSV)-!&hF5=&fj$wIhl>K+yUkE)sr!GOv8bCOpP@<2@kA^> z4;XGx=q{c7!`wj&Cg5<@8t9%1JBc>HX= zbh)MfX^=1nf?O(78?!G$6xtT$S{u9-p(}q`=QgmjqM51=gZWxEt18iUC~SMhDNp6? z=p!6B%DAD_7yiOE*V%c47AW!?ypRX56T`Oags)QfU4d(wZx{9CWx z6Xvj@xX%!j&bl==o&(9z15k?oC7jARTGPo5|MWWB-DR*ZAat$cxC=hXVS#~rO{$8In!gJsp#?^jc@2Z<k>JmvKWWZSI2@g)>&KKA?L3S|uF&D%RgBlRFBB>9JY^I|h=1jW|Xw z+*R0m2ZhffrA#1V%Z5&MBvV1H+I(%p4Ad!P`dr(Xo$HgRcDi%#nn$cE-4=fr0A^iY zR2KzPp{zt|x=Uu4(8Au{lIi7qYLmWZGJpc^pS3voE8|^m4DT^M7W&B(sig zx0BQ_AmN~Gt!xy|r|lX0P5J4qkumlyoEq<>5ueofm~26f{tpoiLx*K%JSpcFft06) zs>a_c^;R@eeaUX=Ho;`}EAg(dS(ZvK;-Y#m6YQ*mphd?!L#Zw)tC zdk`nEGTYrjZ^U0@50osvT~%%fOiI=4%4ZlM9KO~+iZ+5KZ%2Pc7|j>uk-hf&Wzu5^ zUH4d5%aQ-lM4=Ehq2{v35M(-5>zqvFIH+8$Gnf!gMLOt=db?m{3W-2ov6ww0m^lpx z%69KZy9H$qIayjOY6GMBd{cLDF9;^Z*>l|8>TaKlNHXLm#KeWu%#=5Vo9xQ&FC#__ z4x?4Obp=6@-DjX7zuJG2o5kAv$Vvg(eFEcsY_BG3SvbluBkV5uy4}am(Tf#W#wv0RW9~q` zd8u$Z^`6q6F;IE#^^{uLtLwDxql5=eDGK)~9Pzy24htGyLr|Vm&2jQGK#p}(S^5w2 zZ8vFS^T8^^w=dLU(Ic34>k$4If?;ldcj4<}lw{-xZgt^L`Y7f1T&j8+id~@j8jTb6 zGZf6M{JGNCI7t|0&M}J)+01I040sOn2=mvOx$q;5QYsziuG0r>xRQjdjo6`?CPm=gso0( zPmGf@({m-t9bjs|8D<@_(gGUU?d(5Pds&5icl9JOPc?7d-AL-q+44r)BOF1Wn9Kls zsQN=9SpC{40`A$oH%?hS*lKj$QF65V?T@@=@{gE%AeA4k zG39YkL9@eKJH5K~#K3%RA_DRHLFsoUv8y##w03jR98!c{#h-_8W*&ASi~9@t`s4D^ zzbK5$_4`LJ1xoC_TBW%RM&t(;xHHzO(iNmAX|TP?eYKCGY5g#kjucVoVQUz2y^oWX z8(c5;ao*s#NBK8Gc#xN|&3$enq!0&4^A<#Wbr4hE4s>Q+N9;+3+2?!W@=$I0nl6Xn zx`cPr(cDHzb<*wW=s|Y%s^A?#O&o#$UiFgN75U%oqfgh;|2>e%xk@m1VFlE1anP>z z`qL1IO&eJY>T5m0H6pc~_ZdQ1Hda_RyQ9>HXsNE#CEMb%6#6-GDxU}HKB#s6M=0TZ zf6Y3-0LcQIhD(nD#du9?_axCSbi15SK?0o5J)h5@;{PA0tIrdD<=;~Qz7&?&sdkCO zhJSWF>w5m9n0Wz3@_$xmyHPM)@YrSYU@F1~wr!Ywe%85e>-y99(^J5DP7P!*U; zf74`t7{aXu9o@Kar%xVeZIc%zEr?x%^6?+*33bp>36COVy3z){8pE0#xRA5yHn@domDds?#9X^a84L6wdrF@s;QetP;5@Z z8jS@Y263t_qg{lP|ADhLU&rdDKFa=fJ;-G^#Wnn$siFTBl&EW}#$Z>$Fu2~^N#$Cf z3T?~ydcHAzYpvuWNJBqwK5`?$-~5=>CwTE9a~JGNT_zu`FCj+G`!2K&AptX^;jktmq?vGTzaVLkE=ZK;>N2c*!cw2T&>k+j4<+@p zr7Je~Y2wb-=ypvQYt8dxW$lN0bA)8$(qSf_xCalZaGwiD=SNXGfDkAh-pi}HPhJ+C7;*Y9@mZ@*IN|K z{VUAviOs{Q0Ch=doXB>gNztA0b-Z~Gq`V`9OOuQ}>M`Kb4C$C;ax_5k0qXgjYv#*)c4O6Kz~~^{XG7)9AIY z@Qv!9uEWWudXREwUqp%KI8M|q%?*TgE~)z_h>e$jy%yetWu<{-r%UbRwy-qMT5PYjW(BO;;2}{Q+=0sIJfT@*F=eRB9KSRXJ zWKD>l3oGRL_C&y!fV|A(>)q=O8{1F0IP3)=8QX{;yN$3kY%DQk;gnZ-tg)7PZbl<& zS9-SY-7qE(?qkS;k^0+|Hw2|F{>f!K zK*Rlyb@FlqlI2S;mviSR5FST!@M0`+IXl);;!!A)YNLa;HFXS4;_94ZYHS)zp=zb8 z`F2hqCDB*8eh}^yf-K$iO@lM}UIjT)Gr_qYw!1Os19NQ*`_7jhp>RO{B0%UaCTH5h z$>TkDiqgnsgw8}Ka~aDOlniaUYin9%x{69@zxHdoX~D3b!Mg%qN0P<8zd^5y!ja-= ztv%n!Pv<6$-fs#=E)#WnwJlfQLQ}{Gmuu5)DUnZ}QTk7WqqYym&nxjV9MO44Q{7nnL6mfx?j2C`P?4P{-f#oAGo!#G)#&w+I@yDH4+96|nk(yK-KB5_Z(mEOky4U`YX zxg7F%g3?vkHt~F#7*vn{_Oj-)o-$cG=``>hg?>i&>#_x-AE$F20WTZ>7uE}SpiKS+ zP~^IEe4`-7_^DO@z6nas#)AI=^M<>M?0}5k)E8Uw1#b2-i-G=&de4A`2iLKg)tcpO z?NcBqbNEumHZ-;6?OL20?7x4rO>?&Ax5L%A>=34w6WwfXCm5j~s4=&W8X?yE6N~Y? zA-r>&)zIQ|Pkud;k;@R2dd_>BuL1K$!NvR4tBxdm@W>e37ABlGMHv%J2B&Lh97-)| zSJfQ@)4-j#^xzah3Gg@~CTf-NRE>ltf~~*H2cAkA8S*h|Fhz1)u9jrx5}$B~=jR#I zJdDZr>hggFVKwaBc=dM|fzq2dz)0c})D4{sdb-!fFDJe$m1KM+z}~hN@G1~tn7g$b zZLXon$8BqjSy(yWt}BRWa1l&(BDrjI-N^TCbFa3vSvE>+!W^W$gxZMx7OGUwt^Pfx zEgV_yCD~7)RJ1pmpT{z+0N?njKm9mjq{Hc{q`QI;4NO%VcqeeQrly2&7fh+nO_mcV zJ5L18Zf&jfKA4iss3ooc`V=V@eAHY=he`))Xvww>aTz=U*4b{YIzEJwjUB*N4?jmq zVO*DjuSbbrkA;i>MNpmPg&srI+%I}J6{-0-Jb^?k|I=mkM}nLnX#1f+Cu>;N+tR-l@ss7jk5=^Dgz-t=rd zUos@R8p!YJq$^!dp04r6i%1kPGJfVnje56&(q5?QvQ4-vlN;m^2J@qpb3<`q9C?&V zd3FF1tp^dx!V%=t79YUfpnSgmbzSft;b_j|;NG&RHh2gvia0-Bdp5&x zc&Yh>G4aS(AN}#V8~A7<4O#WGHsY%>1i7589_y$uhTm@Yj2#0~{Z3VrdmIe^4=z_f z!`e}zA?nF}>QhKq*y|dpoNb>$2#lJUxx8}q*k}-`3e{tZJVBFFSK>LtBEAt_CU!sFzn1td8Vgr zm|X8aG@R*Qsaix;i7w=x?Hdq5Wl(<;NORPUd#g~l5W^i)vm~|D<9*JqYZ72$cWa5h zURc_0@hro>4QY}8%+F~71Um`qx?3Z2C*L(6$h*S0D4$E#4@CQ?v_M3CKfhWWuHifo zc81&j@ERrzt=ntJ%{AFJB6i)hW-6Dya?|f#R4<>wfr5ST-RhW0#bc$!$gmzh(f+xdkSdcD_kaPSSp9yEXvA zgR{{Z0O451yS0V4Ek7MSG{XFa-6#63|IeSczz?avZ%?0VZ=UWzk+qjEoT`!P&fr{| z1@D68Xz5y0Agp8`wKi`LknCTtiarFUOrzF;*v>FQ7_XjaB&gdHAB7}3QO-|e!cm{+ zLb4Tj6e&sXE60IjV5D=z3l7?V9*<1d{gV@L3N>nBt{VKQB#^6%^!R~wsIjCy*MEPw z?O)8p;lO5~Hbg~TKuYD)9P0+F{k@2$gl$OGrsbCqlwzuC+-2eLIN?$!b`KL(F2J}7 z5XG6Cpu3jOKB(#4b>WnBZ<*s_550(C7#~O%%?Ifwm^_?#lE*Dr9@arw?^5DE_-)&e zKV;ZoSL17H+Ko<@QKKX;6jsM|8zD(*V~BPIR-{wqqkl(O^84E&)ZPBe!+9|LUQc+l zJPjCnPZ)LU88Lr~pc3ylFI^K%Hd*retdBeE6g}=AB1DC=r%ttfpwIg#ZpE(^*hdJ_ zl8$V;J;U@x|5f=jR|D}Fg{135J(iw8q&s~odznu`1v+=3O7{#PiZ}pQt$L0S9^Krc z4t)t@|LsHUd(%31?MWN_zJLpq%|)rwd1*s*Y_U zFdFdScOU#V69-ZpD>C@h#iK+d<*#fxnw29ZvHi4tJl{KkRt65F+S)Uz)rlztd|c?x z-_GRsGSzId%ps&;1_0vE!(rg0*{?RbPt@spAMu`WcyI14#oGNu-?u(0_%zW^uKs|@3#Y0au0iN$Uww`B z=3oC1iNa6L%$76O=Rr7`uygS!U$@h6Kh&QG`f+aBTI1uyZ8z|-awtMG4XQ^fRHmni z;e%RLdskfvxqj2jgU0ou2ymn80j3C$ctS=D3K0l zhFSBhE2*j2BZp&wwc?}{KyYj%wzqJ4tg<;<8W4M z`D^^cTBvB-VHSud{33@shNlKk1ySdqwXhi|6626jdYMDO*&DC1bV0m$-9i7k5c=-j zY`dek=J^uP*O+>F4QrRtB9sI5c+i!=bKN%H)j*S4S2ZwdFdQ7t>d|$Cl=^U67h8lQ zQ)^$%jBg|c=kc0YF>5$HXnrO=z^wbfg(lgykikz|r;ZT&Hpi{);;I9mAjS}n)ZK%% zPrckH_MkjN|50iAHX0U;#w?PzK4b+YOpdkpQ|`cu>^8M_pWIzAh2j}d?+x7RwHv~t80oj{7dWd zvpbOK%nL}7%=mldVz3d8+|SmX&1aft>?TB2i@3178Hj>iq1&XprBA~#LNNwl%oyP4 z&xP09X{~zF+lq*J$A?>r+Y}F` z;fPm8S$V$V=)0Yb1F7Bb*NYEBV5(5vFh5-d8vZIqIS-D2;do;8`zJe&M-fwKkN>qc zVXXgZvM%j73Wo3F-(c7Eyc}6Q42jTM-&DRr^FMr2X?9d*|Gv=F2iK{;IEgj%M}3I-AVDQ`DuEx zuCKh7pUlY%U56q7$4pv%TufwRWX;))M4ohA3yI!@!okR--r!b#w3=M^^(_TCCRn=q z1WLN@lxrKD%P2};%aOMQOG-b$z)JVo36oOYb&wHNS<&6Zd$%pZb-%1G)i~~cemPmO zJ{3+@^|D{JCu=C-bEqbApMeoJqqEmnQ68cZ(4@5}wdZq)?98>bV~+wf(-iszkb1S> zPQz?XqaPzBzx83(6BPMbVrlD(Pr=lg14B$0qE@oiQe*dd|G617k3+_s7+Qe&wwAKt zUtX^W?{d4-NyEvIQ&yYIZA3|lwBCPE?+WUx(a85S;cpg9yJxNSeMQ>R6UN_fH(?GS zbj<_4m@}MWa+}WsWLuFa=|VjixJ{UR%t^F8gMiXDk4xp*4yLsAuK13`bR0>+b^^&| zqHWFZg1cNi!_tO!yZb1oJQBmK;aI6>DHhCnsum6*D%!LG{jeZTvWq+d$oi!9WPFW6 zN!gZdg||yD%fQ( z`JArRAhq`j3f;7B_-euzYE$K!a97?xtc|eia1v_kD~o}8-e#jWz*G~L9oKZ~W=~+> zrNCPVN$=c+6S!YmPaxNCf71V)3rv=S&0#D|(A#a8v>c|;UabIl{&?FqX5N1|(hjcO zg~Q2tQ(0C1UQaMJt`&~^2nKM&|L=vePy1*KXJ)F4T0@Y@P+h3@nXtmQtMH}p5X6k7 zH}O8tZ`5k~%H;Fe-Z$9m7l~J=Uf4RIPHDsIQnGf-<`bmU_cyhAPoZkl_cL@s`Prjs zL$c>!6~4LYe+i_3-GgEqHm_G!tEi`}hcI&_3D=2Ky4VOs^!q$A&b;A_VBJkE{&c&B zdoyZPxEjE;*Ne9xMB_tsqHrLv7Q)JqUIf=o#MGijlv|OK&q-TtOdVFB*Zee?;Gunt zypQD}Oci4XoCYYf-Kvy3(IS}B_}>L#> zI-FlUjHTNaj^xg09950c{J5{0{;`Co@BIz7EnMQOi3H1r6k|%HefO=4Mcz^<`r}f#Av%#V!r>$jdx5Lj7HjFhHlJx5mj#GwV$QYO9&|* ziF5p6&nP%u{r*e|{0bz8>C+~OSA~=Lk#bbL28Q#x$i$b|5pa5>-Nm{HNT#-M#JvHf zP{Wh8EpjuzVr{~Qw}SNJre7TFPF>()9{<`JCz^ujw_fe`8ZAIo&Kq+2x_Cxc(mdMho zS#8y-&rp*6>lbYGv*Ub?b$&#j1F6uCvSd;F5mL!>QVsqhasTAfjaS$*pwx8%Lv`a% z`cECPFlwjKr$|+W>~!gBo((^q$nrsaT2<*v*h=7q z9@n6QNyF*eUM*J*OEgNn2{E~ho2rVn83F$X77UcO2&Z^%c*r`y08-cWo4P${2mf9~ zqmkz8Rtt+;;Z&oys}P*Q4H<)Vz`VWSx%e)Du^co)h z%dP(Bwz|CpDuDDJT-OHlKOU)8cNxU~`?c*MO@EU?~(qdG3V?(z`(Q>17DsdZCpD2|?#M~u;Jok;nkx(xR-WE`8h zlmZ??Sp2x|j{ICW;;(m9rTGXUvO8R(t}lAX=(GeN{$7{L6Tzm_aP+ zapt*TSoUyFPW^s~6bX#E7?b7yE9>~}gL_|P`LOKkI`#7s+X%{U_yBVkOk&+d@(dm+ z)t;W_XI+}j@X?~2a>W^d6z{?B820{g`C`2o!rR;v_I-GenQTRfnK&Z3{yOG1#3Wo} z44tQlgJ?Lj45`xS*TJw84G9## zgAc*7u@Bvj@D2y6A+MLu-UygnnIew^P1b0iz}oj}HZuk*^7_5Gy7&H@{p+uPA48If z3erxY9S@YrNDbX40^4el8Zp&>zt?hp^QM|Xije13`8h~gYdw{92TZr~9}9_hAU9=R zgi>@n;=a2Cr!a0>%TD)Yq^>&VUgIkWsp98rfr|jIqL8wlhoSesR>M=SW7kn|R#$t| z!XlL9IG0w7aRULXW6kmFCO`^`t$$?YiCnEh#;Z#R$-BKtN7kS8U;O!c32GTkfh<^R zMsD{%yJ4NRgECwDajE4FF!-l_R%ZYI|6dzCefB@8A{-iT`^oo`2tPR1avw-}Y{8u6 zz56LbM0kF#dt_n_DY_YBzn?*2F}|1&VbWWzt(4FEkE@oq&8A045y|_jtmTWqI^SHz z^Ee+LuDskG}!5Oc+_oPt8eQL?@5) zANp>qFk!aFqB~N*4XLYsmPl#?dN7eFk^s6*{E+EE~-(-Qo!PEs7}Kli$;=*MAFe${$2G?9T zE`SB*0ClMP=(5*&u&aSwa&-7`G+9$Csb1_Oj5TMAOE9i##i=a<8}_55psvWQQ)9lm zf|i?%?h(6&lDwSashf*5y-O!52L~GhK7($8c(lTUeXWpY)XRb2?ArM`? zUQ;9g=b#+hrl;nh|Niyv`pyko*1xZf4&r+O!S~)qZB=|@|NHRxg_;#^LQtLy&8cm3 zA}e`2G_VDfnUf;5crgH#6vh?x#YALVZ8>dgernH$Y!gm>`|5hz!9vgPoJ1Ecj zsRBEINNsMs8j_vC{B<)6*wz2O_TB0WcK6r-S(VrWD`0y=z~@6Cp6l8Qr5o-eYi+E& zjU;j#;^}in!LEhs9!DHY1e~5P=^q7gnq{bCKsYsql=yL&Ku(uG*o1IWvMfH+9unwd zyFy0nnZ)L%!ODdtn-^>61KyiFE!F~%DayX-+P-qDkiPOFYH~h1S&uYbf>TT8##euU za2cVhMGlHyfnsjn&|}((U3-?b53J`$h;g)6-{II|2{SrK^d0+Ufa~T(f>R> zrDop@tOlhnfVu^y@NELcFqTk==9L;Hf6{;3F7RIt)X207c^kxeExnWXN)T6q8jjw9 z!l!p8Q`7F|Ys0J7INSr}b7s~m#{GnK{krxea`xz_6J7fFCqtkfPSx*9WDH{d)0yOrcxdL3z9^3y&I zYZs=ks{OM*o*mY8pNQv4t8S00HTy3?rE3m38@{%#@|vY$;speyc<`6YC^iDoz`ORL zYGk_!MUmavSyf;&WGYY(5^d?D*16Q0`VXK;=}^1w?nOY=(x!F}rCSjsH2dzmHILs0 zMH=mOr&>E7M5?skVc3GHc>AiA*pXlU>?^EVF!lPuU;b)ydRI@aLpi+tXRD3djhfm{ zmlU!G#^03NtJrq{A(H(tko;PYH3EjY3ujNCZC9p_Ci>p?(A5|av)ShezVDAB5b)lS z5xuu?6sPuSUt8@wj+hKi)ZBIg3}5^SU1b~oJ&0%0BCilhF{K^T9v9a)|4 zznyAzVjp+u+us#D`-~&tFfv}%CCaGjDMt! z%N9GTGVU);Ul)!5IAPZ+*&;#;^if+Dx&hrrjkQljq9 zV@{tyNoaq&?Qj{!ypHuRmHT?_g51sr-NDNhh-~UA7>1so4#9A&F@v&RSoG~-n%2|o!sKQ&pk;VIN*W6Z(CVJYRQyXT2&_*&z?FQKjw zyh7e>>optxwHDnY2Y-ci1M(ToVWEvs*r?Sy?dv84eyKEniZeqsjSje!v*_j|Vl9!? zZvj$!hsv#H0E}QxPUoG<7g18hPS*Wf)h=yC!r9PIzh1HpE!lS^9Yjb?>+ioO*6pat z?w|bOE36+>1U$aPZ)7JF^ZKA&g51n&7a|E6T@u%BAUA*XCk|^^wt{D9IVs|QjJ ze$Ol(RF3IdYrm3sXI!_+*b|S}WLv?$1}bB>a<#(L^ScrquCp17`PS|KD(a2?x7X?b z{Y|hlnA)$Qid#M9y~&B$s`pDM%AclD_MgD?@UzDZ*!#$J^uJVgJCWthDO+t{fun$G zm3@5&K_T5u(w0!}f(pqY*1%mj%y^Wvjp6R2s7Gh2P1dtRQH1^Hzs}n8Yuzs|;m@E* zuifVQ5KLm_WKjLr=O|RdGnO140r;|W(|MDAfgr0BnXx^FBsTr->B*X!Jppmav4yGU zCnapB{hsB!@poG{^gPIqCq(@c3d8#*YXx}2zrN1m>&4IuU}RHHV6xeWkoc!sOS%b8 zO`E8v*s}$?84)jgYu36&7}GU^hX(S?nT}_sD_6W6T*y+fp63Z55`B zR1&O9c!z{jOuhv&ABLl$HxvnPFY;oRz-YSwOrq?bIqKH^?NB9=O) zQ=YY-fTVDuE+k(Tri1BoWqP+0PhB{8R)ezwY9Kyf(su+SEFJn^)W7GmbIrl;9?2`wWPNa#uw88az+rz2!{(rEszzZ&&(k z7-$KdtP1jiuq;=<-*y5v26a1|n}SI0*l+5=p{m%9RI+VAl8&4yutE&Lvceac*~_*|Aku_5ewx-2ci9hfq5CPu2p+FkIYLZRX`W(tpq#qDXACr_7$r8$V+x zsqyUzU#5*f5v<%Yp=^-&C@R#0K|U?`W@&O(7`_(iqjx^zmP> zx;EFtw`vG7-+#{EJ01T5Qdi0;$1zmri~TpN-#7EW6zKd>J6&K4`aKCR3Mc1kA*x%xfkI0zAYt}56ZLdWly3>AW}fGn zIn{hLmJ)e1gN*rx|t{{o(Z|iva7m%7=#`8GwWZfRqeFB#GxTK`{x;%xYD~ZB&)r21Qx>Yqm28;_o|OXV!w$u=-=B zw?i0zYN%#XmOJxR>y7m7yFl!6k&@!>{HDZb>MpN6`OOxRVf9cz?Xt6HpctVh?c_*) z$~oClfMhu=@I$JJ$QVK=Sxc8jE=)Neyzy3>ZUd1^=NRvs<7g3Txj3?BSb;pSVZbe% zVxOrKbTeR*x89aIHHU<|@}QF0Jd}Dk{{eobzR;&|sIIfT*hg?NM|%kGQX*(v+i>YJ zh?|-jwK{tR#?AQ2@|Y3M1c>ucyHvPZhHFWHAP-l|c^wQ3BWBMvDp^EH0Y5N9W6*FF z@LdJGDV#d5D%N!J76Kh%hr*T;^TV1Ge3I~?inJ_D{k1o6TQEG;DqOkMlx?q|Cd*T^ z<%Dym$9(Uwa2Ljc<3#LOxN`h%Jz;!5V8(^iY#1P0C40*^Yfy5+YQ2QiS=j5QqGnu(dT_arQkA5Q#ki!`Z4*wgc8YMcEi6qd>~b=R;mv}4o9g|U!9 z@&q8+oaJNTpgjF{hG=G>tOk6*!rJR1bpT*4kyOM{NzX%)8{IoL%)Wu-Tjzrrcz%4p z^}&|_C2Yfpwk&ozv1j)9e^cjL& z1glE4DtrS7Lv^bJ3x^}rTJF1*s75K$T>_$j@!8csMEC?DCT2gaKMuK!+8KrUm#IHP zx&76r#w>)gf>3q-7Z|%>xSRTr@a}>bn3?^sjuG6;hgnRl$=&@B6wc6P0gIm|ew7wl zgTfNO<9NteXZQ>?jhrEPd+qZf3K`5cU);}uh}E*ieDk_}grq*a{IUM}3*j(0T5ZN- zFjX7}PLj2$+>^wA=~sS+#V5X7_?lDLv;6c?J%RE(;qfy@1Yagv`KXs`!G?cpT@mlJ zeccz}vZ@sZvr#zwKX3~}Eii6EDgHUn6PaWQn_IK%BuU% z->cT@8kh>|YJN*@y7B8sNpbJYiCT$RLk~z?~)h?i4tqKU9-8`al;r2SpPGf=Mo4~n3}^)=ly)TjHmmM`o|>%-k?z7t zalf9n20!;ux)MyZjoteQ;W%ee@}AYFJ=MFA)p)cXXblzTR*im-c>_3iV-w zTF;YA`T0ra%OC^W>d7{|xUNAD!R6M07m$*V2?vF3gq7mG>g6{HcU8)BH)$X?qs54h zzr@ZVaBV`<3&I!Lv;vgt8j8~biib7TaWj($?;%5g6Ybj4IUrV6^{-unIp2S}`h7;XkWb$$pZbgaPlw7?{Sug3!f$K+zV^$A zk>Oa5{ar}{`e`;U-066kZ;p%97UGY}`}%VD*(s7fCLBK1WBDA1BLdsE zKP>y1K*5?OUcys=gjfH*XLNBo1LD8|p;|wj3mQ-7IS*-pCao+i8`@5*_NB@uGCCIuOUlx`gB!@>p+CvoJ$tL zl*yh}d)4L!N-|+&W$SRb7|$Cfw-Bm9JFV6%39s9d#iKH&>Q6pFR=x$nWx=#^6y|Pg zDc(j(Yh11{D^RM@Yvl#f4dL$epY2`u`M--K-?wTEcuzQNx1AYd?)xaR+(&Pp3Z{sr z`(N9z1}gr8E45Dg8IauC7{3hY$9i$p)GG5}8<$mWKSz_`;r%RKFbvm?Kwm(~dwjyJ z3e5H~N<_q^qHdIXl5c<66#Ho(+nP=rtv*9ZX5SvK(|%Q1o}($-OW*lrJ-KjFn_QTx zqmdi_oplisu|-cJd;y7)+$>_Vhm<$Mid+M)T6x<9hQ;%%R@Y^)8HErW{}X!)kn+@< zs{@ey^1fLO7GFf@Ce^hImSM`)ByhMrp}Q@>x+-}L=KBd7Qn|NtdkCtu!}>LE-GNXw zrjEhw6qfgeTEJlI`Q?1orQO1*cze&)lzLBMI?7w>7=jew#D{IsEkI#^OCJuj`Y63o zVP(-cE|-3pH$sZK*O=@mM5lv$7`I?5$(gF<$3cnAPRMvdIMSP}YXuq26iQU$fJ*T_ zgCN-hdN=}`gTnct>3POJ599Tn<_om|!~kriR6EJak+5;-AR8A=e!1>vFA%t-!F7>`fx64pOW1Y7ggl{8+1+AE~#pJQl z$EiDv$ny?Dc;e5=v%ie!E?R_0#F)4Thl%C{e82zXtMh!HqIJUSPUEhjP~-cnx0rhW ztBvq>;^JXXIWubvrYxT){^=T0JrYhy4(Cn4FZ$^3PENJ^b{?aoxvOW1>ejX9EcOIB zMXrlOZHX}Zo^*tbw`HkkeR8Mm*Vc8H&wGlut=op@mnh-E72?$}Z1{IuRrzI;#1{n9 zba6p%&w^G*w-Hrk7#=UTvrRx`XrqcuH^W^`K5H%^y)Au=cV=f;!~h&ApIx;b^&*)3 zf7KEY)on$Pd`=f_>wm2)ouoF1kb+z0h%B}vg@tcx+t@ygg>804OT+><1s# zG;kLbkq+fSMB`btXg6~Bdc9UY_kgJ|%@3g+_#5h@yjF*Whe4`;qoh9~Toy7p#X3iU zGWuWC8YK8FedkfZWbjT6@Q?Md`JW#TY|s9Y;{+(}y{{e676?bCw9q>KnM6L~(z9AU zo&(c-=ImTEf%(K?H2Z1~a{=sXOr1h0v0Oxw$9VH)?UOh$=}j%SMJdPS{u?X1dQvuW z1u5$Ka~Ikj30DymeAW(;(LEqVF2ov!{P5s!R-?EWV4p?VZU6+q@Y{j+n_%>3fnEi; z1*f>}ewy2w1C;2Z95?ky)b$CPtUjtS_j3QmSaUPiB%mZsZhcz%mBgN{apxW3q*fQC z)+?Es0<^AL&5}(uxc887SyR(mSGW&Kv91Dc7Xf_=M-USplEwBKLfCdRsLATHq(B4j z)*$pDh~py%#-JSYV(2r&1A->Q4kp9!nq ztKU0YQ_AO%vb4FVc~{*}|0NRU>*1W{`LkhbV}AAf@@%^XFCgH@$|2Ei1iGqHopJT2 zn~)+;&Z_#<&3%-2G^NH+>>Me)zFTeEK>x*&ymFqO-&wx^4ve%;dW)jOvkfI`F}dtc zBM;`I^IbjP4i=a17neH%4sxVm;Xt%;AeTSvLLjQ|4E`L;77p{nHi?)vobv70EH>jG z>c6+&S9k9WBc%VEgGL}3Uue#Uqd@8LH{?4e%+i1H73M9N@{iSG+%Yf-jFI1QC@jP$ zbs~`!tQpZ1C`nL9FD$Q*+SF^V|L)b*JARyp({_Dzu{zl;B$^I61HOwewqCxdyBEZk zuA@Dkei@Y0N7Vvd5sn-_80TSLws#dNYI)GzNq!AQQm>A%=>A75a_z#dMU<3zc-qY3 zMjydY=tnizyqO4-?cP784R)r-#?lHcp+$AwT{55K8)nxYLS7Ec?Mf^g4AZ6g_Bh8% zVm$cERwuPJcR-SVRd-7?cl-DbV(>$y&3i~BY$C42_kpl<*tj^44S$LjmfBO5Y&&0Y zFeSFn03tlL``6jDaJU)GQaRH`iU@15xVrpDD5O*`tJQ5=U-S|7p0Z4-c05K&?bvHA znw|I9Z4elK3e&;IKhMV?>VfnV|hvKODKiW&}xKguDju9*J+jprZb~|0WBGF zy*2*a2$P6aD9Z|)fRz5=+4kVZ=KQK^X?M2tzs}SHcMKgNX|4Ue690=mo@;B#TVWg? ziVOU-B`QTot;P}&pIJ|M}H2|$7~Hpb_;hE z%(&=-saopYljxe^{WWwR0wuW5a!ws7tFC_-N%3o)oUH?4!MhmEC3X}g0(oPyc@B&v z2`M@w;7w?HIEoZ0>}$>4F<7a8a@kG6%s;5EcEZp^kk3ETZcYW6t5rHPQ1Y^`R9AG& zA;iSS>lN{NP*oT`%;*Ip8Cr_@UPMaq+tNMPZ4CfgQk=8QLPnPnQo!?PtPY`EL6L{9 zZlx}LxEkmdw^saXeFAl>BXM0vP}aTcn|6!AL+t_&Ww_CQFdw&sn+VDA%?tCbO5H*s zaqY1hx&&mH*$(M-UD78>Wy~C+jymh*5mGq&Bi-BZxBE|fKRZK@6;upz)=Tep2bP;L z3iG`iVDeK<0kAGG#c%d`KVMUixr^d_3P%I&J?%9x@|^TeO0@?F>fdY0@Q4aCei?6XdX2M=2S$dh@iW8Gu-_ zFU>qdOD#Ovu55hXV{hn5{>vU`$9cm`>t*4sRzr~&5W>!@tz7`|N)&Ia#haiEGsh>& zA*hXmHuqobEBA*jAW>UD$Id|i+tGtZwG3dmd$kSAxAs53U(O`kz{u+G1#9m$o*eAI z$l>Abu+%5pIA=%yqpftj?}Ss!w7YG?XID?D!_75{+l`W{rr*bZRI&$^QSCMJ91;wV zD#Jh4G{9ALnsi12YTwf!AE5RN<<&TruvJM)OzdgydQEut(Sbn0=ut!^2of{TbL&tWGS zwFWTms$r{5ugjp~9d4t-D}WTgx;BYFz+`5Wz%`h_mwS?@9A?@y_%;&u zSMQWB{z{($mp;P)uxt064DkKk{(F9WCOAI1htx^co>mF*K8h4|i)HyhYKu)5Ph3Y8 zYp6-sVd0X(XZfb=QVRftad$A)3uGFBo^)<~AoK_+x-wWkt8!G!^hMIC!I+i+NG`*9 z#`*~YS+D*8mrsS$9=I$00w)v#e1_K5+?Cohd=4v#dwl*O!|%Xft)-U@Ki9`xETeb< z4l|Q>!m7zs_Kk?0_{@(LY*YW$_{oy*=01X1TMcuz^aQ@-)t3z*M7nE#Q-!ef{UQoO zdwa+atKcOOLy>kThM1eD0ml01zK!Nr_g=rjR+^m=WfI`9#cY!t4GKRZpMeav#U zueFjflt^(Vujn1^2_DO-T6+v3^#!g+*R>KzjOK9X&pVM%_S^nH(e|LG5Yz;_$Hoi7 zsR>%}_PCuP16oRRz~Y-R15E0F{(v?@Fu6Ij;HWwVF7_m2n{@D(kYwU$WbX!D{_G~$b+z?KJ>wfJwQ3#%K zYyJNpvhF9w%Ot%MJO>VF#7aoZYSAuQF*UR+YfN{uyX-FOrrRVWkW?j*CbO#Wm|l~R z37JJgrXiD}%G8SK!E0uOZ0un@c+8Gz52L|5^ayv;y-b_wL6fw^fkPs3;J^WmIB?*= zfddB)`+4H~%eQ)Vvq~bq&oADHC!UDsiT_XB03tlD5o?Nh6QQ?3OHfmsPUk_yTj^JK&E1COF?N_*+!2;X8+w`9Vfro#t7hI;C&unUggsau*J;*$5Ci*->X-*0&2qMm zAEpK$BBsorw`a2+!7@8J@q6Y8-EWJ3Rqg6Ye)C8Z!yqi>({1JN84$ZTHjT;W-FMC} zlj93mjqMs?2fCPhYFX+P7)`)#*E_uKzPFbq)*CpI`&>UQ!M7dZ*u36{LFfn^!j^h3 zTfbCQpH5B3*W+@e-l(ITk+d#w1)9>n_tgd#L6{(U+Aq#lL2-Uu&k?fNrZyRVt?trk z=gZr6!kT<*WU<=<##*RkSe}a32`l^Ver7>1QnHu=i!41o0c#D!pSI`UX*qi zDJj_`tfAB>LXTTZV8!hL6fM9(I$RtCWHinNtU@1x6uQq_*5iU{Un6Z-XtKjY?dr#L zJ|wx1B{SRo%4@M6b`Fln`pb*)*+4_vpVr9!92lO4d1EUs&!dEGF7ay_>jFYar;b-# z%-6E&uMy8BFq|3Q$@?-~^*_d8CS8Y;(stLn5UwIf>3Eg)ny{jOx$raKIv}0)bWnYH zBVT^I_ean3?qc1)K)g?|8vWC@CK<&R&5jVm+l;GJlN{6IhPRrcCH_D(nq9 z0b5TH=`DcQk9PbvMHdcp)w}p{**97i1nOIzKN$WN|DxSthhy_}C`YG`wQ<%;#3W+O zTw|$KU956QSvN;n`_+gM?~xfU>!xa*S==?qSmT8C5={p*^!LA_=z__ab-~GcIAtIC zqO={1rK`O){zBS-asz54vak0<<;L!_Q+4WpQx}1e_}ePcW)xZehRyCRf`rW`R_DAG zQt!Vya~weG)od+*4<-f$pr-VN_=b=o3MR2eZNmtXA2Es_6^y}L{7L!ctqH_|E{S^9 zn53wFmqaa2OY=~Y_)wQPE*PO$J%J}-Rr#CW@6*?J-x&Z`JDUxm4Yq$#`aSn`45JA# z&LZ@5gqf}rE9X#TP{(!JQSkF{N_?gstGbXB)V<}o>NzeVq)Y?7p&3JfMsS>!)naSY zq03z|$7^131+3=SZ0gkj`#XNQ1}M;cO-8N@Cv67@_&TZ8nj2{N+tEC7Yg9L3d3pc* zA2pZyRy1xQrBFM1OBA=eg!U}l<9o734|h6Rt%Vrr>5uQCrLad!z3zeXsztwMTJOVY z`+98Sm6LV%;sGLtzxs6}pohYW#R$;cM?exgUNeV9FkCJEbN1Hc=SgCF?wMVE3TS#< z4Oh)Q>%JYV>EH7XHZM*u@}Ul1HZOrRxKHC2{uM$pG8ksV7zGsNXs*$UL-PhJwc!|^3qeKoI zaMn<5BZ7*Vs1tCTgp>5RBOP?Ui#%Iy_-H;tgfLZ}2)E{UJ8zC6mA8w5?)M`F2f;Ak z?&fKSLy4dj-l=mq!-2}tq&5mx!?;oX{yW!i#wZljdk9x?uH?#;T7n>)aC;3SYj|@|7 zD7hLewC%EIi9Fv{5uO9Favu0RX;DDieUS)@Hy1C{a6mB_jau&0xLzTAz3xzFl&X7u zjhbv6S#FL;-=GlBG1uLyCwdEFv0U!!_W|1RW!2EK_rv>SnXTnOlG!$4^op_qMgI0D z+_z`#=o|SLJu5<>jE(ZB`?sB6R>FtVw((vpKn6+x&oXP*t=5B; zUA5vLRCav`)g_#E40MBVgq20SD)>e;Etyl?YDZ1qHYE)#@itQDGB+cX0^X~pzXg!s zY|YiT3ga~&lEpwGsz+vH5Qrw$3GSi%v~6Zag2O=C)`w$9YG5&n5Ph=MQ?IO0bfk!K zs&-1Geh{TJlpC7T&_mrfZWf(tgQRh!V)Q5F`DU_9z!b{n6rJxVwY^cRHM1xY_HKKz zv>s07Onl*kv!Ei3Wvq1$iugvHB*+78=erMvs-L<5hH1y+nq9t#k{og_<`RrW<5j}H z3`7oIY$?-vrTadodkpkZBAJ~_qoiv{Ns_xJsa)^y_{5hIxdF?fo;=sZ1L4RK+=U;Z z+{(|h?!(i1AROqUsswisRPW(hZo4b2_@?hwpZB_`3RW%kK0=aq$j&`WT93jYe1k!F znBecfPuB&*uhll+EyBrj*0T;O_6b6yzN1>$QxN}C?XBl$0a^5V-hH_Eg6oc z%s(^cHUM6Zn!+5NZXNFm1l-%2vevZ{h=?4NYG=Y%p`@&5+OQt17WPGZ+i?vPhE7k^ zlFwQ=iSHTvtZHXnM`&Ya{W?ODYg64mP(kZ8K@~0_u960^w+Poeq4K&s?jm2KhWO zAOA`D%zpty!uvV$u2J*LM8;F!clF;;+MVJCumo#9bE4K3LN2(yOI2-^)=`d>0lx?o?Ba6=+(|7uJ za$|tyfEuU+ay?L^!_C4G_-Ji5ZUK|i(b|?T)3ddUakK_F1E7K(J*(#yOt}X&%kq#* zo6(}7JF+f3j3Bdta*aAFoI0!B<5~hefRa&G<>n2ic9`@aYMA=0rmKfQ?NY_=g~p-e z;Phdw+f5?K;q%%pn(lry$~&Q<&LV_I=Ein@4e;mCQVS>Aqh)7d**&g@?M+b6f#I^b zyT#>s6gk-SquJfBmb06a`im&o+rOiKlrCI?dQE2H41rwk;%_s@tpHx}u3!V@((dng>y^VC+;+D8ZxmGPK{Pqk5GwfOJL zb=#ACJ9erxTeyV$k86NSvjdgn!x=d~2h;9s%UYZzmKR77WIu(Z-f%MSy*>8|K>@e# zGAtLA>*Ie?mf=nJVNPwoh113k8~3p7ZU5*Usxpq$t;S`4zlFzZuVT4yvKi*^4C5;h zFm92>*<9KTrpQAM+tz4iRlfeMk5$m>M6Rbh>N43HP-2GIoDddaErPl|8S$+PB7~~G z^-xki;m$xUj`gA7@#Ec$^9JGQgi=uG{50N{+wxQM)UQ+C49cVWJlt)8lB#Zw(-I1u zPshp=#DH+*ZXH7v`d|<#a<^kE`VcHROdi^*e}+hUteq_w1+oz8xm72@@`Mtt?&$mL zDa`IszJvML{Q)iI5YS_cwXNOL@%+q_3TaFNQCxc2TsYEhG&R2Azo6HGxT@EeEvU^w z5srsF^w(hc@}ka?2YYpQ4n0}c!Q@&OJ&%&YvhVN(Sn>Fulgz~~`gCn0OW;y|HWvgg zci)=#64aIam?!J60$80hi@Datvy82^U56v{W93?>D*8qjrJnwy*>D=+k(qXi;ubS4 z2bB5+Eb+s*f7$)SbAq2c5J8df|}YkcTkjaRSH}fzvkB{F8$njVj96DL zoQj`s_wK~roY-yc`{(pOvHRZtHq94a5_p}w8h}&Xy9}_1eK3(ZjH36#N&2WGmyPdX zBwS4$t8J~(#64ObWDW?IopYF+ZyFL0CP2hi}=qYlu+UCc5496}S5dG~o7PMK zkQ&@k$2P8msRt9OKcN2k`EebdWx#KO_?tgz`CG3ZL>fc;^y-jyIYBIU^400~4j_dG zt8yl49DOgKR(o{kKrg$i)%QMtrLU8zVe>;MWf_@jkMKRpw?~_2??pgj7EqnR1-|^h~YM_o2v&h=%vj^+f(+ypF1E1SGAes%-??9xUpP*2Xp`^7g_0{S+Ng zQ@`;(JrCU#7vdTKq;FJJwLJ($c&FX*=FCbZ4WTh8?|=UT{kyQjS&eNDh)2N`F8+fL zBx-Xda8OveytgEcLx5b)Gb!fA+r=(`=Ewz?L=w|alN^Tb!q z_f722LfHF{KmL{;TsSpV3&dp%&ZFSM3Ivt70HjwlZM9^Zh02Sly=Lb;uNu6BAjS5^ z@MYl$WbtY5o(Nly^B!Ji>lq}tdb_Wl z9e$YKE%dg{$wy#{vR$jHh37>SoG$#VI-(~4-psctxNu~7(p{uuJwW1xh+xqr8>auh|Tyn5m0K%y(fM{OVCV1Bg6pv;E?T)EfM#sTcP@0RN_`7Petrh#NKbvh%V zSrqK?l1-hvU!87geu2-TNQ*;?_Gace5JyKHXrs_T1diy-5O(GMZzJs&h%Lr172S9>2*L&mz&?RQIr{>N?upx zeRwm!6WMNS7If?uf|UBVe?+5&)x8mM8K*mtbj=qC@GcM`E&ec@PWMoHO{4jKyx+xW zYs+|ffKth^K>OG=!fAe@>=vx?kR7 zxZgs(!t-8VS8(2;#J<$z@l-o;s;mB1S_VH2wRy7~>={U>$1}EEftHfghRs~oUsrZS zz05djb#|)|!`vsj*40p?-QT*sHQlemS$p$2#FK%de(!JMBh^##y|Fr)(w3QQhs;L1G-eI#6!JhKsQZbNpGor|jGg`a zJ~p{K)WtS4Yub+xk<_@M4Blko+iNB1X&@Z%#-s7qTzVEQ(m(ipMxaZerld9MJ(~oE z+Z^FsB0B)lYygD$nUi0fXlKMP1mktrRJ}2CF|pwq-d*a@x4upDgLdrSzi+>;9Kv_4 zVryfyVR$u^IXh=o@Tz~lmM^?SUUvts2XU9wI&vtDCVo_J!l^^&^{IZ~VDDYH+n`!> z;FInPlcz05J>A{>u&4Gc?g>X$+ueWgD2d4T(V`4>9dhZy!GnBtx^9g>6b>UM>>A)B zIE-woUAILrZDz{#TdMs8p*MZ2KBLUX)9#ZK5B`GkgQ=f-MCCbzT@#Xjs3!-)qRRS3 zT>+;0Xvv}fSUW=X3L#B`3%1sIyhceWTsoRC7HnGh29;182V@3>umC_$mgOU2 z*|(QU=%rC5SPuJcwzl9_2q*KC7Vmw#5+UDyUMGlG<@Yv7Xd2avwk-KFj#ZJeXfG>st6R z!W}|Lh3xE|85~AQf+kN|$tbMI?X*hoiJ1dk6pkvebP$fD4WUXq4&@u!7%yj5JdUL0 zaJN*3WU~9h?atDfX#}Mz7faQj&VpfL$H4AUmH<`=Hv!1$EMVBQ2mM^)wa2c?T%PZ~ zGgXq#1vs3|&btH13WPAA`V3DIE+J?!^Yz%k<%Cbx`;Au;=GKJz3r9$Lf%fdywfy?= z{vDKGSjlKinV}nyg1AJ|&IQ~AQxHl^k#FVa({l?qYG3en_pJ5^zxqG0aeG3o^pCBxNu;rC9G5Yq~k1sGkf6NkWT(ToM z9-%wI$#T^2s>`We^A!kK-cPPW(0d@ZCbQnQ zeKL#~*7sBkqWcKptiK%H9_ZlyYODvr2#3EY_z)~ReNFWo<4}0BPSZ}hO`=Gi?51n4W;;q<1E{&?97-}d$?FH@Pa;iNZ9nN8f)XE@tj*W+0e0`TnhV{hGwr$B zi*Rb&c!a!aG<&I|ZJ#;Wj3zUXMC=*gV+Vl9!{IM}>3q_|V2>%*q6g!UPYBi(qq?EPEFcjr&7pTs z0D@?%&Fx6{Qv^J1`*@defv~DK?kjWh97-E^RfqEmP3Hwta?e2EC7eRoG;VTx)qP~L z;aZ3+Un4D5Se-SkwBMjbn-(rG3=j@AKUMJ#NFEDg!g_2+DV3K59#sWl=Z5%=O-njRpjn2avS+{S($} zN$~)fLJYR+$_Mi^DeSMa0*5-dr-nb{UF==$u;(PK4$@1t1)6CTg_x^7-&tXW@D7a{ zoC8#dGtV_(I}6FyRxI<)P@aQRnQkAp^_BDaI2XPybU(M3mGFHrKWoB2qxnGec(878 zUj`#02C<&8BDO1N_!>J+DpwQcBbLq!V{0tS7T2NP5|)8*F7Vfti5uv#9Mki*aV!EL zWT-pt9BBEDs|I}wRe{TOB((<=apC86@K=%V1e5Hv0R!EKOCYB`TWwYVg=YuG&NCmn z())?wi+T>}0hGENo;c--q>mmVMQYm|bFGK=9--ji!Zf&tdJ@w2Y`z=}O zfqdn@P#J{5{OBsIO&lr@vLWN@e^@ZJ$jntM97T}k!oBMAg=JQW=_n=6O&o-K!A5Ckf}GE%X}3Z~tr!@P$*FrbGWuXO0rf6>mG5_p<-7CC}$U`DR%T zB|;gl<|Jtak`$*VbPg+pBXnnd)ygV3!u+TfPgaAeq{FzC+?p=_WP1u?Eu5-2qhi)U zQvQCqAzhzOv#(R#ejkFQ&CEC`pwD16BEu%?+ylI8>bHBq1vFY5u&<43wgBO7;fG|u z6%2Q7x>RKhAfzerBPw9TrWEuFUZHjEg7I^1V4La9-t*-rnpQR4xG zq&disrap=#hHO?Ur?L-~!rP>ffw9n-1oM7^sp0ccP9_)2*|88kT=>l46-D~Xe zWO5Nna&Gk080``i(d{}lQ~Ohw5hO})|9#C9uOxOI=%zDQdq4jB$L(zLwZKw>I#PKZ zOlDNfg1mNfqlDdw`ak+Kd0PJr@)>}+FN*o+!YSopoh2c^KuASxo3WYkvisd> zr5f_R>V6+7WBwW}gJ%tm+5>5J9&=zs-sa<}Gi?z^gm(x%TTn}5|AgXiS{h;1^*+^H zlS4vUj-L8C;R)F`&sc#JR_o#b-d7?dyZ-T7fLYajWB66;jcfr@GPK0j=9FttQoda^ z4PFbX)E&DRf?xSX<6RFb*{Ow_(&+<|mANE?w*ig`sXhCRP_H%DZbsXK+Jq+IZ~i)S zAV}Uj>QMC-;U=#-jJFjCcb0jZ6Q%)_aMxb#90ZdsyN#!z?&l+?O&5nji5b0V(W5{T zbLOR;Ks%71kCDFq9fN6iD^Suj&2GC9S5b)0J!u(S>%Mp5r4~Zjhy2d3 zkVbw3NPdQ{YX2sj7GPrS>I~7XSWxj70bG@6Bfs z_%%xEu$E28{0)K%vNBz32ydY@iT-vnFK}s+yzGBk$}HX)eZCwi>>c6suKLXt9p$jI z4>h-5i4wWZ@*wGa&8#kU6=HJQTSvoIcVBUs(@xc_K_RyJ8bhv4c3X6u15;}w z6t7IiS(KDF&Wq1=*q*lfIS=r~V|uC>SgQTtmt9N_q^UcI_3zRA*Med0XdcLWgAi-eJMcMGmkr-`2@KVm<~vYJ`?5y& z%l_wy zVR6<#-oS2cN3i=+I`qiIjXn;Atg-{wH<$n)}uz( z^h6VmyGU#k8g99UuVL+Gh}hfHxmw_sK$)Mc1>~(@B+wQO;zDNtQPoVHt@b+zq&!^J z)o^48fi#bn0EdNBr)O$CXtawvEt#J zNRTMo#f`}>vgKSry<)@5?fDe?$Ah zXxE;0LGc=l&kyS+#r3a$YvY6)aF{wh_eJy6brVI(u0j#+Eug0(+VSmQiEK@cXzt{9 z9+%pJKtAQ+RxRJ_BG)bGwgH%*kF?YK4}dD|A7wZBA=p}bJ45;iO8vK+j!Zy)c7vfT z?2~*;G&}1e#Zxftk@vhg*98oAo}ons#!CkM&tauHweUkV@gl&j0K$9Oech%mZDaEl z8i}1QZ-TG8-|1WJPdM-QrlZxhd1isazeS6v)|*bfgL?Vz8yRH+{+FdjyS+x5%LD5W zR9zrm0m`rMy>IK{g`*vD6x=2Xs}NH}?p2L;%eJjXi_PG=&j3m~Ymk!bY*}) z2~)HMX1Qv$e5+tYG)`axkV22u%JHCZn&EbDjGoX?hfpxbXUeoqBHRuq`ojOM*^LS- zXYMEC;Q$;B%}J}a8;pJsJsEz}zQG|Vne0A&YOGq$I12fkocZNn)ODCiFy^ilN#D#N z5cTh<2Et`@b73B}X9Rio&OyjIw1|IaYg%XFWVoy6JmDNlL_X)mUn+IJi*j^6Pn=!o zDD{?V-QU01edHu^eRK%{+uX{xrK`&zLB9X~`%HmwSQu%?Wv{|%P1SeS*(%C$E#F(2 z7oZ#DL1m&nfc+QlnaevT+G4Z=O+ zIXlr#xW4IP=l0cGIECC_$IRG;eEz$?+s7tsUMjFlTyBnQu*;E>;sDnIwL!lErJDN0 zT=^(w9=eZ4JRs9X3agORRSm#(wyUAkX5BTh{AJ#>CW$C{4z8`u7w|`FVjZMNQ|+Qo z7xUEAX-%yUP64)^@&dR?077c%jCotL>l?doxTZBE+yti(&TO}t(Pk7md~rg7wsf&~ zwS$LS;a=}*j#tjK9{*w4*nxa=to$zwCcJO|9)>{}N6i?wn+(GUOuKWs#50;-mCU%I zn$UrKI$Rh14hp9^nGlM6sEh2*Rqck4cZAvs#_S}5v`@5tbQ-9$96Xq?4ecsVT{f9T zX5c>AVH6-3Z5VF5{~a7F=dK~tLZn(+DiWjn&!ndr5&$=(fIaAI$L{XNKC& zORqUU@PktJ6y_n6j81>vJU%^2G8%Rptu2Dd_joJnlYFfKl=t$dL7$bQVg>+;F`PME zTVZY0;W^^cXszBKscmHK`~`CIUAWdRS-nKihTF~aSHdziFw2#o*Kk#gk)GE21|llO zY71a*!3fiQHz#S|AxW!w;av8=wkF1>3=WqAiObY_jMeyK1(MX-5-PP=8K`_F|KhK6CRIWs@k+cQ9rjswNo-+}yEH{vao(7uED)lFQv90CYc%H!=` zE*K%W?I!6-IMuLw>Eh#b_r=F`dSe#MP@!6{qv}m7=1{}%FwvZaDChu*pA$?5Y{#GI z_TdPjT}@Ti3n;Rz4JF2<`B}NxMba4BrpG0eQo@>4Q0vQqRf^gGxB@D_^(T$+Dv%uc zvtUfF!6}kADQ%Au(e*BhZ4gy^15VRvj)k+he6#y*q^?udveYf4s-k*#{C3i)>UH^p z8GzGXT=6L15O+Jmev^4$-$PIa`rD>C_XCFwK`ZSCU~k4*Quw)bI-EU3CD*1CRso?D zji(uTF2d2^{a;^(HW~=IS=V~yqvtIADKaTpHIUsiAoWn|1#R~LMd7~sN(cR-`_(;& zyolFPJS){E8m~}N>Zyz6 z2&J8MdTNDm+G#t;xe`ptodeKlRwe3@@;$d&IFhepF9>T8D78y77n4w;J~QfKk<8ej;1@42qb8ntdE@rq)zY_ z7L;%{A0F4n=LCte#;nzb&w?s&N2PgASQ7n1BRgn45C+e*jnfOTyoc%0#r#x#Mti{R z5=@$0B-h#Z%TP}%{!q7f&x}l!T|rIb%_B9G9z}@_{0yXO;CBrnGP4kp(c*O^DId!- z;WwaEyX)*@e7@Ai%FT|L=USVrZy_qlsfl{J@ivf>e8>kYwTHt>J*U4vlNt!|rRlq^8;%g`ZiV(Vc8S!ZD-i`;7sHKl;v1K&&yRy@slFMWPG>a;j{s z&S!1`BQbp$nQrZ{+YZJx10Cj6Mizq|KHN$_1V=0r&8?-9ID!>@89qRJxvLJhf>m$CZ6tU zD9@I!X%j}9t}QVHXeFd_w86D?wfq63Wcqnot3i-NhHLsWB%JbCOsK7vVT6=NJ8DM` zM-%;U>GA>Lur#ur`a@yq>no*)(B$P&<>oYWy!+tOLAnp6DR2~BtAp*?!)esWXz{PA zozKEy;dF0DaIT9%OiFMzF|r5S90Q+2Q6_UfqXc0U;KCV!UjR~v!&X9F!C(kF(&_m+ zA1%R4NWE%0S=&FCVaBGsJzWv30@WG=SzgUA>#6WH!SKloTigA+j)IH!Nsy+x!wIFQkd$lDv#n=7g9$Z0 zou30*4TF8;_~AMd^a3IIIC0K=7z8A~p`VOibwAsjF}9-bDA;IYpEn7gJu9KN!YS&m zdVup?2dC>&=d$lMhPmu0bFdu3(wA-Fa76%d`eh{$u~_XV+Ew}ScsuC18c=Hce3i(W zE-I4%uZ4T7X}{1!f1;7L<8$ls)p5f&39b(!tKa_(N)2J!h`Skp4d9YanLE>Jgq}Hb z4WZUeT93XdpGjn3-yRAMhH0+|Xp>uD#d8f?o8AgU)ttd!y5El`ABxu7RT)G`TW4bD z+Wo*GB!%5y_njy=gwcW8?O-ZK12HgBZyp=~Wtb~?2Z5dlo#rs%htneK($aYM<>?2; z0h6HG{H#vaPYZ|B#d1#m!$o7+S+q2d+RCa6NpmQY>va)lp-8N)b?M>r^Hg2sq|m?e zxyKHCegP%Tw2U+m!aGWnOlB)7K?qEKf9CCkp%l|-fvZA<2A;A8sTT8%_-MN}BhF3qT(0ZZ%3G{KYV794)8yGK`|C8z!`K+@T_cL${xR;$*G7Jf+U z^NR-+{;OrL6Fyay_eMBPD|a&A26JPP3D!GUDkr#FP@rYsTWU|{b{+$*m8<1wNx{`G zDX!@7Wb+EW67J2GSsRQ~Ke4ZDM>G>UEya1&jBQ?$y_aX}3+st0gbwVqk4l8gcp**8xv&B#3J;!K?MfMeO6MI`wcnHbbE1)x?sW%FOZ4*m;YR*0am%1D4()lvQe`eA#a{-plVp8{LDw5#?WMfW6m{SD@nH0c^y7*h)GaP`V)Owk9!uZ&2Ohog6UN={}ZmlcnLreYb zswf-s?YBSp7UdVlMa?%E-%U_VYoxMN6PuGjU01KM$(AJW)mP@cTZO~;XY=*2_&|pj z|3#fy8HAUn;-*1U?S9n|VoJC0k1f5B+V4)1D9!E-R{vd2W?te{*x zjWtzFo&(dYk55c^?SgupM@pm6r`1vZ3kW^=*EFK73SC4?V`#RZZV{M9T|$kp>uKpW zmu!l089ljJ&^K%(kSj=P+nq22ec`Zwdb0K+ufce<9M$%0uY+k;JN6nDKoPX@esjlp zv!giCf4CNTZlQ$ZugA@|(UQrLwsds|4o`K8pv`RVc2V3o$K$;uGj3(c#l_46@1vpPodQT2 zQzvS3?KzP2KPk)pqWi#!-lhKhWj@&1rbw><71>r;+wAW(Lby0QQ@7>bz~O?k!Pbi3 z<`V{IyA>Xie20)sKdqZk%eJ=CFZ@;QJS_)OFP~7f6;Kjuj&Sr%D^W5QcOT0of~6w> zNka>yTdRSj|52^IuK^|L7HSRn)_(nCHIsFLQw#sPEt0GUHR|skG9D02-rj*aRY!+6 zph&1rhGBbS_xq`d+$-FKl1A>tP95OhjG$im9;b?1x?de&EAy}wA#AQc`1>qE_j~OM z`h5@~jmg?bd0#X#KnhRoRb;6Sca%L7XQ#?x=qO4m#62?wJ^+WSqhnU?*@Q%xHEL`} z!w$iUrBpSR8HbXEZM0L>0Z*df(;(KS1G|t2lQoqrj}$CJ5?J_AJ4QYSMNi6Yy92}$ zJ&Q&V&SYWm9FTHvtLi!5!NavycL7vt>mQdivgSPVV!obe>*|+)6mMw0CKs2x&mALV z0>Cu+?M~LZ09so!SGzbfwfT7sWG1*3Ff^2Z=ywf+p@}f3n2`! zQg_V|Iy`P(W=sGpUd=wreBJGS-tN>R{qL|tXc)c^V`iW}eITqROu_5I^g~EOt^%}f z`B5M>`lNq|_JbH7vG+sufiSt7imCLc2-W!Y8;%VIaj6V>5nTCox_jM#vhW*k-_q$u`9op{3A>LfB& z4pP?$ryyP_!p2${i`9Wp`$YV_4F&RpA(yt%mmj|W!3XqRIQ@~kqMbS1h`Ll9`<1@g zgc8o`ia7ynMhIt4l^<)@^tU9A6MMC0M2)s0RKsgiya9m3%70{;mcj1(I#ARqX(-=Y zIiZKuvkxPX*IcSn`Cfsto)#z12sW&rCOXjA5^>H z!i8efK-LqhE@{*Mfjz0QamQW7eUr4xIe6`!u?7e#XsmYb7z0SvovDsx z*|sK^6YV_oav(z6?sYFV0PeK|MbTIJU?p0$BX*?pzx(2twQkA}S39m{@HGi9+>p{* zVdAg;i{b+*{3i}C)d*lcii~y1ZXhZ^U!rTC^4I`KvkksBcAuKba4tvjQKDCM^mnvw zfNaj!c7e5)Edle#>WS5@0Os*p&3*tcc5} zon?{ay)MFzc9-gY@V<8bj)8grN5JN5Q>8Tw0b1DLl8PDVqA)@Zv(z+y5iR2TkQd+_ zQe+BHl?FGvhFAkAywvdsmH7;TbepMM_*r>geVz}@LTX_4B8W@(I(+srs5cmW1(gl^ zgR)_-fiU=4$>j~GR;KD=$=mLy{(7|U9jLYL>Zk47m)NnkT`h1qLQ*+gox}=IDg)K* zRwiuGl$r}mVqEiBEtnGRbVvk`YY^y2KR-${Q{(%MFPq6(i=1ZErfMRtOCrZ9!ul=| z>ytIk?#pi@M7BY&RLH={06*aP*q1ok)O|IopYYXY1hVcQZ#QSRKxrCQ$es5VVJnj2 zEuDNH03{uZJot6=c{`?6qeDp2v-eyphQm-Aw?{nvItnYfb&A?6xJ}s+QpBRwGWS6g z`Hd)YdAd3T5?i^~9v75#Sr)nuq>XG>DbrArF=@6QN8?dq)awRgy}lv)xqLKp;?%;w z(z`>ch6%%KKc7QTbsv1kwCTLC%uE*jZ~;g$a$e~ojHzGyHHw{YzN(7}m-CI~Ij!(Y z_s!`xCA-?;vGGdtS|WS57q{1esL#CF^s%s0Y^4@se^wNAbJz?7yv8S?-oSsX2=dk?{6F_dG4 zj}S;^R+-wYd=ajecepI*lP)&jNVU!T6hWmq;9CRMXHW{Q=4+q$5=}7x{Rtvc3z9G${ALQu+2z zcnFnpBNWG4qu47Tvij^9Ll3j(+>th^&t+iH~j;5h(+fBz4>^DDJD@aI8 zxhU&^l=!sq0KJA&MSJ4LhGrur<=O}3KS@<>Kuf81YY7{n*wH$VU_#dpo^C>wbRB(d z{oCez!$8*p$`+`ndX~%Uv^`-}xG$b|6_Y6P@rs=DEEIC+1* zaDx$R2YtIZzx<2OneXW?j)v9l=CTNA%40TOx1fH?8X!by_DPO#K9@m2qG6&o4OGxM zgfy@I>f6tQD$f}!b$$T|FE(Ar`EkeJMYPDZ4&+n|yo93Jw4U{HKBofMyb>^WtkmHu zkQ&`Zn%AI6f0746$zDeY8>j0a-VHF!yS`iouFa5cqRPqif^`rkH)rLHhm_+s9KLq3 zP_=G)2PJu&$bHSbT@)*^KP{tk4+T>TKRUATBlZF6wbhwA!tnr3Tm5`u+VDr34?}v~ z+qi6d{YY8)TxuBnkotPD`}**FbCt(pASvYO-jdr>uxVc#q&$NZ?w5Zqo9BthJhw%K z7x~Gtd>y`U>SS#EOwH6a!dHo2ZLLJ{8dQg6_SuIn{;v%7(Na*}BiOxnu!2^fwX_?z zY{ya*nl6jwFxEA#W~5etvf#2o16bL`oor`WRt1;e;dZKWHLPSOs!6R84*TUn+K^2< zS&J4q*PY(B7qkv3wP_^P49R*F418h+T3t#Xm?C^SHf<`g0q%8(htE`BT{^oF5tnW+ zYJi&nTv#AAED)Asj(vVIRX3rxB<^pwLHbr8+3#SJ>PXQ5O87pbPs_w%5UpoIEYc|4 z5JKAcL-GKUA}!pslTh{nOcr&hCRXPVTC&)2?2B2+jOQEr zdt}bsW)cjepBQ?#g+G+=FlZrZHqospHU*jkC8rMSb!A54ECQiS*Ch9xa8IOd$Lf5( zmDO+^-@5=3W<9^e3Ut4ntapbl6MTs&kmD#WrKOf|R74G?muXUVLVWEdYpN zX|R4hzdioLdI#tRkn**Y?<(RZ3XUD|WCMgH`^i#6yA4YT$88pQCs7a8*3eyHVlij0 zp~F2WEOH=FyLglziTU5Vo8AjX=pM(eaos}%Mdus(*A4W6w6xy6`f6#5h>>~?UY|gC z+`fIUK|y|T|D)F3pFt6X9-tQbU>rNZ+}0#s4fU-MrhK1TFoOW>3xVd_WO&w)v{dhA<@|s)t5jM8u`{Q+XVXH8fzV`u5 z?xMN5EZSg)-4G+#AvjEZJhF`zgVDt5?VtJ7gvyN;lC21Y5opoX+?v#iWbK&g7C z6>cTgx8Kv*3xcBbHT9mQLRcm>)_{=$8#`}GV?2= z_X0sO5C5W$2)^thkCj`%R~>YRg{FgP1C~B(vqzLSiDCt~4Q=0oJvFl^Nzc0!4%Zs| zvR$o&AMY5U=)y65HNkH?eJhaib)9C_pTm*gr_AM-5?GZ4+Lf)<#z+4q;)QcQq@4pW6UJERGAvn3P-V`qK&b>5G^+7kMTpegLHG7T@p`RGqFxW9 z(y-jwmv&nGM)&iXHnX_d;l&#zggdHCv^2ZDrC)cu1a>vQ z3-@5!syn>uq9{=&DP%YOBl7! zz5+2HeJVrsxH2Cdn>cJBPVvE|rr&emwi-zRj`A>0`++o3rx^`x>3@Ec42!RssAEod4$m1OpUAU(zZEyboED^H;Wjz>B z2Wlufpt;mx=IZ3eyAKbK)w4d6`MHJ*hcPw{V$;e@ZBfj2k+~w(uIAtfK!bF}f~KQj z@BQ`E{8xW;ABd`>$l8L6u`E>&B;S$WBd?2~to&Lw<`Sd;)-!#086ei#+C{sPa2w-Z z%_qn0lxb(zATqFKI)9=j{MUn}Z@$Ky+<;SqOufL?saTEPFm|8gfMO(@1em=8sgJy$aU|^zmeBxmjW3JreJOZnr zH3eN1jv_nqG3D$sllG*ewHq$2r+$*`-FfSmvd{oWh zrEs;jFUvE@t3;~@ClvKHq%>_rSDC*FCQn_mx_;Z?d3Hl@4omiU&3l*a?lh|IT{YL} zI(5{rI(5=Ot@2-ilv3)nW-Y|aXeC;Nestn+z3RCNA=Nb3j^uz!Q=Z_JW=(#ix%Lt% zc0Mkb6S*w8uKRfJ*cn<4Cc`>1VOvEKeP|MFb9kLQ6fUWcyWP0l*nKq9+#yzvxd|y0>eo^z4tsoIijZ>xpVVPPCsY|JYP}tIm)_qgG%@A60*w!|z zhT(`|M{Vqng7|Fas@?mtkpFcmwYYDQjrOB8Q&64cAwZ^Pd1Xb%p=5B3OC8D|Z0s=6 z&aF+uJzMNvX>Twxi%7+X_tAgB=!>NySFY$kN>6s}04O%kA>sNM>6Q=r^I-Dy3%xz*X4%N;yX2QaSWGdD?f^ulQ`)rO>V4WSzKsdio$2umkt z=Fd#j$;BJ_c&1Kv+!PK!ng=U!E8muhp#A|Tcyy%t0WZEfs z%5SE`Dmmtu5#Z)@GztWn1B@rJvRPh*G}+ zgj9WPcUqWqwtg@lsj3sral#N>o%(O<)Ds*Urr(0fB35$*bO2OXUOwGUXw`8LCGCEf zGfOx>gpkH(0m+y)ERLgwgF47j!)}_6mNM4Ko4P4LB-4ngB#u?-*esm%y}nT6q&Wn9 ze(Qgy=z^*Ra|cay&vjqU%V`%utFK2;5#uu@ql-YQjV$e@>+QSmEl$IiyBKXt z%4F|KN8#HdJ~>drofBKN)N&0Wu0YG&)`z;kA6t0%V`G6t=IhiJX<3CE2oaUT^Twgx zOh&zl8qWA*X&zv1p(tma5@Drp2PyTQZ43gWP!lK1W940d@aou3v;6nq%*&lq=$#o* zMfZ_a>gTv9rF{TarMi+e&%H0QR?mJWK8g8Wvnlkl51z z>+g)xGa&k3&xahZGab*7D(TARg)lz!nXQ$+1S3ovwKaHpg&<*@A{xSL0GBm8IOQy| z(!N1SQ`y-(qrFXx)>dtfv9a$^@NNoFr}qfQZRz5u zU@UFzu>A^s$^firPGXSxAb`6$4mqkl4}nQh__O&DpI|!9&0LDGNUiC;7!|bu_k&)nqd2SvUe5srA&k zz_PwIsW}T0&JK3$oM39hJ2Pz;_B=}R;|Wy9SXy`iEn3)mZil>T(0vg#tPf8(i@`h~ zDCN3ZsR|3AAD06icNCvH;wl}`6bu_mgby~HmejSaR7XF&^Ery_r@o7B_ zx4o8kZla}>N9so7El`#wE%Lt&;ANzA?2a%-t8K;1+zo*m4Aj$oh6V_|l_wrFiXp;^PSgZ6?IL3L+lb+8{i!#U>%T-uZ_~PrL`VWot`O2)_sXxmu3tSfHbL{ z%wC;kVgb-nPhVIosdcDL9c85FS$}i)T|4`osQ_AUp?1cKvmsbhfvw%gPWpHbn@#8_ zbqBECs~SWhAj3ROY6#Hi+BBgp=L{pHNGIHWwxCyUR*fR29?c!x-XgUFNu?Z#Fb};{ zIJQv{CL4zkQY`N@w#o50N(#?~Wbet$Ni>yNj=*Fx4W&7_KvlZi=Gn8Tq&an3)0h)Z zo1=XU1gOn@dp!e@U+RUKs?zga#66#EXBfa<+guB*>8Q!A_(Gta!xWgg~R_yEr;LAPw#*K zTMU74SR9`(TXqMI0BeX_li<7E$0zFn-Fslk?sE^TF$IuZW@~x*fw20mK7$62~on@Bi~h_5F~>-gAgkjb}At8K62$e24afX$fVd z*FvfL$sEO7hmclVo_*RH{ZFk6bkXX4YxUU|LP;u%!yCHqy8BiNzY#Tsf85p%nFADJ z8)*mok_hAHW$K#vY(Yo`9jlq>RuHR}ZjZ=v0E)($iFmBM1{{NEBsI`h9ETFUUJTHL zhJ)JTBaMejw|~)eIsd+}R|dY@h7jP1OUpQ>RMfELiP(RvFF-OWmNa%6uLQcS94kqIUsK1=UG= z?eHQ(GIOrUk%iK(OKA9Q?2`IrP+`x==t}pwK4M(@R}tj4opl!T8bp5aFmydXVfpM9M{PQ^f$jiO zc&rJ zvQNf|^L&@UzPdDb0gUuGCHm>(cJ=Kd8YY{AkxRlDODnjX9~OQ@K3DQX`Dvr*KrfXa z8xH+#9WS|t7UQlDvz2MNL)osQrZxxW>-6FcI5l;|<1j4L%`T}u^(dZgVx2u&N;z&Y zSf{IQcc1NbJ5r6`>7uB>=BM&5O5{IYudL*x@;$`JViyZ=KdIyjWVM?I2ueQv1%-Yn z9G%w=8H9X!dfsvYg8&hWK_2#=04W1=RQvHy6W1)IOvy7SMRwRu^ylz@E|{9fzv!sO z2=3iDVM{GuqK1j_V&WCJR9oum7mqI(51?UX*vbWK05El19LRl}PpwcKt(OAcfl5A- zj(*v`#&V@$A<(&wG~|kATegRC?}0RNTE)8ua^bLPaNQtY264_9hE#b z3HKTXzvA`bW|Sq}=8>o7m0OUoQVV{?`PM+{&`!1tB#GWtz^3_KgzdHEHPpdh-jl&F zn93foGK?^afFDoC>h6V?__3Vl*Ms@>y$`-m;e|0$Yu`0}7zdSctQ~}z1d^37b+T}4x(g`2f(N96TDCpn(vL;Iqyblpd;%%Avka}= zPXqPNZ3E#M7=@30c%Gk?#1VFy4pzPY@&{6S36OCA-ci~uERUJ#g`dl-l!z-<*>}!{_qN65gi^=w=27dx)GvT z1*^I88>3K)zZxOMfA4+D4Y4x6ZoPS}Ag=mrzcc;bIuv3xY-^^ac2w3Q$#?8aytbNb+R%d>fwXKypUb6`yayZP>5DkYT2Wxe0)nf}vnnsJ%pnd7w+dfr;MY z?Ljm`?fc-+x2Su7&PY{^cd-Y}AH4b?y-BpR%G}9mOiUvx?)IhIX|vsjZq&_t6kXPH zXc*O?4wr>G3#R;@Qp_a!Tw*+SwX^!-^MUm;R_(H02z1$Tt|p%s1GOs00S)lM)b*6n z-epLU>S6&Kke{rzl>T0YQWF|U+f}`W5;6DZ>fQBxfYUKPFm6EFfiWfJ7p`Wq;8{8n#Q*A7fu2YHluST|X!8%m2IOm_A61R*KgcB8RR;Rx2mYQ+AhEuE~s<4LaZ%|U{hbKI0Ul!tR(r8yp zB>4`M{I=Q*UG`foJXvWi7nT*Sybi0U2gBzH=T5RGvl2~77XEEpuU-Xd0%peQZ8eZ8 z{w=YQhs-x4VV0{N-){kw!?>#^Fa?Kar&QVV!Ng2&%2Va)x$E7>jO1<<8w@IJL)#sxCi! zb5{~e0;lKeu+CLD3gkSrI2;+&V)QlSsw*eHi?{1wPa^GTqte~zNX`Z3z|2h~+;CaT z9&`zq>aqr4)axT1=baAKo$0$!63<;3U*AJgH^XCf8T39t62JMCu|Vh}txg^SOA@s0 zWdwjA|0Cm!%VJ_4cNIdH52Q3>pOf0t!1A9^W0z;3^oMuSaX~4}*GDgeqsIHKG}H19 z8}!NTRX*FRJg)_@Yl<%3n}84eQEMQTz+22@JF+FpyF|(Q;IjQo#kWf{+s<4rM@q@+ zmYEDzAf)wg8#`SipsJ&lh-9kLYDBcE`-VS{`BHX-UN2b=J0_0#WK9>zMVcD9uSHPc z_R#M-;hx=UyDsbD7zfS=e^xK?^mUX8Exd-v8}j{VT`<@vObVuopBkC=ay?H^hk7EC>NZg^RhIn-3!T6&!**U-Pmw9#dI$9VV zaYaSzxq%SD8sVtcn{br6F5TSfejS-8ZM+RvRo3o{S>zosBAi?J>*>0Jbho1%nXy+) zsP|BoIvj^(YUf%)_ff+KZ$2m0&;x{y4-M}joC-FMH9OI+A0hRGRzrfev%H8F4ko{t zovCHyCn#F%FaPPhX806Hs@}q;|Igs0>XblDl$i&lh<$kfJ{BU-l&_sLdfEN@W%Jbu zN>AS~w(ytg@pUkhs@@grO^2OBU?Shb+N4IvKnRCbZM^xdS~jvI>;Aol0Z@L|+?p%& z72WS6dzc0&jP}=TbyfG{FV)2A?#JJ$dpT=BY1!FbIy|v96r8$k+dN>e>pt00a$66k zM%wWLh5;cJ*DmPR83XNQ1FH66B30G65mLVIzV{yMARJkHr`~UyVJ5h)P;C*E_6Toz zSzOqPppy3NsA<*!kb1Q?@sr2R3;iHkHMGA0%{hj^r2S!=X%6RSrD1|~`+?1CvJupQ z?pJTg==#A_`qasz(>hJ|0ZIOr_q3~VK;lYd+Nz=^;Ygxh=Vnc&5yD{2lv9FPwA99z zr8aX(14D+ATK!p=n7kEMDV_`Z($b~m&gavGznW`{{ujWocl@OF+-j2-kz!-K>0BLn zZFgKk#B;y4!w@8mcHNVFu7G5Hlq{|awkr8H3y@g2ay40x4@zNduD0%P1i0dHmevEw zux<<(u9T2&A!Zn%x#wAr>XdFHE4dLuJNIx0l;4>;1$|dIP5898YG;_Fdx?w#r(vjl z7oqg8MDqY8rQgZZz*LF*AySxW_ijm~l)w9O&)CU!++Yz!X}D{lh)=qo>(Q37J5Nzk zX|&Z8vKsF*wA8G%)LNx{j!@0ay^(5WFF;Ag!P`q9ZEh#WbjAkx@krY&f8G7)Y(yzO zoRmNGa0`ClCbk6$;9X*q>#3$1%SIb-yH9$!YsnZaM=MiNchXk~M<}{BrcM$oJ5pW* zVq8`sg+VLF@M>6L>as(9u?9?KI5ycXkgZJwzNL*OO$9)W=0m~t`Gp+rKE6oxyH9tO zb2@dh0fl4^x64Tz6T2FFal0wMO*qU#>j4el!QWcv*%Bn?ha|W)-z|+720$g=v7HSV zOhi6)%BjW>q-57Pwf6dC}pQmO$863WF<*s z&Mt4S-yQc$#ApgZOD2O`tEr{!>F#%1VKpp(Q`MEUMl_cQN}L6kvvBmLrcM?BGNL($ z9E-8DTI~6Jg<<=wy7mijSnhXS?xqU7h?1_jpZUMkeeS9r0|15#Z`#$tjw=YHxwmGQ zSGym#x$A6-c?}_FG{5%0P;<@e=y<9_o7KbKNE+Y#CUbsMIAW>0j;uj`TllwxeLJ7w zeXib$yc1ZS#wwM&U;kPUMc&JY+lTt;zpx_Jt#T0`KvDEInK3lbnjRvi?e|YloYng2 zen*PCPoFL#r3qM@ua|w$o}ekrNd}|L*HbWMHm}a1$6wT`n`a%pPOP8ku97`R*TnfI zk>v}3ZhY^MIf7s${pr;4+Le8Upb#hR#u<{ohL&pEs+1#TZ3F8Ka>O@iF@Qbj@R!Z8 z_&Znz<1F^Fj~n0Aye;=E2UG3;V4f*}lDkoN^>r&ln5d(jZSKA*pR0`i!$#Yy!6j3! z%dV9ywg53{zW2YGAS4N2jKmGjx{hECu;x4K5zn zGmh6RHvwVSmA2B$%?O(1!jEX>7U7;rwri8LwxY?&yFu;7+yF>y!`{hhc6|`8#81{% z*-(DO_wUWuXlocwQ*m}B+gYO>sTMNYt^5PsS6uJ;>L45zKXHiCxu!!1Ve9MDBI9Vi z`-X@0Q)im3Aec$?2=bRMElfkW^@N(b&}wGk=&+Zn=j)}CITXb+isxk0upl2eTfk^h z+H?82YT^supYOh(;|sV3kQY$GEUQ^#{EG-Z8D?u5Q3lZURtDg-m;ZF}PuT~s z$7C%4H>+?bQ6B#zos7xJU63HB$J)}%Jt#SRVjeu9uJ7k}lIi;mmIBfYPT6E(A-c#8 zNo(Q^1WKedyYSbwn7N41Q_7y}l%|wVx_HMY+6K#01biFSwdKrbVE9&Hdr8LmJ{MH;s1lvZ{zYVKES{HsvH*-pbB?S3_a+-K(O zEwKntB-Hvt&Sjc})*>fe_jR?ub#NvD+F#x6n>teF0X5aVx2~)8fxX`4|1yNnEgikf z2K4HZKGuD06z(q;3a*v{_?F zdLpesBpESYjD)aMP7%_uVDdCbs|!)12q|4WydQv*R5`EHf3pr<6a#tq5G?7FHTxSE zPI@DAmhM@DE;4^o@HC8Vji*hIX9Jz{wjawDfRY;hoLtWer={tT%WKPz83VK={|QwT z>3kQdZM7b)b9NWd${^0yS-p#ZDz$c1#}qC>a$mS%H4^8SLD|{rV*~P&#`R@QC9Z-g zcMhBr%{8QC&Xm;x`1O2#vc~l{gnM)NT68i_FR9-|m0zt~RqMV5CQ%-#r)(Ru14v2q z7}w4|xr0y@Rc7~Y_hawb+TA>I<$U+f{&^ z*z|aL6!{3yVcUD1-8Td6S(*j!&S&qE#i+$mDZ>j9)mvM>A=yQcWZ$nll8c39x%rsm zv6`osz+pc-oRX7E5mNGYK>fGG0E#v|I5uuZq8S8|j%~wl1=y2^Um*|M^Jyy+rF7qt zDyu-He`S^7E*KW~Ojo{h_xBBa)T-;D(xqR`$I8wXBIN)~m$BK*AVithAt`fps$CQIt9fM1FATiogvNeha;YhpMyezG}DKf)}ra1eW z<>_`di&H(po@Msjkf7>X{vlpZ+wWey8>65S|4$#!56Ok@+%!D?Z zi1M1+UAq#;;GWRbo$vNeXGsBcEh65bI(Rw}SO$tEBTjayaJZsHPr-_5frl@rf%J^c zGB^{2WpxI0HWB$)_tm-lL@L$;eCMICZ?jc?ZB<=BNylMIS}9-b2z%mj@Df5=ZqvML zqRU8fAK1KMXtSZ;eZdf;tg@~mV9dHt8To?6vv~)i*Yl;jyfu~GfE1@W;f#)W6GbI$ zWhw0~Ap9As5qcYx7IrZkuW=9e1Z(f2ld+FxjBt%$RnWzsY;xf~EIA{qJ%RNAR0&y? zNPE~tE`Ni@IjkV7UjDV8G{EzvoTsOVvnTlyyQ+&mP0YGrXoLgGSQloSn(++AyjpFy z$&x0yV0%mX4aZJKIG{{N$9C;6?R!xmYdcr+jPgYNvOhx{h=9^A4iVbQe<@;kVumz? zmcc4@D3{BZL%4CImN_eg)6jN*>jLpg1X=Hyjjy;>iTl>zu;HDbM)y%TFmeqj6MKVW z?M3BR;dH*aQ${wVwTHGD(Si{Rbtp!GXe!Nm)HEZPqK0%}a}#Hb^@C}}zTSS6F^whz z7p&_h%wYHZ);ez(29?H5bf!E?w>?;z1^4w(uf;3T4`JZ zrTXjK)aWnQA%(32G`f{>oiAn7ha#!k|Ww5aZ$6>AsV=>wf+d zpD>nz2rJuc49YI03QX`bhuZ~dIoCOcS?#b_-xDj?Sr+is~!tswbD={ zO0o!QeXum>#res0ec4Pbfx_0;YU6QfezfJ@6nAJ|B_Y}Q*2TE$=2#bE<^z<@M~cL{B?ZCql!4?9WB}|c+mY5mb|wkDX#QJ9!BlE`YPu=r<0$f;Dkrs*UF6;M zRKzrx^w@orbd}-k^8^k}wVkJ9D2B}EKW?B4_LQJ{fVQsM8mK2wGu~cWX~08DT#s%W z?10Qyy;#Tn!eNR{ESx+8_c}te_{(>PC(DoEIY5&8OjUa2`R+^FrVeod?y0-ED9|+a zi>Rr3AJgq}_H+qF$u~>la*`N2yjz{%E5X>d+1k%whpWTR)-vQ;540_?>p+URvBumD zP>uH0D&nSaa>R({nC=!z>ezp{ru*BlWa|+tL%sWv#Rc|%7|d78+_!7VaS!e_Z*A{1 zlid4Bz?qiR9sptV5v6hoAosb8O(YIjPXfJ)sSK6onZj*Y7C z=Kufj0rk&=1|RvM*Nz`E*pq^2Z`U-x;B)hZi_iO-M;4-mHN)?jUKa&=D!T1;E(X(^ zdq-@>e)oYQ8~b2HBNxV{$1Up!qb8af`Uv5t^{O@DibS|uPCu^Q`CC&uLU?BX`r!L> z-^0gM-A5ib!>H9=oagtz*PyAZ(OMJOt56CubF`Ueu0_ypLt8$#*^mcPO?OKS_dq`2 zNE%}utdy8?LH$q)Y;^pQ(GG_RV|&Qq(w+v9w8hQerdJJj(Wl01Ol*f!ouRrn)TF`= zw6s^V)jn3Xk4-M_^n-HUty{QGNk_pNYcKtR8D6;8H(Y+Io;Zo3MhAD5dBZdiF+0CM zBJWwmRCDg@cycW8K<}o|aWEB|9672MC*b73=RwQ=BuYl*U2d+LaInL43RRz+C4EjO z_-V4>jG)qtIYBhh14(+Uz1naN?!>SH>V4;tdL!)w`>d~!0ZG9vm2a5iyPsWuYv#F^ z^0Q~JRrfNG3=Aqxpe394+~M1596G%u#FM zn+Rd11JrqAs9T7=0-wa5?+^tjDMUO(-gzG58(vbknEbGdanKc0@&MMeM)tQep8HU^ z!ss%$j2|GWhik=cVe>FhL3zs}4Zvh*S!1+4hEwqEE^cix`6t35o?El44{H>&p~m_M z(3@P@CJORpyE4~yCl>t1d{^0D2aOBC2#z}^i2*4581;Iz&6`q*7I$B4Ds^cI*c)() zP7zs((CbeBIz~>*P*QyUpY)RDaE3;iOh{I@Skc9?lP}qoFoqm1>t3I%0##`D`z5Sb z2RIcMaZUH(E_=8HK(Omm@gcPqRwL^C+;<6pF81#C%m2W7xVO5!#wN=^K`l_!XjAJb@Q#m%yq?LOF2OQ&O? z)II4xMDPx8gm*Uf^ebh)PCGzI z*Rg$j=)E=q9-^ft88oBB9j!DH^P)_t6`@I!a0Y3vC?vZ`a5rx4CtRQz?#xgUY^ z?RTUO;aU%ShDu;eRl_aV(ZbE~(?a3Y{Q&*H9Ski(3crV%*1s6mcEhAE(Ey~oFbk}W zzNH8__4+pYfuLe-EswP%0@S-dQ4Y^@rM)@cT;Z3Lur5T--*Q};ubHNluCWSAKJS)O z76Jkx{cEsx^VWc}{f$qM4uY!2FyDeeIQ**@eoJs-*E+;h=#A!*b3Lq_Repo550Voj zS|zEqQ$K>7SWz_>zXOR~ze#Hls*X&^5eNCSuIdvs8hLx-Hs?>|0MwI-WrTaAa@&cP zCO?3=r9_P;k>Bk7(GCz)?dM-62n2gKKg$uL%Q1%2S4k(c>U5V9uN|#h%%UiG*_Kty z91Cn_O=Q>cK)q{-s$iLFuWE zyJA0g87U1r(@w{)zm_vLt1IQ6T8!%U&q&@gE3+X^7c^*|hH&S!6c_`Y!?2_YzF zChVn1--1$|&$JCk;sGUPp$9UgQSv)T@|#}+Zh z-o0N}c#t0zXy4&_1K}Z@nGEx<+-a|+*73t5boFSHn-$*Ud=>)*$vlCj$?A!$dJ1G9 z9WGl&@*%NhGW=HGThs?wV(?U5pryf-BRDU4_LOT}0WXGAjy zVNL&D>rP8hanYsuQgD_+DTrO^8a>Mp6m$37cb%6l52)1+#Q{i>Uatekm0*wCWi?S+ z-72JHSYE^?j@Z7{r&ptkyIy zCB^8u10z0=QjD?54_sB=38&6>>L^sUCFC}W8n$kpI9SJf;|O7%(=;OF`S07dy+uk- zcZ89;T0ocR2z#eS>ZI%#LNd1NtH&INlj2NiFDIV=+>9Dd!d5^v&DFZEl&$KnR0}^C zP_Ieiv|vj4PMi;)=@Q{rM>jnSYZDghI`BE5I!=tM&*vv5!aB_bKv`tgCcBG?sq@x@ znU|n&-VTw|!{X0nv>tzQ8gT_dPNjN~5#WFh27oxibv5vYy^v@NRIxLJ%K|6T30Y6;LA8Z1g`R$m&* zkn{ZBb;)HY5`25GZ^Q6rVgO7F+N-r2UL{?DmZ5R9?$1@aV!qkY5z0^= z2X-PzTgi^$@n{g6fqH#z98w4mB;m_s_hq|9Xs{!Mccb=*+oO83U7XSzthbMaFn6)+ z1xwdIju4?4m;UXB>g-ra5#7ocje-oqEpsfHO221DxvGgUONJB_wU$ zUyIDk!r^p#eZ$fs-(xI8LrrlN#!RiC=U?k$Z;czD>m9*9a<$8id_FkUwup%XI6Ru> zGN+`^t;DDk=7yM=m&wY>hTPU1v-e1SZi@->n>8X0PdNEwg<^0Jy0#H>OGCb1ODcMp4 zoTxV>)M{A}tAlE{on#tJMc6jt(JWkT(Tt&RU+@Jh?Q!2 z*7=S>52m&U$Bx!!>~#bM_*bh9_wKhLPt|Con+U1Ls3Rz&9qtLvHsIT;>^5S0#QU{E zy^};N8hVS84-wL*oV#?Ewf9hyvCJF<#&1IYpV2J z;~pWLX}6-(_({Ib)A3IMrL(yFLG9Cg1j@GA>{Qo!2B&bW|H`#s+Z|c3Grfnq1fw1Z z$M)s%_eBWFaf`)3Dcp+_e`_l&o2d2(bt-uvaI`h)3(jg2~d*3QHu=~ zSkZl=drM*^tcix+HueP##iM2Xy;@jnFh{D5jUKnxAmU>=6*u|;MIqh~m0OgxfyTj1 z>BZ{;OHfxYU*G-8Y|@|yCG^SpKIr=#_fTVl>eebf`9yNC1RL0Iz@bb{r?sl&KxOQv{$i z%GPrKLARVmDOOdR923UDFaD&-Ur@=WdTu~YB-Y&bl;Wgt>fzNS>ko;X%7-g|lZu}Y z6>49pB4_f;@POehh*ih@8Qy?m@z+oi?>v;Y^)N?m1YST0V?I+3OD}>cc6+`CXD)RS zETv58T>_qWDCvI%p?YvB0L7ZC!Jd2V?E%0F!@mSsa~+Udz1LZBZv<|t!CS){Osj6% zY;Z$qRd*!5OTULR*vYlJ4qZFvcM?exP}~gL58>3$lbN*~yN3{Kus%&^cP`tj_mP!K zPrGVL2f~9xwa9qb!I^U0@hDNfKXusX1~NW-PHWoo@<~Un2Vp0efYv~Likjxz%-Lj9 z*FQqS-VJrfI|X@$qL#g@Sk(WK`3yXJShGSr1fizC&G4qAlPl&Tv^3RgBWy5bxEMtb z+qFx*mn8i8y4kr@SY@sCE$){AsX>*gX`uSWa?~WIA!lYZ)rurAaZn#xDXd{;#%9Z! zZ55PynO@5EgQ1TU4(=)c2y61~r^+eztKCnd_0a8FP<b#Sj$pUb=Ti1M>? zD{<2YrEJY`(?|VDMAsi|7A6B-B2}WpannASL`1st#{>YBj=_y*se0Qx0+ZSay2cI! z)#_tuz{yCHyE~CE&Z1mb8x61>q6FhWI_FGVGfl#2pt=M;+H63k(bU3e9^gjEgexlT{`q-SooCg0ZFWI89M}E6Q@bt~QPLu1-*_o;-!2pF z%lXA{DDNm&f>i27oAOsX^y~7y20fQOn0Or_OsfUJVQW+(0gYt*`Cldu1XGGJqpWH7 zT?$^lukC`{2}`9a;Nd(!>p*q#{ZKDK1COf=~yLbHy;hG&VO zs20cVHRuJq<~u{P16T;A!H%+Rx4qYvyo*qKUC<31qdy-pQ=ZsMQY`_)Tsn?xr6rM; zqJ>>EV=k39AHn%*=)D7u{>T9^ZNw_7W~vnk>BQA_R(3y+k~s*g5Ryxss2rFs!L%AJ z1!GO1qpyMWtbHY0UlmR_rwWq>V6t<;zKlZFA(W`%T7d?T$aNxHT1_9AbXo69s~^^k z6Ly{s^$%|~@eQDaQL|3I4)#3%4#L_aIQP4_bQ)Af2WO}XiAv|b)d)nUqRW!WaU|3!gOg*OSlw`bg_P2WB zZ^`Diu;OFU+nZ?w`Dk-#_9A`=sw~H`^S*%-yB?HR+57pq&9v=A=|KoMR-P69*4PiB zdQYi1^Z^76{@`Tonmh(l2OHpqeiyk^ab5UnBF|l_OB){nD)6NpFB|m2=?h2OBS{N( z&kxP#?*bsnXv6TPezQHGl3t3aVlNJ|qOC2dB~a#2OTzM?S)*ksqRjR-H$lS5OuP7C zIh;}tm4l5H9elAm_DWC_jghab1k-};88zq7hBsQxKHo3x`0l@{v+^}aO6pKc#;@l0 zVwe-b)^cl+lHY4>zdx{afU=2QpRe8Z*5UdB4!3Q`ejxH{)4Yq-0VI6T7PZMb2&F3z zF>b<`VT9Dw>y=+MykRB#(igtC$_$?$y(7b{N#vdRalF~vjsm@^9^BOI{|s?7Jp8qF zW}``A8Si4Iu9(vh9u0lgs7|Bw@@{jWLj6sl}jz4!};vv5+JnY*sWXJ8q>wb8ULn97sY_1!syu5oF^%!IItt+S*s>AK|C^J2ZvJhpp zoAI{>H-d_?mui-}*TJaawKeC)P!y~i$ntW!q95GMCpym2%H&pl`_h+wlL~XY`|b6& zw;1GsL~Gk;{t!&t)%y}L0J+zFF$v!g9jgB>l|_Z@EUlnf(O zQQh@5(z{>xkBybV`VNFN++cHbs(?H50oSA!0HZ((f25c^9%y8?r(h<#uU{*FWu*#D zBSp+I)2XwvX%cc4F&(?@Nq2q$kW*H-gKJCmI6|ttg=Ho|0M9qO1J$+`I*C@}ewF#* zl(0tePERSmr@PpMZqIA%8MN3cSS6PIak+c-)>#SUvq|ajv?=JEaOycx*9OjaaHz(` z1u*5BY1f4=!YTMh4>2g{B?L^is>QR*fD%sarQuxZVlt7d7PyL#el%)x`Wn=0!P-S> z%h>B^(wb@}NH+rLffL4lzMcEl!PsSwE454vs@X%dbe368n%XswM@Z^AQPwYyg~P*lvp%m7DBnI*=W;Ba`Vj!{iOqyUx zfc#wU74#-b>u7%VRCtZb@$PFI33cIN5`kdfLugG4X80TFaYSMGBc?Sr_tsd)I?C9g zJyVk;%W;$@rfPw80#Mv?+*0eIlb}SKYR(6EhRG?!RQGNCJPjp_<{`;y^-R(j8$H~1 z+|Gh&afNO!Dh+zHG>RUe-sjDF88VvQk>&|0l5X`ghzGDI&W_bGzR^7@bQ-u+(QDkT35A<4T#rV$tHX?XYi zw%0;f>aM1e!Ha<2kito+FGk22t`@BWx1PGR1U+5B`Zm}9P*Uk_wQsQu#B;r??5LJQ zm5Fg>((k^#b0*uKEAwsZMlxLmrWC^^0*!kF?CPu8agDH~NDrKTH6I#d%)kuz{MOg@ z-q!&J%x6Dq#!s~QUfl;uZlr45FPz4yi@)v6Z2(CQhnxTSK_FeaXSk(&!`(N87P~_2 zza1$>Cg@5b*@2+`x<^fQJE1UVOW$Tg9aMn1Z@Kb2E}R17>2IBT5-CkK;|`bcp6DEg z8|K2&LO%t<68Dw)2DfxO*rFK6r zAw-zH|9r3Eau=)I!qpUypiK_8x&JB>)01(poY#CT*Rueo%tASzn1u`C0c#fA*gj>}|g~88y@v0%^~Ix(K%j z?1}vE)KZZ|K$%}ZvC}Em*AQKTtXO3oE5oHwYU1#_mZQrMlI*+n`*N_?HsxIWgrq4) zD^P1(mWBRG;f#Sg#v&7fYqn~y`>uvluxZv|WeBk5ImIHh9-w;_CAnD9m!}{f6B4Ll zDl@S|yPI*>I<$0Dx+ZUFl%4fRN=!v++lzf*_{s$~HN342`VmveTxA%5@ww0DD&+uB z8>d|)hH$E{Ly;C89Ip9lM?Rxc8V@^xRIKcnYgs&s5@uSJSG~p)fAnx|O-=%mwuEb| z-D$8ljN3*k#>^%L)0xM>%`Pjq;w$-|TR-UiEe$c=z)O~jrK zc)z)AI0Gn1ZDZH|;aO0Ju(q%6aV{|j-zwv(^NBh4y~%b&Z~>HmcYW$&;!f)?2G=+vL7t*8v#u1 zvFT+<^y4;|GH*5`Mk|E~yN;-wEE_w^iv+4^xqAVwAa zevk>{avS%;SX<)O5C+0}JA$^4kcN>W2kMC+4NxLwJ7Q!ax637b@;1N@@h&S+C1aR6P2pB zVSGHXOgz6$6#!&j<`31{C&9EZYnM`lP9gLJhs`+JJCz`x=&P^4X+P;q_sKSkGriz! z_xpx=lHnYf>i&AOi8&9aBMg}sOKZQ-#Tas}k}~i-fq?;I9ZZ>+YnRlxjDSN5@OS^# zK!3T_wA4sXT^vvRYp3&2 z?V>N3XyqG=o0IC|3sDr`jdbm^2uK1tEGf{z&z3}70#c|qZZrP#ix;%p$XW)b+U?~a z1ze7jYS%*-L_mk{{Oj6hTM4IS@0=n5x?d?VIK8^Vo0>B7eweC4?TMX;ru;GC7c&>U#0wk4oEMvs?1B$}nu-2UeP*~9SP9F)-!M(L+ z9?pk*c;Ghbfz*1Fg)>V7g1Abn_BZvt1he^I1~XJbtW;)$h@@I+Q++qJK4Uc|uqY%+1?Xr;}iMHw%IK z`V@lJomI=ziE1FU&DJxCT2pXD$=UpFtDwD9dJYVON6SxKv)M(`{9Bp2HJ3*hl7tjp zE~x{Liy>^QCsvz0x`d!f?w+lON-hK8Bim*hnKitxpeet>+Rn+Zc2N%2OG<4fyoRQ_ zQ~NRKdZN<^W~=Ys0Mj4ig7;>AR-pbem%Rn{`ba$kTYHGNyDxgTd|=&#MpPymA3|YY zpL^UI@E$^nJhYp$yS8|~pCowa%F9>};N(Jp)Uzuj0Fqic6Kp41kGdGI+xlw{Ydl6$ zsTWuOByB&jmAc)WcnYRcTi$%_E#trY*>;ujA9&|#Za6I1H=p|vUz3OiKT-;972ose zun0{(t*J@^FNRW2M#puRX9+^jsQW(~{N5g`16>lKOUhA3`AATJWoSL?(y}!!XI`8e z*8Ef}q2+!}mv6pmR)CeS8-zYx38iWZ|2HJW^T>1GBOp3BSjOLLz+Pvbe6N(^R}nC6 z!?richlJ<8OC+un&XA=@H)VG{N;2BxoStatVz{B$UK;A}C@wFI)bY>&ioQyLqkax{ zKi3{^oem76s2I~44^I*kUJ{FB$GV%P^G<+FXx?$ zUG2W~b~lp|VygQ0HDskKZ^mQ>kXf~KyLS0rS#O}G{ZzE3%$o?xq?+E;AUnF>=?Nv< zZX-z3jH@T!0W#)!usYmkw-1r9iJT}CoO?m<9c-I__aRdF&=D&ILCIJpm=GQU;mdHF zdmeSThBsXS?s1?FWt!RQ6SS0brexex5YIjJMN%ZZuhfiZ!f8s9Ss!ZC!-DE+nk!L~;_G!PunJ7+_>C*!u^J(z$Vqk?9;`v@WN-P_ zB_xpMwHB@mjk>icSmXeosOUb}?N#@-$-BP$U})q(^9J9Cl4j{^KF|8Q7>w2asLsCz zx@72dWo=4gAZdTc*oB56c{cxF+w%*JpoZy={KD}LEkan8+gk%V_h^3FRR((F!f8L= zqNoCGL`)*i*KKNl?e9&alzg>+f*rF#y&dLbP<4%6cyL@e%x$kOp8%84%*dXxGTl0f zqKh8?0-Yh>c~+3pAYAG5j;m46Kxvar;9yHt$6!PHQU)KGQ z>-o|^e!b3uZ{*9FQESqh!ius{|GOoaHZB=!c*9B5d{8?@cMu{rW)5@H)*eWrA)v~t znU@;nP`aPDD2y9B2MFrS-?b_2;XJ7A^GCqER4fVf7!EVrl?Q$0Nutjj zE=#(n0Djqtb}VDCg9>byjQvt+XU`B6ZSK0~v8)LuTkH+nHuZ1VW~_s~%loeSnRRO8 zvhDmW@=J!*0nYbwOtUy2W8wSt-pmqE%2U&xTrt!k8J9FNH|n;_^7HJjsdB8ny!*Dj zpt%B6$!1Sea$#k@mh`j>G^(`<0T17!UDUnennzYA4s&2mw~DZ)`)G2iJ=gXsLJI9R zKr6Ljju!SE7-MROMe9&>nlJ5GZQnpxGnCa9b)bv7XXFS=KFbA^bVes{#&^E#D;0H6 zSbcGft$vBaVT820$-tl%e|zE|sx|BmVM*~1&~_7d=JWC*6bCk=2ugBfq6{9#fuuzq zMXR37_h#pIay$)U{^6OXe9c0scr*L^tI{2g zBp^BbFIR`B@+s}T?KzwVlREQ^-lgv|Xp-~6UT;1hvp;|kKEFkaFFv0`iL7e(X!f=( z>+^_mwPMEb3;D)@?R+UOqNMY?QX#A{qg2l-M2mWoZ$~_TOgiM-S^?-*A3^C>`{={%$p2YB=1;l#^IdRYe%tJD z?P*}L4qBTj3;m!(-ms@cE&@`9<_s4D7o((UUM~wx*Hg%c-X~mI5D!4IJ}~$FdW(#J z=u#m@C(0H5a+I(kr+O=3HE(;ZWJHo6hM>WZ&#K{vQ)oy;M z>q2R^4^WijQ12a-Q;BSXqzDN2vTUy&oq<&*CxU15odWN#mwC>CigVB!dT;L(?>v&? zw98Q!gwuse2Q%Z~%|*17r7ZyP{St~U!G~wL0lN$-+1$4?*IfZqnqilqsRW6v0Cgql zTKDTgyE6mOBDrNpRp?;52z(z*?(N;ba`~(eJxC(HaqF>GMh_9R+{%AN z90yq7}sKqf0UGN?+0I{ z6@aSonXz(@zAk|IZ4LSW(?9Xq2c*E$?R2gm#tYVvwH6uZetmbWY@i0=@R%ui9Tp8E zXs1uVVw5NDmb&9py2cJT>>;{XsnzmfCtAw*(o3t2cQD*>$T#t9*B)YP$g^< z8qL#yqU~neA?H~rLw}g}4|huq_wM6er7j=uVw9Q3%pU#h1d`$&Q@oRc>4;6iDfepf zKZTkKPEQ=G>G?E*5==6nvkU;jtTJ?_5#&ctz54MSpg`2a+7oK0K$6;O5;E#LeBiyA-!kqK*|Xo0z5;|#%_;m>jQjjN_w9P==^7ADGk)kj4tE_* zMLe0^J5IWR5Y}&acgVz_1n&M`ZI9e~{#!dL0CDMK8ugA~xXgoslVm*n5b5WB;{Pxn z@76OU*D&s{>DA?nvALGJ=XaGp7Q5{GPz}NZ`q~5G6k%rW&yDd84i={$1zOCu?(;Yw zzP)XWQ7#-l)+WkRsMm7yZxUTG+EFpoRvkf#DbMo#=U;JMYQa=1ggfX4yKrhWz$~O0 zXDvcXTR0apS{5ftANyBUNry@vEkWw-5R^I`2S!xTrQN5jEv3E;PE#1gBLt$7EJss% zidgmA6%Zzj@T6R4CM!Yxi&svvbX8*3_K=@eL+Oik7uKh15PIFf(-?II_-aRKuP+5&P6D8&lyws@zQFss4~ObHe}5OHOa@${mDm89>14nr|HvUu zgxb~PLBtfQROhn%8}2BUNmpubbUTVl-uX9``3@jOvZ-Pjk>R`(6_eP}9JGQ3;ewHn#QNsWSU2TPWrc0@67*j%|l&V=X+xQ`| z&mpE_1apbk^BrMia=H|l3kb?xV?z61gs_pkQIqq4uA47`#L!A;vp ziy*Jjv`s=NWy$JZBTyCceR(9SIpPM0#V>zpB~c;V>vsRHhB|qHl7hdrt*_onyN!T% z+iFLM=FwIONXl0yr8Vq61SROw0hK^F333a#tLB;eD7|4bV(r%2>_HMxg{`|ckrrT@ z$8DHgKYWyQYhgGh!oOl%JwY4Q(LEo@L~kDwpB`m2>00dEi>YG z2oDr;_BU3M8-nR+pZvtjLrQaB&Pp)6h$T>oj*i4swJtM|A4rlP z{w&Fn?+Iv+WDpzqWz#$4g`k`c(Vp9cz7E#orl;D;;`;om4eorib^!X|>VYmK5)pth z*Um&0Y9LVDpa0aSs0v`JTc^`CsE1K7V^8e|ZSQ{FPFK{(w(`S-`Nqm15Z4zN;iCbMp7jQ5F((O<%G3QG5A8F)yvnlt|kwJ|26D*fAFM1==Oj~IY=5PHL)x2^PHM|o$%fM*W~2$YEHEp~+O2fb!8z`X}h zI6J)U?akx@Tx0Hir#5rn)l!cTQvdR*+F0^9DU@cQ4o|uiyrrQBJWUGN&r4NpihR^X zhy&wiaJo^mVbh3)_JZGPWvp`^Xdx5zgu^B0zokpS z)u3;Z1%kcV?@GOLRvH|UfQoB6(xHi6F@av&rSV$36SxjeVMpF?ckb3B$o<$JPO$*CEHsKa^fEh@?1Q`bAPfP^p{m2ZX#lg*QZ?M69eA)iE>p9a!QWkaHxhSh8$n0N61Sb+5$rX2^A zvVVi&ANsq^-R4Ok6)F{@c~d=wlxF!g;`?-BQ<;soGeGz~ICikR*>V;&4K#YFj3Cc- z_(*(;!t))zr25xWgSm-&vHLWRv@XGzRDO93eINx}`3Yk`QJdGVa*A~o zPKq^{v!Sl}t|8;BcawV?BG^0NUmJ$I=_)Xk3Is!6SsZy{(%PmeUoe;d@s zTT8LLBdm0uN0a}D0oKnLbuXZ-PYik>UEzyga&`6r7?#^ zjd?lORso#uGuFGa{G_AMd-v68!Bdnp4qqtWp7$H~5h}K9$g2KT zTfXJ4<<;)@u?byrEvW0*$Eb6ubx>Mh>sZgoWql%)mM;H3NdD!fCGHOU5tPp%Ut0tW zfJ**})rP-dwNwegQVxe#6-L48Q0A>c6RGDYNjIz0JI}~j?+c7jeFN4+BSh3*S@lYgs_awP& zALB&#oh|F#heqlFo|9F7i{1Gi9Ga*LOCTo3686 zGMguh8|Pr$ka;}^uFU5VBIUBJ5#0b06C5mwaS_1jxBILT1abB?rq-ngK=PUUuHCCE z`C{%;*>GG1(v`MNnGvt$H)^axUk6ez9$D1$2Al#7a1Scgn+UQSqPW}=>`Cmp#cqLo z8zs91G|09?P)ksbRlipMi37hUb#op&>knaE+wddv&^;uj=Cqbr5UxJ;l{%s)7QnQh z1M1(eS(8G5R{e||ek532Y3I+6^Qn238zEW%n4;RLJ6J~jPf--5nV!^i@)0aw)|ZC9 za4Nmwa4ZUDT0!hW{y}w!g`nSiI-PngLXh>5c4=ubAZ0479a0Un1eWrlI^tWJh;!dA zr%KE6!_>6lxm;LP4U(pcuK=}VPfu70g>7$**Rp06oX*xR`;~ZDo$qUyw9yXsSoQy4 z7F#C+9&MfnR-h*4wJ36#nDJDMF%Px=f;;PlRcKdx@U5@=@XjA(N!X7PL0ZOO9Im!y z??67HXGv`k2oK8`ObLe(QVIV5^q%c-iev1xvACoAq?!$bb|NUz)++0$aOzC2WnZJ? zjw31L)^-*&38Y9pFBwf2o=%i9&o}-7$?d8u8pnh)23{-g!p8&6i*0}IL}E7gwkL&^ zd#eqPre2f9wENlaqc5&B%AxSau1cMZoJUX-(E(HpA82iRn^(GsY&VMkR}sSR&rm3erPomK z<4a%qm~k)Mn;PrFr58);?Cl1s(e)Y*-4skYhHARF1*SDOwzpJn!_{Hh{gyjj+&60Z z_aP{s>HWUDCoILI$oB=4g!2;hevqHu++rm@Q=y)EP(AxUJo8ve2Hydbdu`Zpzd zo}i_C8%uM33Z}M4%MriiKSJqspgQ3y(leyALp!%N$Is3uY(AYnE$fo#7JS&T95scJO5N>R5kflw zZ%$QKCY_ob;z0~fPn;z|Rzs;V8?xp>X-yZu|8PA!{wkatSf*AEYZ35t>WD(F>wX-b zYL!@zAa$d+I%OXe?oH2qpG!Crv%e!bM4~#1HGtG}{9pcyuPghtnnO$W4<^0$oTaPn zFqG21;le>3uWm<4cX+Ms1?+$`^VPX)s3rL{l>C&Y-6@zw2{&BstIdaF`QGUTqc9>N(3X%#^(X;d^dUMD;dBzgz zn`@n37HBj9^yIX4Wbb>`|4%0+?RKOLxX*yhqu7 zD^a3r2uA4Jn)CYe-zYwm>>CJaliJ8BbxwLW5i=U!>|Tbsl|-gB*=@n_qx{a*w!)o` zGI8)o^D+KmMiWk-98E|-MUoeXJD$Jz|9PD!QuJN8cWrMu;k`1 zZ!8LA_u1skVz63#vMjZh0AW`-x5a9I?AoOOZ>O&Jbz1)eK&d$rG#e}R!krbu(rU#h-W9-LQ zlLvw+RsU4o=dH0Zjh6o0bIDx9S;Vx!W|vlV@M8$dezeT)jti%*uea^y6R-?kveA7~ z5L4{<)XMHukRJ6L9PgZlBr#JP9cP4-#HMzo{4CsCE?(8&%J;}$Wmoc?Us96k_^3UP z5I&5VpIM&GzOQ^2x&&wEzDM3%gcU^AZ<14&x=+MMIo$flIJ9&MsiK!c)+Pzgr%r_I>Ry%vQgp<=?`5x1AZ=<9} z8|!@yvH(F!%KCa~J9n{!)%_m$R+$w)0Fu_hsWu5eM3|qNZHxCD zSU&2grPkOxXqwGq)Ksr5F{uw-Vx=yX0)Zf3a~RLH9|d?3&6@357qu)|RBFMIR)@IC zqcDKI?q34yNcE{jXi{7K!xLY(JDB*|xIH?z1WZx*oiq4JqPs0qJzp(p{N09(k;P)-4`J2 zuG7YP)$}454tO|r-%L%gmyl%C+}U65#jZt|ZhZyBoOj)o#z>~Mr6(N=C@+sXhjxo#mNO$0_hQm==VvT_SdH;A9E5^V$kD)wz?hry-x-AO`T zSGY3oBK<=o{NS|))9&SW0-~KbmzH@yX*dl1U8>&Sk_26xttP2vQ1B25%jSN!?TbEw z6paBsZ)W%ybro=?#f^0_OykMjL%HkymS&+@x6F^w&ae!Z_M0e{{?(L{8UYq_C^3h!&x!+J<8_jW6zg*34#Kx&aE-Q z-MBvB%5l?VmUnTKxBABl1Xb5gRo0b3%37+^DkvqgYc*C(}lFvI8c4z z;9eK0sRf|E&|Y(#7EbNhztwRUS%8F@<)BVN$Drzzd;7)pnU>=S|#*Z`dtS}HRZ7;64zJ68OD!dwbMh-ly&;|{rcTPPCcTlGzpe=7e znCmE5aj-pLasx<`b?DYsQ#X;)kKU>ys#}T9v`bBH1HBoN3cPEir2HMU6rm0$XpJRh zK15VyF{<<4gA}3^tlqV=`zQ)wf1ml-gZ!-1yi3b39z8@!KEA2lI9z&!md?m>UCkcD zk%GIY=rgvn$w6g&f-dQIn-cOAz}ksYpFYYDEH=b?2Bem6RA*XntbMd+s)qMMAUu=1 z!v>=tC2T4+ycK6Ll9UgYvFs9IwJl?Ng!d z;mu#`N@RWWHyx&|5|l$<<*-^<0rD!Ig|5M}1}QaQWNW;G#qq-vwfnmkN)YfisApZp`ZNY#30QdY0+8 zYMg_~jVn%aVMl(}#M|mt*v=0A@WdY*=3tT@VVa}(p z!YoRUll4qay<}C&-7(};VY6+Kwy}R436BoDkm$P;kRrd^vrsr0sEE6#NQP5^G#z@q z;Sa`*!&ZItM=lDS@qtdpB z-SQ??Akp8kYK;}kWrQ}Q+91nWP>(p9i>KdSqv^kiFlfSB**dp*GL3(&8YKM2U!j&#Eus~ zY5ErqS3M5(*NUoLSE8kF(;Ayvv$rJtD&&-KphV;9r1F00{cE~Z>Y97bHDB#$*wA~* zYHgRqzB%gMy1;C~lMdY%C7JTvXCE5g)2B&;{=}!~wwZe%zrFPN-*|~&0MevyPSyKj z!>~$H;|T^~)z>k1in#;IfbkY&)nq3^wQpO#k9NOqt6Pl30zwjI{s2$H;aG9&&i88h zJKfP7SC{o)Nr>m)wSA^zaM(9e(*1bgI}Vp^a z1&^dw8kc}x>ra?IF9%M(cXX=mhFt;4%HelOg?x2rqV(l!0M1W%(N3)E`RTRh@bU(L zuiG~NI=h}>f&fnTu4t96e+wal%f0c;@VC1-2R!nt9(NE@Ynt_RJyAvtKvUAgJ)56< z;Jl=68>RXuhTca`v)=i$8X^z!6_uP|qzr(`{NUWT<51`kQu1ncn%0y=16r>y(M2Wu z1R=?41eJISr``O%yWVd3s7q$g$bq@PoU9vI&(NaIGp|Uw)o!in`=Icif1@}J>F-D-=$f`SfFzgNeup=oLK|O~MI}udxmwxGGn{cB*N>LUy%@B4RDLHsJu1zG9DD$1GjE0)o0(pQe zBOargJKxzZDRb_mqk4)0QVk5+o3=O(WomTPW)H|dkT@q$Wmo2_M<+(h%gIR;1>^+Q zXgUS-nw_B$fdEI!y~4)w3=|H}%>5-%0H#eg#RBvkLh3S9I<-QaN72PTO+;SE$K%#O zmGVVU<1#rV2NFI!X{mNuI9+7#SUu}h3hxy(MWhjs5?2E(bM?P#KuR=FE1&D2;*z?x zvv&hZ`8Ft@%HKp#K7EgK;P=XXz%3LhdoZhyZU9JZ!g+no40pir!fxmvkpXZ@)_df~ z_xI2;$hOr}31wkH3?M262~$$`L6^+dv6|l>c9@Z<-ygxL!slvz`xs0vJstUP2mmy^ z8mtS(PleMWFa3gn-+kQIE+GU`rJC8uf-lZ9fU;CN%0dJmTiWl37D1_?LqnBW94w`n zF)o2M-lslh%nRZZgGD;RGN30!>;6Y6P0Nwe^0OoRKe#Tj6)34z-%^yN>eFblqY*SC>e=T}uHF5* zjj?YS@m)d(m}^xJINrr7#Vpg(3AEJG&8DU)QVy$VdIbF&(#An+YxeSI;uQ>#*IrIvOqA+vO2d?H@u{XR<7C@<{X)&in z*OAi0-)twkH{i&`-f2sFP3IcGYI(Lr}Nm3Wi9?SN-M#0wG`7=Pvc@ z3DlG7xkAu}-&537-MwTjjNKn0^;makq}?QahLURbW(@Lv!SVSqLx(Gq?oz21c0?jg zRoX4SMTj+8YeltKxHsB4#H${?r2C}pD#Y4&X&3EHZc~aK%R(vBf8Dc;`j?~VWglNf zVhE0W+X)C^#as6Y+XjLWFXgX&YG$fl4H!i1O@VP3Ka8Lf zwR_PlT(-kum9q+adX@?ug^TZ*+E&|%qM}|z{9}@$`?>a%s+W(W=qNQ8)*jR(m~z-& z)soHFY&uCCZM}RpAJnkexQUPel~Hnanj^pC2w}AI4ZJ!5r%%}?+EW%G)mA4_lh5Jj zHkPLlHN)5>J^ZwAs>TsP+y6V$QD}F~Kh#;2@Mrhb%-m%H13_J#(rUc(-LG3_n(guh zgtXd*(YhT<)44)R4vRREL8#1{AQX__5*t^(ablk&Ln^PymBF%*+r zasWwklXDkK%eo&#A*-hdA3#`QL}-hLKrd-VWfRTq!y~k$M=#+6OFbVWX$P{3NDz)7 z;op{m0H$>vm8;1|-OpZ-w=C$OgA@YbOY;rHW_gA#wh#fo+cVf1#*4Zr4p~aHEPhTX zI}oEEp*M2>v0i_m&hcwTGxAYWD~`2BCrj|GK-J9*7_)i_d?2d~j^?8L{j>LhXvtb=urZyHD@ zbcYjnf4lY*X3^3L#edUuJ7hnG+B^Dp5c;FFIPRA;Dyu_6{{*a%2j?{K$%NZ0ai@e+ z#Ik6xcTF-NC3{)@b<8==pcNa+g&mdlEU5X~!mzEh&V|sPJ8DM}=R??H+VcXOo_isL zUq5W5G>z*bLTXeVS@K#f@qn6k_Uu60Q@o6l5_-phRMwVPkg7CS6%cQ(g6T|0SaRta z*SbV#Xsy#O%fakNo{a|;CLRrUFUoVOMTx6$9d%BBQT73hup7PJx&DKAFStt zo`5~MZ?|Ue)SI}; zB72>L2Fj0&AWy829B4g>$8~~EyaORSv!&~o*W`Nnj|f2z7e7Owk3wObYgO_ehZS$2 z-Ta#bQoJp^+||r7ouBLaJ(&TdzfRZr*0KD?`+!6YBx)N96$QDgZ@q@+GQ zZYN98PNAg8M9_b3(xEM6PNP4!K)U;lyRP5rV}tASwa7n@!j98J-LfOs`OU*in-K5&RA#@U@A3yxc0BEba=~=nq;m96T4bK z6I|U#rDn{8Bo`Q1cNmeH}=JGvDx)eQ4*cTww&bPab0A!XTRkw~rR z@SXp!YH|-&lfIs=bN~6z|8Gq+5Aw6YK2)z|J_J(|H;*nU`lI~r;J>|K_ZU<#y<1jK z0KNV0{Bx5n##2N?#E79(2q(4P_3LK{Ve6)vfEN6p4elPVtp;)dl=uh#x^_4g0n*u1 z+rf*4rDNt{^i|8jB_X_SLpqmEmm*}0ZM4_vie=lUT83&c&nWA1!Ct=`+v^UF(X#?6 zg)s<82T+Cv8_AHLOmu%#*AQ2CF?YRB30wm@92*%O-CTDjpPSUa>IW5w=vf;u^8Wks zS_i1Xh}U7t)R0g>ka-;dm$Ka#s2TbW$-h6}*5L(Fkl!4Kw7XV=V1|pAUvq^SC3Agy z%DC-8<*)_1luHst6LvW1fMkDFekuBOD?q-{q8DpbrKN|`98;` zQ$PfqpUv>K-+Q|IN=<4$uU>x!QRNJuYRa>araV};-p(cLIdCfpVQFu*VxlMj;bW~b z%PZqWl$575h2D1jB}A3l&9JzZf|tPzw>?dHywYJFQk3{AoK(yIZ=F|MON>#@M-Not zuEPqqZ|;JDFI<(Kt;Oq2peN10q0ySf&@Hs|QQIms12Cy?I56TVXTu*QL#(|%VElJc z?9ub{Kmwqo$T?uV4@;9+ZANVmzzEytH$jWf57Du-x6SzoQqsY8CFXH{QtUbodIBZ= zjm^97)BLKHw^qZ-$<%I=5g%sYF|8gb*a#(_yR=r<@d;R3A8nL|qxC#wVKl!m2 z7JOV#`FJuTfmZ{%hnr+=o9~4MuOK9ScM)>hvnC(#9fWtk(*4fkwjrlhuOg|yt`bbY zDxAFero@_RinVC+{=yetSnx?f?5KNvepm--QIANq`(~d8rSsC4Rug~uX~?_Y<-~9! zSmVIcR@LsuP#5j4_<*)8lC7497v%b4+f_3mjF2;U%DyHq@s+m;HS z%SUpl*NaG7xR#tl5o(z-RReb?oO+Gy=7z7Sm%GqX)Hh2ccS*RxQy!J}Am9?m zswz4Tq$>^0);{w-7_-~+*o4U>n52d_ys+S4epI@nHI}A93EAit^AM0uTUP$HD%J+G zh*-)~-U|zk2q&kSyXbdtx)27H_45l0-bYGh_OP}qD*?hDEiKU+POLA7($wXw%}$^w zrG8lJ=&wRaI6HwzCy|mc+t1qR(jR{ZP3ajnVdE(v(u*@bO+g$qyUO1~SLm8n+WPZ! zFb-_rvSrH)3%(AgecTr<(Rv0UY^Xg2eZLy%54*2sny<67FecY2SaIo(0!t<}^A`}) z+{=Dp!Ji1HE`3vnZ8WIM`TTsiF7N)S@cdL`I}M*T_yxo;dRIH||FbSq+i{DRm5YdB zE9HCQfOP)?1wXbmdy-4t&u`T8R#sd89wjyP%uMm`a!26uwI+!F(0x-^#cKcf3QE@} z-27{Yg5N=u&*xYD!pr8l?wj(}RNs8Bqm=8|a>I5lA6TdByx#{f=VQP2lcqr7C@h-~ za=bcqFm42YfUGyTR6c9sz5%78^H;3@uA|J1mEvW}L8Zn{s9S7a?AYgNi!>gBDt&>?@T>$`CpI~iRb=WxZZ(Cx(!PAUj@@vEVi}Xhp?Ve zH)$%%{{~9mRq#=!{64*h5Czq416N(Oba`RHKcZ%oeh!Q7Ll``Aa3ALVQ&K2_!WdBp zeSi>tlonhQ=?_t`bboEwJ?x^78zrLuGeQdJio-BPzQe9WN&jD9b=gO~ek>R+zCJc} zXm3sa{~alrZKfQRzvCw;y2M+DXB{>Vv7RhD!vBG&#CN}0#d!)O$2^+#KVd9UgAJu7 zeAL02qtg3dfd{z6siE`?#EG`Q{=$O)4Pl=va4x@MB~@A^zjSsX$GT_43T3M4f1Bs-FNdCbIKZ}q7SL%5wEsC%l zQ4(z zKd2-6k9S|}`GED?YB0=U%3cEE6@+wzZoL*l6A zNL|?bRZx~z3nc5>?t=;Md$ENt5%Nhy8Q0-%ntfeT*j6Tt`t+wk4Lo?4A2I+nL&a=u51&PUAQPQ(r^Tu1-bL6#cL?o1NJk!r@$B-8~rq!v|AO z^?^4L=Eb79hGr<+!S17dr8aH@!)`C%?Vf*|Ww=YKFC*t2gzBqxinv`kU2Rj7;h%#s z%E^}#!yQ1%w6Qj;zW}C^%=*3_Ym%LbVpp|oChiJsn1jQyV{VNg_G#f zv0B54as;W@!EBpi+OaMU?l}6_!QSuU>^t17&WI>rP@nlTSbuVX%!=S*z-H!NREI9+u;sUX zt`3)HExJP@zuz_hE&~c`hpU;-{s&MUcGoG{mHbrPy!+cPEcgzH_qBPTVXh|Pi=Tgm zl92GO@+){vI90QH!oBaqH6xK6*9F6qZDmgV18{!a^~^%)2Z+7VIo6II{thAOar33x zH({l4m{!xz-$RP~=@*%r-xBW0^6NZnf93A))MWe*s7Y|Q-D{oZHbP3VY3Q977W@}5 ztS)u0{J_u%&@#=~>vP+MVt^u7M~StZ`VdN)UZ;G}3*h9zprxES-s=)DyvJ)h{~u8l zbhwNa?hB^`V|6*$Y=L|DW@#k)qU(@}Yy` zs^-5yJ#PG|4pi4`ze6cNRSd6Z(FTOWe?4K|q52cVRL$nM=KLRU#yKfwSs>-7NQys9 zQ!o3&|Ji*(cw)v!-4`ZC2RKUhzmSsCEHxTKN?Cq}s4`QIu$cVe!~aGITl&kv^@6Xq znmZhj$&Uf^1EQ^t)ny@CTFLR-_sdG_$5HgPK|Ee07%rA?qo06!1@Lr;jlts3;zXeb z)WyP|3fk|OR(mgju-$cQU;lJ|n&Ny%<1dAJjCG>v))=p5FD&?(d_awn)-nK>Cu;lY zXNAMiq4tE)ayT_1J8-C$fIrv8;VtF&C(fywVU1XaCr3%0)*gN(9fHCn}N7*}(3*G(QHzPCk(&rm+N;6n) z&j&jA=7u5aKnI6wY!8C!bn}~f%r;?l8XBvMro#dI+xsi;0I9>~c6huU?sbyhJ<4j5 z&!I|dsysUE=!L5RztDZn`37OJGr#Sw7v**dCnbhw);f7WU=&pq%&Sc~*aK!ts%^Fj z_lS(V+5jF;JiHtz_qO{$jJI)An&>2yLeDtTpb5a~3VaGmqK)0@E|QDuy8j_q&hFN= zGp<<>OJX#51W30TrV}XqF@$syet`(75}xm)DTCEd3Gm}k+K(RF47Dp2*as1WptJiIyS0_4&qF5vyBLnI{_l5J>x)^?{`(hgrUrN&Np+vH68)MW} zTNS5~REDD9F4EVN1Zh+EV71q4$nD*2kDX&G&|cUVZ@x1Evn`s*4$a))6+?WKxog z2uX8GolX4(n9|I)dybdjRF)-8OrrjMN9x&#+e1LoKW#$WKIl?#*Hd|}bkVt%H?!+p z-$6>-ZP=gtSyvOuY}5RbS4(^kDV=I&qMihAn}OF5Q@pQ@)%)$e*2VX8^z zA3Tphg~5><2-v&o<(;cvSnzj%avz#f?wbkU{F+q$UKrakdh1*C0|<+F7H|FRA3&ui z1sz$o&Ai(vDb>EQ^0x3_;Os(G-+lhR$Q|@Z)>^g_1~HoYugK}_y+?isz7Nr=;rW5l zD*p{iBh8e}_PySZvj0fE0&EI8~-A#ST%CWg6DA{u3;550hAiw$}?@* z`vlfjuUX)~Y3GHC5Q6yS`BqJyA}CC~g-boi=YBoHAr18amKme$R`CB7xY01Kf&C0j zM;NZ_4U~fXUU#EwP%ijdOWH+T&HH13I!x6ys)fR-vomxF{dkABbF4}q=_3rvhg7mzl&8AYHuq=+}lnou7}i(k}&6W*@th8W2Cz#pVHcvaZK3 zL+N$wxcUBBgr1BwaIIGB&}w;-!K0(4nEc%HkF4!gZUsUboO?(ckJkS$BBf35X4Qr{ zE0c_44Z0h(0K}5112e1xlx0;S~^rz4~BlAV1aD zHIw`bC~-!JQ7c}BQ_(%#OzAei+7Wv1n6E{s9#^ZnPYN3r4F75`a~%{WTk{>N?)>Tb z-^Xebd_AO~dO&$>XbxgFB9-9XN&^tok{&_9$=3kI;GwscWSXlVL9Rz8^rbiQqbjgq zDJeOC5GHP^r%Bqq**DQ5GfK-D46-j(n*!UQaBOC3@<<~MBT4`D@=X4YaEABxEmZgI zUF%i7X5L#ARgmbyGdi6EaR44!1MJ_t8?FHtU$}yGRVFywgxj{c=ZhslQ~Y za-Tp`sk`-bJpuMrFkIL;Q9ASVxIS_cQQhi-(C-MU%;8#ooDxoFGM4sNr~W;ZlzdNZ zrPK&Jjg-P}Wi{&o9US>OTCWF_E*k4hmr~iGmCe>4qR3}p^N{&oI09!wv(WgX4zo4T zY0o9D!#&G=;gr9fk~ngf{CPy2w##ak{8K>Y^^li-?2`)!YWGX_Z~jbBlWvUl!$m0V zJydGOU*yLP6cV!QQV`Kvn%2LE{|89&#|)V(f~m+xa>1L*@=K<2!SKm80{#EL!5uSliRKQiNf3{RiDA##kF5KkPn2cJFT6WAreu4B9Dg2E~65ZFXY+`)rGI<>E=w(`$B5)xh~5 z9cIy_^E`#qv*#Ves^kCcBGFy+i;v*&w7p97zrZx7`-pO-ElVRc9%b0&lD<0Il(Urc1#-Dt(|! zp}oXtdjKJY*gSFwgO|e^ldTgyAmO*GU#<{NMVxe+{=rn8Yl8M*`AQUB!XdqS{$ls@ zoj<7U5|e*N;Rdc59DKa@flY7|KcJs~a;3Gupb|`uNoS3)`q^%+zWXas81x1uy)FM< zMM|-zYX16FFvZ$1izixSZ5M%2sfizy;E)X%$*+S_`N@fC8GITJe@9p$NN+ttx=L+U z%p25i?4sG5D?`gZg!FPgt$GhJ*QU&C=&I5@ZS)J{k8>Fs#~VOe%8b+7njSz)*)8|} zx}GX}6Q$Qt%WH2>a~?!hg`Q#ZHYio#aa_v7aCl^Q!-1Acypt%ld#D|T!**CL<3Ol3 zRzHUz#i?m)9~%QuhSdMh*!{>u^39WmO`Mr&=1YqVnwZjHuuMB~)xYNN%jBO)S2L|hRO5fKp) z5fKr&uV=kK`{T^b{o`&b`MlrX&u9I3)~{zh>sf1Y`ktFHTSZ=nOb$t|oOe3)=6ZZ} z1lvn|n}Fm>yX%(xNAiMYbtxGGlGx>KJJ(jY>%yG**lbe--&Lt662L_B8=MSq zL5B9SqyKvS=!}`26ioLNC3K|i*q%joaXQt4(f}ud6*_+r>_$|@-Cnksz5TB>#-;~)I8$2ogP@ol7;FEK?;nD@?!1oGDQjOlBJ$z>vkkTI@+g>c zweCH|&zXIoe`Bb;VIB)~)o;_c9tR^MGplOqPa?FORW*n`24Pic7( zOm6!7-d;kbQq^uh3Ir@f?X65FuRtl%!8%W;W#}L-iMYaTFG774A%~0qt+Nwf^PJ$U z^Sco3^&T&ooByvg23Uf|XSZ6Gq%?pnwssxEq5Q~@+g$hF4pbkulqv5Wuet?aHER(QSumsQ(!nrE%V?=ce z?WW&PfUeTCbunvW?Lgm8@q(?Z$C|5}6@-M-R%+d%M}0s@>gDCS_l4)=WWX|Oa~1wF z@5`%dRKv(uhzN3EuFk3d`X}6$D8A|OvUcz1w{ZHpI$>9*RVLo=ki=W7)TH%2RI+c< zqb7h0RgUHTfXT;SQx)>b7$;Sq9QNyl40qR}ceVU*d{@iknRNsrf$=CB<$}m{hR%Q$ zqt?~TAxD9dBa?M`($UburdK2DbIlK-&Lc6#9^*IRUse;8wvqH$M3>lqE<2(G6Y6o; z2x&)KNjn}EL3gzO2?<1W_7GLwKCyqDi-!*9BshUu|DN8{Et8*&RpP8`BzOu?#dg_R zN<{yH#wt|h)%<%O085WYpS>?0qkwIr_+H*YKi;UG}1E=^n-un#WOu7`LlNS zax;KaFRYdrcD!;<{|e<&Kd~4V95t@iGKt_^L}j^_l;{;u+H0MQkn=Lm$0>wz7^oV4 z0hmayZWZZ5ScpswGn|FBh>H*@r9a(Bu?U*6;v%z`K*A!@$x)}^T?$s?FsZYi(1Etg zY&j6An1`qiGzd)M<$|n#UIj-mWr>#d)d-@#s+@5K`X4EfCDXM%vBYX6L99cFdTL~9 zH){frY_H=3m-F(5a7pT#GQw^E(>~h0oawBuK_*Qcqowg$I0Y~>x}`R{(;-l#;n=aN z4%b0Rw3d5=4)*%|Od!h!s0~o!+*T&95m4}^kcn=r|9bur>kW(wh)Ahj5J33bdgjo> zdZd3(Yrs?=w~G`eJxk2YxBzJlP*T6mt`#Z+oa+46udO51@z?uV8?Xd5enV+QJAovy z=^eZCTbx+-0u|9tLEY#%g4pDOqc-^8luw-((?;8yL6O(>Ty4ev7MOf>wz-<6_+K^SuKw+jwzul;9`Bf& zf0m*UY$w!gJDK@jINkK>;jPnK6(luXEcf9xz2#T1DR_+J<*seteE=hUHst@3wg4pm zOX%m#t^OfYQe`tn+07qDM3!61kN(lX@ovAsJ}`wdF}#?yM6e$#{_PZhsm|t z{3I%Ymyd`nKZPKNUh?`VTC$*IMech-B!{qk7TpzQ^jjUP2}%ZC!$%LSeuqVn;-BK-s)LZW)1t!+1j_|uST{*vwG z*3n#CK0`|T+>CzlbI;PNhi@w27huxc7Ja&z)0f!v(X}=Gt9&BNtEcqJU*|`+T-D;- zH&APL<*NNHkOCZK>X~Z$ExyawH9pk3!1sB7{DxZ3_yI^Mm>QQt_#+|_|BP%8yKOsRPRQrP!z4%x2&|?3a#cSGOcv?ywGMtV zBF(dIr)Mal1%w)*h4b8N{_LlsRD${6*7V(1r@<=0uT=3x`AK}MZEmud0H@|s{l33;ZLh@|wqyga(O zu4mvz01AkS5x5|~321xWoN^(Ud@j!!7>54-4ORqWKiJ&@RN97lQtd9Ip>cpIE$tG& zXS-oZim8|0S>m7=_$37}qd6{xdcst* zG=Xank!)?ft8lNyB+XZpe!dZu!=bJA4blss$dZ5XaPzadKJWXs_3)d(B&+I=bLfOI zf|IWs+S1GzkcvFIyI)1xiWJL~ zI}pixE!Wc$^1k`gTvdu$P<1j{r5$*di*8M&4ePs6s`Vb-%3hCYxj*eBpebObaG0Ty z9BzV=i8=ZEmOCGN#FK15Zwkx@>@oCwPVR|$8@7kPPJF{ z?!bw5lk-P(Q+GnuUfQKkclEC?se!)@4tL`csL4Z{=ik#arh(Qk2X{VRM|a{=lDsQ8Q2(uOVeHPtQ)(Sv?Sl%}N5)JXXdh8!-p&|SN*9tH&- z3#$(v4IW%En3IF{!Ieek7m|G}XzTpGIuP}7NQUQHHF^?IMArv z@H9r$+lP0!Se*8d&mD~_tY-o7XhHvqzW;pQH2Apal+FOAK(p&(v|M3cK&C*bdu2DV z)O{e|EnI8=BB)v|sWIav&q=IYz6>O7mbmrT)CElBK0E(gWjVFr}^*Wpz7Wftm4>J5ba*iBf9(wk7?+oHJ?b11)C`luTFHk3YWcqI2!a13fy z{~fI(g=NPm}u;CeghIf9;#k0vrZJ8lMB=EzyYL3rLD= ze6}XxSxdf%cKcPnaE6@H`8q)Sr7QqRb}2C5LXq8!g|8ZmzRU0Bd+5{egA8ibSbl&c z%E?_m{Sl}-StCW83LN%VE#&S%r^BIS$Puf;JtDu3Z)yG{M?#T|?GA18ko5+f&|mw_ z!M~&*0I3pf>*FzCs=(GgBh3R5A>r=((fPJM=s1kr|M{hq1CNP&P1|U80-V4GOS?M} z?D}Ch`E@QtC*_^_7jufm$$?jyan#b*DPU!`t_J=ewIlgdM50*PF7h}H7N-41X1ct7 z+s%WEkdk!8APvD|DwFkC(_;cWBfr*0pEEu7D(mkSIcCqJOFF7xb^T-dq`9*fVRBF_crSyWlZBp;2r9g^}TV;)@%MmGwwY9>t5{wj2Z!^eM!5gNg zb3eptI3?wKH+VJ$XaFhDnq27pjelzq)r?#3Og#W)cJcMB1|E}ITb1K2K7@)0*K}4i zx&bb2a>6gPHz1sqI zIN6730g#S5+~f|A^3DFDPp=p6M5KV4s}J+pU6^Ft`S(*h>R^n!dunLPgtq$8dr;&# z|J=xU`J~?qMxM2+4sjoX>{Smsg69-DL#XlU0XT6EZr)1$rx{?Ra8RfGkVgT}SURhb z^5OnnTm73``lFbHcId(K-`JNAh_VeikM$q0fw%hqI7U)7Z=)7HnUCu{kJhg~73^cH z-Ri~DFo|aG&NF~it-72>(7#t!L^=UnVb(ln|4+ZoKS3pWA;0aYYJ9-6@aotF1_VIi z?H%U}MhD1G^DmbB)XPBEQPoDVc4NjXd13X6Wkbe)K+D#Jxi3^58L0wkw( zHRE^}Og}T}hTW|-4K@BF)q(ErlHVEq5ec~+gXNVEFi|a9>**#?r3rqRk43;qvy$}@ zqAE~H@ng?ow?oGD*{ld)gf%nQHt=fwpXL?cPgaHc3`~7AO{jYQIYL@i)P0=kPreA# zu3KO{5zUwVN2WYg%3mQe%q+9BYLpgRRr_mfGQVtV&F;3>#N`{LByJxcY1@3i1r_y_ zB{Bw#?;xq+2VGWAZ-0-7gz4fma*gzdydwin4=?YB9}$Vh^r%kZtjX+Qw=ZN}KSxsa z;^8=w8Z3Lm5uTIcvUvH|EkAAia!W{N*sStiqSF_{y7$6-;?5(Rgi=w-T$6XJ`kE3P7arEAyPyJsQyC4dg{9<{PBf=BIJX zAxdW*q;v+giOS3R{5WU2t6+y9Nk3bF8$2cjR)I8>Sk14=>qd!M^SBn0z2-}|F~4X6 zt5#49`mYTs&Z11Ky&fAuu5Xgs1gH8r;i_FpIf9Wxms={QF(8d-aMa+VX=&$Mk>VtI zdV%MJclB^>9GZY7|L12?2|T8vUp{yxg#b)YbX85ZY0A?`5-hDkt(t{W9&%Ss6Fd8F zRLBxQrD=D*;l@~tWqTos*;Es`8$Bn+He31)if+?wG4vSi3pr zgXk{BJQ65g`{@X{gsP8g&cqL6B9`GjZI$p*L^4$?kd`4S3jJ5kBO5RC|6`cQZs+_H zGWs~2jP`n`JUod_*bdh!1M5>E^qn;z{Ufabq0(GE#E#Iv+`KVq4v56Tcbo?HJe>Ue zWS!XGzf;E^(I8+VtTRBV5I~|gg{?~UA|hGaWdXFcf|vRLVjy@KCfDII6~2<^X4p8` zf10B)h4yOy>09oEr$@kvZu^vxi8TR{dS7QWjTtI^^#(Gz;2gO%7V9^0Qa!hQld5+J zNNKVlyK#y#SKZv(=!AYnZft$0Cpa;drtvN!WxI1~PjmEr52IDoMGV#Zybng8OUJ7L zeb9%nN`nx`hk0QcgS&Q0lYo=f!OgXywYQvH~fc%G&mkf6oX-d;M5}W>LQ_Z1{0wc)o0!PJlG)}5FO)afe=VPEqhGt)TVWY94v@yWGLvzgU~9;)haM=S=PDpkFol;HL6%qJNTV#8HH!_1lzJWI+?20tP_0;+u~R6r|?~eC69?(H@)7oM9e=j;ansx3Sjc)8VC-rmA8?+qAJYP4*Rhl z4%OLHTfwA>8a8gmO^@gUx!P5UH}DmrOW@?CIi_))rBNUV{NGV3=@UTmzS6|CI;v?* z>ZhKKHW8RRn%=UN^oV?FsYeaF4IpE&+L|I~x98PeqwSc5JD^M{`ojdf!TV0XB##^B zpJ?k`cVUu?&Q{Wf@4K;bVJ@Y_@994(SFqBa@5LBj*Zdi~LjU8`$PLYn;C@UpJvctP z)!PsBueg6;yvCFVG0Esm4Z#luF6`BOxDS9Sa<5`~6d^UdKo#shV4-%jQ*AMHeo&qC^rQ8{6#{M)$G*pOxqBjJbbyjV=c{X6P z6Za_$fc#mVYW8pTh7i?FIWp55FCfwa#)hk)5A-ig&p%&X&x?q(#xj92TRD}iI)In* z;wum5KV}GoMC#t#o(G@4f>9~vACIFWB*}Z*81^a<$!ObUlVA#a4X315te`h|)Z(_6 zS^N#p$-JuAy2m#$3$?ipv>|#qIfP9W955|=8xq*R{u%p2A3*7?W&3y+)0IoBY_-7j z9!~Ncp- z(W+*An&0bCIF;%%DCyz6H9I|5+hRWNzj3f?TZj4rqo|Cr}|AnWiK_Vw-MVJ>boqd8WHucqTrMo)bFIBp2?fC>C z;nTpw1qw}bL!@-c@jp%Ua7g}$xxD2Hzv~*U{aPQyi- zD{AFkcv&hH6JKGiW?fFLoYsF*J7f89iH z7T`sQB%RK;v!cBiBT6%`E3eNdXP1J~sN-2NNPB?Ng4Y|2s4A_8SdJCtip%PT z#+CVC{zW@E9Hk~N9uRt;ySRj+!$hNC{^k%KO_T_wRPcc(Cm^udzx1k=aOvfy9XTs zmy3#Q-P?b5)zC7^1DFQQE?%voD*gR=r+n)oGY|IPyTgUz04DsgI=tWN zMF0Cp?R9-LaL!>GHFMt=s6Xe_Mr-K5c0qMj*vETf$kt@UlL(b@-8$-mM}nU;2bYhh zp=5tuEh;|Ke>jozEuYQXGdU^ac_`UjIC0fC`;k?p0CA@8ftm#wESK%)JnDdUSC zGdPUa-lZ}qy@b+Bj+binvS)#8Zc8(-o#XOc=kJT^{r;m>&Cc$l4|*z#PQLsQB|#>JP4{M1=!0^lb7%Yf7$>r^ zDL%lKDIj9qEWl6m`18~02_9APHn5ee<^N#7`s*?xeeQ>As+gJIhFwbz_;>i?~swNN@b`v{0%0O-^3U~iGU*#YoE19&SUC3 zTvy%d)Qj&yDbr@W{{tY8l@1N$N2tH8r1KrEx!zm%(j_b?}g?Vhgs2ljIhdB;RRyWv% zN`dGxOC)?k|GfdGD%pvML_rcx+_X&5f3l%TNRh{XXJan}$Rabj9 zn83z(RMb@Y98Bu^jD1Fnp@g==+SPQ8H|Hh&I7xmucP^z1LOHPmG&ae02g=^ z9KVM;W9&jG(XAQgp-Wm9^~@G#hB~hCVvO9(IKjqZ1<(~~8?j1WNJ+ zHQKF3$mE!8t@HT59(|(nuFcDQI%5}CJ|d)L_&K?@#@Q~>9KuAb#sF1Sa2xuUtZ-1p zc|!Crl@++@jn|@*2pwzn{u>c;!dJ?XuM`eY=G*SeszKMoDa^fI-UL-WC==O;=Y(W4 zP*wY}e7cDfxS@yAkx%UqtTAdEB(ocTMc>GmorkWJPa?VsS$kX6svVe=nw9^uZ3tl+ zC#9;*OzCm6{YOhC_q3BecVZ%wTFz>>sP0Ck0c6_BxFf#3eMswD~}sT>}w&gO*J+o4n_ckhtm9k2*=;yW2> zHHbU&x}2>xD&CdXMQvJd;&eBh=*^Vu;HtWH501pz7SY@zac{z)mQ~5$2a%Qgbeo2E zKPUwbc!>M=1Nm8mYpQ2`u!n8gJ1G?ikTMgHePvewXN{wolLh zH?|3^M7Zj z4plArz5Wf_3_nLr_E^4HZ>(K7zaU)NU{%02TUU zY)XC1f_D=12~IxOueglf;W>?EXFI@7K%b$K+htqT`Om?u(-?5FVp0Krkw7MD+whn9 zqUM05Ab$lebh&EUBr~n`3?$i;!cC4$`6kG@MJ0}J``wj(XL> z3hRgd{b|#wAEDICwR(l>&89{%)(CaLn>b# z&8!Zb7=qQHJR+Z`SRfR(O_!>}$$&(#0@t{D3Y4OL>(@kHtF#Ab6bXTZN2Z&zl1xK_fK10+hV% z^G{at7Wc0^AMA$aKZ!|7)>I8@v#RrOiDab>XKWJ*qqd#unJ$3H$JF6>@@Lq&5RqhZ z{+1glzX;XWcsF`QvKM2O^SYXxUgB9YOW&;1x-SI2qyD08WnPuOlYNj;S3r8C;uR?c7xT)^(scAFU7AJXMF5 z4*{a0<=5S`RsI%PHz1{)bNBosO5_?axpztf0}$$3R9BLYxT=}V#(dM%rf2C3U@GpS zGieJDvAF+(uF(H7{{U^FM|A_)7?cY9v!7{_&u!6J+y$f(neTH4=2}f>K&DtO{$tug z-giZ*3VkmS*-zGr-+dshld{@B1SaQo{ABeX z4`Y%}ih1>hk0KJFiH%CQum7ZG&!x^kh9Mox`SgVTZL5ENdlF7UudIgnRR1&0pAepg ziD;F3 zwdxo9Kx$t)qXb+{d$`U(c^M$dS@FM;&z7*il#YE6B$)LzF=#WeS3}rnQOdD5UPF)+ z*Pxuz`8u2oxZp32`){C#%64JOf#($OjjR}lpp?XF`emi_ZA?mH(9x~Z_6{QX*jy$1 zZvVy1=#Y>aM?jj*!YNA*2GIOJ#wUq$ z8uTYn612u%dsX4n{JeYnM76Qcpi~t5I2HZpaEii(g>$jye}PLD_72mDz62BEQbsV9 z?W;ZvMt5cKHC(Aw)u;kMr_I$F1^-^B(p+Y~#aFg%DpH)^K?!p^Qvo@CkBDS1liAwo z^#evJ*nCVU@GRB3i}EX>5&X?U3Z2427XT%IbEKe;0KCiVBLm2haM#1J_z`ruYim_U z;ZyJ{$0uu{nQnlRab5Rc*2aNjK*8>9gXpn9dXxbtyv_gp{O?K)Iu4s;voK85^5O9q z!5Y%~Gk#7$C9}0@ga&+KPiTK-xHt)sQd!bA#h(m|*?EREwo`zV@5(Ew1wq?f6h>^P zL4q!?PpOvXMTmqnH(8Q99hRj!%c6341}Nagi)z*JOdt}VDmYO_cxR*Ja)d#vq}Loz z=mYu63EisOVjx*|VP9)w=VFpShv(MP+j$5@*WA<2_nZW+AFUK$0H?y$;V@1XRA(>5 z$)R0AwP=1(&>Zit)rXT9deiEedEOC%jf`5D(})V953%*uiM$G z^H_-?g84_vxV0)^dppu{HISq-`H5-(PEZbeH~xdE0adT5ApcO+XdSj26!tijji-lJ zzrO!+u;37wG}kp2b-K`o{)MZCR?-K+#Jrq81!VxPH2${M7d8fLYBm45fDtRQlmK8s z7HLMCFe!?fdU$0dL`>3kDaRNh&Ee|*X)DgwytuH#m1clYh$H2mJK?$NV>=vU5=aR; z8PFPIbt^l1ZjHm!q?Bx@aY>!UqGn2&#Sm!ilr6n~Cn$zx1Bz|8XE8W9N*ed(hdp&I z`;Ga*@r%-N6Oa-atJ->V4+qD0vlR63s+vLF3ijpI9j?M)fQ_h!ED9R`VTssW+aK>p z02UYKN^iLnO#A3I{!sx?$y1#iQnT5+^GzG8>9zNO)gbF^(PwM7!o7&9+qJ|<2Y}4J zYB>5si{kz0B+3jxrFsBP%tqC?7e9!q;;2FAAdcH_r^yiNzvVqW~| z=dHudvGgTOYI3(HVcI&ASYF1b+%0vPX~!A#l>|1>Y?}vx$mX))8d_iNKWTmq&y`9^ zRp?n|oii}V@pWvP*jR3gf1?je3Ab$&dK;I#>c`t1k?&v< zs^!S)A>Ivfd3lSs(}CaX-&iv`Qd->mA=YqmW}8qi;B&zGA1Ax>h4L+R@0z;Ua0)$Jyqbe>^I+r+H@U>Q3lCWL>U7NUl!ANwQ;bmDfoD?r${Q zp4@-$aGA+EJNy)k#y(xMvs3$DYx{7C`7{jiwRxEr7J;%~x2m=s;-|w(`Id5HzdC|qN)CkYQG(@+Jl^Z|}$5Kht{<4~V4Kgj&D7&44e=Q>MyJ(KJGC+q2l=ZsO7CZG2-N2-FPE!BeE@?~W3$%8r1kAC0E0`-kKO_0Ij2cBivxm$;5jpooCQj>dEo~b0VRBSc2CraNfTUhOYz^JG z4tX{ZzG+vJp-8dVQp&y9cU-@U_etvScmJVPHNTH3{ z`h(b-U*p@o4d@08P6Dp>Fzll;itAQO9<7ght~`Uk=OpgX15tnWVUoBT=J)TN z-(Rj}kKvL(4uhokc>hlIrsMO^iT}xP|I?+;PvNAAJD$acK8%^s`F}9}!x5uBg}Jx; z*}T4|YUlHwWuf-V8vlW0VdrQ&!T$wBq;+-4=Kz@W+2zc#{UV%Pad2u|&R*)@h!*)W zEM;5j>Y`UXC-m}^6!$?yH>WM<@aEz5)?dH%YxV@cC>C|Aw2jxGM5_dd<@Fxd>K}gu zH~|mWt>Lr)gjiQzPQ^LoIn8fI8s6?-RY}Ga(mROG!KyCSEG?v+MwQvXyMA40Z`NPj zu~EIrd)SEdvRdY@G4_3w7#-$MC-9sYYpLo(XhD&6h|*@INGS-(9v$`*Pw6yepnLG$A} zrVpdlx3RXt;aFrOTDw-L3JGPYlA+BU--lAJ9h++<_5@V2Qg?p45m5a)5vQ~jCWXN> zAzQC#2Opf=zh1q_)s#Zk0i2v!Fnx}m0HpJ@@3HB|>BLXNC&!tdw4QwtGDSucDs}L5 zM3S%9P%LM_QZltkA9JSXipIJel_5WDnN&~C$wzL1pKU8>i{S;~>ga0AA6G|YH$gNV z)<@a(NNK?8pnvwSXbc`@)JU&^&=2RDI`0mpQU`4=DFQ1vfOhznq{Wbbv)NfOa!s6tv#&j-(cEr$HlDf z-`H$5li~m;!F4;fnksE;agrmq&2NhCkdJDz)m)6$!)Zdx%Y|VGl-k*;)?IGM*JUTm z2B>TD^Rg?iT02B>$j_?lQma&I*G5E&zIJ3aOKG#CT$dNyF8*ejy&lo^+2q*#hBx(r zRrOF_BR!#4sZMVUA*oA8$C|pg73>7ms`fTmF*t)&K}`ViF~7g9_)S7T)raYw%^I_# zCml&YI_ZKHIhf9OYq$fF-Yk?-X_h+r$xckfHCuahcK0vTvdCM1MVY`TV9r<6h&+$i z28)~e565b@esd3Z?UA)xz~se2%sTvA;nX7INZG<~L&(pvobYfvlyvQwbJd>!?&v?5 zooh#M+?fxCZG(`KyYh28zP6Rf-F*nP!?lLudoU@I;khkY7`+$Owb;&$SxW9h5;LQ& zGP=KiV`Ox0_xSwd)z3YEl=yUu)wMo|NX6Xl$SR5+?jamOE-YR=49ef&4)=CbCK5s! zfHP^{m$&)#HN)0pAR(W%(Te-y`AH>QUi)&N1k=j@@F3c!`j>20eqqyp|yW?1XFxtlU12Nhyu)t~=`X!;*2;+T{!ho{440aP8AQ0LYEQcguG0V*lCp zc0$NYaO%+i_Q$_qOXz=gn!18`1s0Nx+@d%LRQvra!?kUi6bD3_*ow(Izt%~+E_7{=&0B+@<(Lol^KEm{{uIubNwZg^Bbm z@t2pm)1ykNUnh{cI*It31Ty~!w=07EHc(22N^AHoZ?fr93p^)JD}46@l-5$`xR~D6 zHrF4K5%+AJD%VVhhyBNv;;HJV4)-j@wEwnRe*_r!K?{KW2`X}SWWHHhn_!RfoG>pN zU)Wf5G)}eGxlZpHbgEQNqC5th1pY!xITlK%GDu%gCdVO^-4=;IK5shhtCoOIfMS=k za?|{jTf$H51913M&38{iq$aPbBP~t_6~!yhoKASo~cIIVw+ zfw(!5Ey4(rHqiR~(*sF=^OP{o2%OYOR=0L0D8jSO`V0Di=Tzb?9JA>Ja98*)RjDp# zasS4l-;{;=+(*6~SCQYD?(aVv_=}eu) zN{@oy^VIo}SCcPTWXZsMAE0h{)cJ?1oNZ{T58@1k9>f+v>*=hlDk}d#hlQFJ}sr_2;%k zdCtc-{~enHkb=)dXUd&0s@)xEGT%0;jos-vbtS#TT|Hj1y7m>^4M&tR*$z#*2a_o4 zfFRZDUIfw2bhq2z7bsgB%2(w6K7btmMq}t17lgJM@Pj?$oaxpRJcQ8*HvW>`!DCWb zn>MHmFgemew~KrqM8s3=5WdHNBzCDX8P-WXjuFmg=94Eqs^W%$wyXTDJ8S#)Q^>AL zTelP5(+G8r?onIwUZ~OO8I=6dfwWPY0+>kt&78i+H_!J>Rdn|*3zD2Mzr7Ag4dYrC^WK2dZViv61sEdV#3hqTq&Z$4>X|aK*1-HWhFt7mXuBTX z2^2}Q6TS;3&uiw&IQU+Eu9J~VgLxlR2d`ZJXDke!m7z;5rS3zZi61qeG{qpioA)e3rH+X`p@}I*gbLV+g75xH{2-djfw&nIq zlq5OKLy%tq>2#LzU^X>2gQrDcWnX@+#ZV-`v^6RaJ;-qhrOJPcmd{0X(Z_e5Mch^^ zn-k>s2x+hVa&1}lhrA%j9iwgL^dlm|sDn(Zu^o2L0>jUz%|Q>xNb39(?bPW0XQkBc z@i-EbWZqCVv7^9bey3}A1$Z<<8tmZ9#Qhk!YL4@cW%AhkDn%@2YVL78w)ad$J-){S zqvbz(Lh$V9_(Yr9oCwSQnScH>`h(|W#tkA=sbP0soED5;OiBfp#tnwNH&c}+pEgw8ffdHl7t`z}a2naZ>C+D|b zl;7(>Zt6q6CF-U^ah92%K28aG6gGS|XThhRI6hB%ZX?usbLgKqS*PE|-U=x;@$|{&HaJy%?%h2$ z6=SHrC%6m%O%J{oPJj~*IjWxHK1}3x=#kb#wp&u~$4a#RwE2)e047^kPPk*Brn3+B z-;GU8&AOYbIi)^?P5A3ww=^LI4`U)i{d1jV@F;?S_wH%CDS_y}-LV;^AU}rG$Gq}S zXHg{bcD&@D1SF%K(O#aM>g7|Y2w<<7A3Xx@GC1WxKMLbBnCfQY*6=Kp>|V`|xv=E) zJXUsV@?TT){b0tFg&U{a`K2$Q6BiF1MR@=gGVii-$bJ#(%1Q&TG3X_Xd@NhGf+pcP zVyHDb34aBVYGK1BT>><+*3P?E^GmIDmCw&>piqAG7iUr-JSP-A!u;Q}I`qUfOz_3^Ybw(*>9$^Pr$AgKF6l{4>=Fv zQ*5Gjmt|)z`wSNm@DZv0`*TDBU)oM8my$0~3xR`Q_MeP1jL}`b>Iu4Wt#W_ehfxdR z&0O;hN^T5vroG?h19q{_r%8PuWY1Lz>jy~eY?T&*7$?9k^UkPjCa%N& z(?Y(+=xn*K=5U;^)|Lm3hJ6H>Y;rQKb;%r_J zo@V36`XzE+PUUqwWpnd94%=CjZAR~MsWUzvUpc9REca6~z|?Tn>vwf>z=@cyUevam zmbsH~iDF%yCu{FSwZfCJ5~!0MQX;27$;<>hXtS-Jic-y6UQhF!@>@~|(=F=Z<(Cgq zJ3u9~^2+sVs2%yt@o#jFyhoF6XQG`ACb{ikDHZ)3Olp7bM%r8TcrjAS4*pF$+vnUM z=`4NsJV-)H_o>0{e6VYNb559|Xyk2IgVap(LMZ)1CZ-p`Nx-Z_?kj+c^FAwCp-cMT zIs7%9^3tAht$k}JOEHP^3N29{mLno^9>=wMud=Mf$pYtw8WvYU>8m2?W9AOz9nfw6Emu)8sY{ zC%@a71IxxTi;>!$<;%OX|8=bm!8K6t&i6u}9^FRLd*Po}sY~^u__g~5Z|uLFncE(n z0+S|0YpHeQ=W7Gs%~;8s-&g*mw*YA(T<2*Ofu-WqN&UBha=u~7z*Q^g6#1|!F_j{3 zswobcpicz0lWnE?u6#KEh}9d~1eA1G@0qfc-^>{IV5P(L!&auJOkX0VLIHYdvd!phRN- zUh*YW*SHP;x&+p_m-Cv6q|C^Hm|j68XTx+%$^#t9s_VPN^D08}oX+R%*MLr_Wj}r$ zl%D1s^M+^jMA*x;mp7p_{2jyHw(mozWZo&~6MJ^G4GVAg?`>FE3w{R`vAM~MafuFr zNg7#gwU+n#kjmCq-o=!l_mOE7e|Y6p=}sT`r7Nte({1+P_nIj8D{}tU-dDSih3I$d)9Mnz1zUV({GYT2| zvS${YVZZ8wX~#`+K&>yoPB20>G<^f4gsxPID$uw2wNBtRA=4<<9N`DxoM zHj~v4`NB9WFF)psHO-}ob>iL@Kw0{#85|y{SZ8W#egvo}%Ez{Ci#rmQn07NmYv)IW z@c!snTg5*b5$U(9``XgwF*voO^`9?NZpimolz?eHS;{;PR<%}4E0N>#JilKjaf0XM zej+#eoQO#HgDSMDFVQFAbliW;+wx?OetVpK<3Cl&vH4!-tk=2|s z0BPw9^Xo-^NDZvJJn0Rv2!8%2v<8o<*6lo__=cX@zrSO&&fhp2PJOAv*Q-vSgOLzd zZj_cG1Xa72i`-Jnos2DOblbcjBfLBlXvUy4YsH?-65miD*~#iT#Ll07}wmWEbB zU9#&4iOSci{sRhuZhSSYFiPR8QD`9FQ>p48@U{7|ylqNA>p+>RWwopjtVbmL0rtIS zFBn24fdea64pAH6^g+9fYu7*u=@*plYduE(yu#YyEF1IVC1+3-JVt!R+uw8YzCHwN zdU^G$Pn-HTOk!$vVgx~&tcbuEkc2I%HIAA{Y(*u$TDhz7XImeHI#ms8B0=bY{5lDw z)!H4%00Ab%Wqdr_Ub<947oAv@EV+U^A zB>|~Cj#y%J$n#v?`+ajh*}kU^AG-xe3_F~@VP9zVrMDu}LUgmCJoxyiP;+`q%(p{b-`OA3sA?`**4p+?k@*Xf^)Co5qpL_ck2FkVl zK9HcaRtCmgPjG+U7~i|MoqzuTm@2|V>x&2BRFN8AAIi&mtDi0Y1tkHLHq&3W1<%Q8 z>)d|20&|}q65?ge9sRK$Q@DirINX(G?Gt(uOoW#$r6lCX8#w+~NA)z=)yuX!n~4D< z30GgfoMzDf+E&@0rygJgw!@OWYO){dQqnfQz5uK6gKKFA9tE>x%{t0K|Ju^2a>RNG zPNbJveXb!rxJAhVO%!jgC)R^Q%FitrLHMPn1`)Ea@SQs~_T$PD;5RO&lMgYE!Q`k@YH`EMb`mD!Sv}3Y9hh>|yL-ojC1X+hIk$wq9-dBw7 ztQo{t2yxF%*2=`!K;j;Dtt%a%$IFIiN(IQvXErzX?|@{)EidCEWz_y2m9$b3n=9fE zn4J39ZYQ^q#W-9mN5Q~h{52;$YN484id?=+)HFX}B61xBuLAsWZb`Z!9ZL}5_F6w_> zSp{}6D3x35Y`aT5SK&1Wp-X|}_69l(&xhbP{8W8j4yOiBjN66Elz@mhHd}wJvwT-! z((JZOxwq2=OmqUA)Q=kg1UisFnwdzmrWGJ0p-%6k6XaLj^=vY`9+4sKtN40ui!t|;|>2UwA| zBPOST6vEgggO9{!ub6EMJ34d@C~&5mpoUAxYJMi zUWVj?%173(09|7$AJ~InSJ@_1$5LeJ0{uI-p3w%t)IDvu8&6)(E2SF_t)dY0!IWaD zebfl`CNgrEasFy4$cOrnEF?^4viCMFGIy+@$lnRBKC^8Ed$<2)i0;8&tZBZ7lcVxL zqYwZQ?(hUvr0yX9044v!lg-`oLr9h_-8b{`M}c~rCAGKkV=(bcx-@>$V}~;;nNRb2 zb9*(Aeg=wd!ylYA`Fa1vW)8Tt066lhGwE{p?Uy)ZxaeQd0z5`6W22gkD8I%i#wDd^ zf8#m1VcXo%W**<7q@O+EudCUA2g>|-JN5PZeA;#={@}SXADyHf`|4ooj$pKi@xjz@H*IOdk)rU#&iW%22!(*gSTxkuKRei9;S zSUqQ+Vaz-k6R{KA@cciN>H8F1YWtN}$?vIPbVq8VV;#$YP?pTo@JS6fvzi7kLZnh0 z+E+3^9hN@_ikDh>1{Af0vyKxyGgCXW|7Nr6BIyHg(&OTmg)^FPvb5+=`JF8GEX?_R zW`8UMP*S>Mk0{Oy)X}%oJ!9TK2G;G_PCy+_p@Jy*vldw$IDKJ!o z{>N>jyGURfPReIS`6YOLwrAKc+pgiA7=qEWt@$(R0hIbTFuY6V$_-^NP81vj1#n|t zFBc}&^(LsBe0As2y!C5J0+uk^tx(fC826qCH!9a6^xvR&!8onFu>SYcjx(AWcNqG^~y(p0#{F}2vY=`dole-cPMn|V5yYW>ttq14qft+<{J$9cb& z`(s6Y1{Z0%e~;n-MnFrL{|VrEgl02dt4jMlchYTMd@sPMhRI!<{2j;#j*+EAcurQt z*qvGRQvZ<&3J>{a1%DZtRIDzCvsb{@{TS#e6_CMh`2ba-e{W>|w^WJ1!EU$S>tO2K zxum2gVOYIkC!$#=TBfI zlCh=qpidD=q)!9DtPduGrST z&WGE}GVzUPf?85lo%JB!x${gN`3^{oONaNgJbN5a-Nn+YER(A}{3noFjTneln%IXiO6wSf|!4#G=t-Tw8$+ zIv?ee^My2RpVIPA0TsgHT3tTXv&jB;f0P3tLDkWt)!!}3tCQt`e)>o1ak; z0;jh7M*hwRyFJGDu>Aai^{4DV7xdp+Tc<97$rH2K4dtSG5k>-QL7lz;L{`qTs8ew- z$>&YAWEHymV^&L%tx9!98m7dQjE061}#KtW300+EoL z5Y^|>3)@QE&9IE@8bA1Jz1c00giMvY=B@d(xf#$QI2s`2;o#qu0(d)+b}>1+i-s;z z)&eB))?!4#J3*l>S-Om!z;lwf#%Q=z%d0o;#uD+LTLHSqql7Fe?S~cs2}!!Iu3q{+ zFx}J@ZOpzO?y77Z)6hwW##%}q^}d#q;|AC2SmfP6!H$gaC5;iPQblvhg-%TswrW>z)({?o9`HBDPB zd?r7qf7Itb3wMd;ep7}0JVu~@U?Qgt;NrK~ZJbVvdI4P(ZL;qFInci|K51RF{OW6r zdl9W%c9sGDCC@3xrK3CN_ea5f8JQGVwb@yscm4ZXLm*$3)<3`6|2k9WbG`;9 z%<^jNE=_wKsi@bLeZiwLa5hTKmEH^@ow^YI5R`_jieyv%+o%NR5;Ib6n^)dJCW-S; zn4rk)yO>D6tQMo=rG~wSOS1W@GcJG&s}1U3Tjj65>Vv$d9X02H55bb5F_VG-BqGN$ zHd%b!{k*eQIX=m!QopJE$3N}iL@CRk1*&ar$HV8KMr%Ib-ADBWBK4XNjL^P>6It!U zDNE&7`DCQ`B>%eqqzaU#04Iy1TU4fRLGtTvb!%GrcPQBzo+uxl?*X!}3zk>V7NEWz zJ)^HKI|ELd>d?v7Ngj6pLW%4gb$m|gBZv1?b@p@RSbYRaGC1lFR~0)FOhyK|b5-wt z6h<7(Rus#w;cR+SvZdYlZ>`Gr)|+YHm?wDlk;(40?a;BY6B)U#gv^1(5QI= zD&m|nZKXHB373m*#)`OfjKWNFAp>y4f5_S{oo37u{Bt5bnQdu44K*A<loSjS52O#lZ)~3~G!0Gge_N7DrJqqfXKZVd-55Q^|(tl2VaeuOSTw8DidoFRhg%2+*}7Fea5pamaIo5&?~IUurhez9CgdxK^7k{ zNzDds-n{6j5Gbi-QPCNV0I50c)VHx7wo|dTg30OZoD+VnJ|Mbo&oWne^H2yTkOKVu zE!EFX0`jU;*KJApj{G>>wlz%yWZjL-vrtkyYAab8T6bay=K8bFp-gyI1xFaG_j*hs z*Hufu5fqAA_9x!E2}&sZvA5T84L4&_W;yP>W=OZ-x}5MlLEPGZrkHq)Q6(_4VF{Wf zZwFFj^e*+{jvjArekXVKxK0G7O2A3Q>T*Sq@w+kdvSWt<`5w>7z^*!4_1-{6p5|71 zA1E#*XoBMB`{8cwFgx>qr&_e@vLDEsa=woBfhqwfr%i`%ZeI`K#JlXuHB<@DNtK0d z+hwQ|eF)An62d+>DYN=amjF|~bg{Yxpqkg?NP?MvqU82uKA3-TV!k}bo&qDM>Wi#H zz>%|#X-18CChtpfGmSsn!^`UEr007$Fe|40pfaD5k{3LtT^JONr8;b(9l$Djmo8Ly z@*xjhc=r9qy0jD5r!>nFOr~D>P3U~{9;Sf-Qz4zw+|35nHZDf*V zN6FlRZQvcOTsZ!P{@^*`*6DV&*iL`IrAeDf(Qzf`eN>XOt{oQqK`{MSFQ&u!u>ZvF zCH<@l{Shiz+F-IIxgR6c1bRT*HSkIQJC&&F^QVZ!v2;)AC!fKx#{-b$KL;YRp;lU~ z444Y899!w>U-n;bV4kExz{$i)zDZ_u)+kWj^pfYJ+%6np)vEqCeodpeikn!SPd7R~ z(zY6Y>lZOOh+(o!XWxOz*ba6vqW>O|?qZvWe}MWX<6e?7LH>wKZ>p9Fr8CkT_IK?= zT69&m!=dDVIsJli0avT|`_j0M1f)R$wOQa%U?QQhbbI8E#`Sfuwy?K4cnmhF*LAd)7bHpe&t6Uj8wan-jj11I`LO)`z5V&u8G=$-62 zS>gJp`kVqwecLWULpc>p>N|HWxjzk;bPB%A^@|YcDaz}S8dG}d=}0M!yU7{-C%a-Q zJrf}sU4ct}*(g9cak|OqbY{ZmU=n7{P&uyFe0XubVslbaXd9r?Y!7yqGex%k^vi+1%7eBm=g!69Y6%I*@+~o z{H2J5w`7tSrF1DK;bm1;ce^}amG4Pin8r+jNXo8uG~V9fT^ji+oMLL{B&_zV2OQT8 z4R};aQXjMIS~&IiP3PgQgA!RCsWnr*!1{bZzI%taYT`pZo*CY($Tq;qg46G7IpCU} z7&TaX<649$G=Ul`HbTm4S$C!3b)cmEf+xWB9;;&QmikSeg-X4u_DZZH2q~iy_sfK1 zsP4AdKe*b@2mi=U;kU?PaPZ0wX2A|4(x}t0_(f%IM|g$Fu{i2y5xs zNFFWi`Q5zpds3XIBmC&P}h4ydH zqHu&>Qv3fO^Bln&CaV54N3zGU>7CXz)#^#O>o&^8@+q+Tn8}(rJ>9>{cdoPzIH{Pe zBM{gv@^;PlX&V5+4c8@6lnqF@PEl*Cd@lqx3CYg^Fd;3wazpu5zKBS&%$e?^Y`~Fo zb;LC=zudp^)@^UyN$cqGz-Z}O2VoNVg#_Q}!?NDs%Xj;*7Eb?r z53|s@*KwiEV)Q;zDlT=Z;6bp|+t=dr*+b_U>dGraId4H+iPacS0`Z1}lBe}Me zEB+rH_7yVa$cM4ifv*usSazp;11H_v%kSpf9yX_e?*i9UosqKdK}C4h&#kWi;8_O7 zodZRM0E9aKM6=Ub)OaB2zQxp2fgTQ4&C7v7M?fjwg=y)Lm?X+ZLUr>fIEA@obgM;? zD&V7W)#+|Gb{^wd+-LpjFE&ycfRysp<2Q`EkG1VQKMtFGwe51pgNY&L-4kG;HOtwF zo~2INT*fMTQhu@Dh8@DQKv+jxUvo-cylS#pEl!1!4a3F!Z%N@ajDi~)q961>md&iv ze>z5tTjw9Kg5f#&YqQ>esw#aZPAbY;Ljq^_->>Qp)j0)5rFI0VFBc&QZkd^T z8=WqO1>6+dzoi%C=juvZ&v~fQN#X4gJ}=6;y$| z+y;#{rd)&Q2AX$s==m&PxJxR-4F3Vn8Xp8i?eWusbh&{*!lMM^8$mF=W( zFX|^F#G!wz`mXC&Q1|(z>TfNH-0xYExKLU>p(=n~?Xcx_y!nhjh+B|UJAUjTL=w7n zkH+Z3vT!}zzt-Ft=nRMmY;t~|H0}#_QyiP94&pJGyw=ep9{1Qve1{T$vj6S|E)Dbr zI1;E?NKLVx#w10Pqr^mOK*$9>pe;o_8>mSS&Z^GOgB5x^%xgc8%27>JJLz1rUce{k znS@mV9l#~#t0trUy@*K(?x;M!1SX3dk+tuaVUk_+OM22Pp2cc)THX%=T^{CGLUdfO zVp3wm6AqLtE97hWV$ZHR&+v6XP`^4$P;Yo%C;_LOQyvfrZvKh7hKTZjNlF~Oq+H+b z->`1!zI#doMtZD#3gF!U3JW#hJs?@Pt<-W(CGY*7n{>77baPt#04GUPbxQAtp2fF* z)X6f{oIZk+of$QrWZ5J7AU1EEf7H2(isBPo5^hJ^Xx*6jDMr(^3%!#48I){rZ&BAj z?{RIYqCUV$s=l7Fu!Qj?j&vw-9QCVye}za|>_Uwd^=p*OANsGA-){hgSohx?a*F)7 z`K`_bVSLDMs?NH)D)4(y>ITa>mBJ9zt=RksB`H@};s5nZ+6tyYcUn0(UAY1Lql?LRTquhoj<@`4Q1 zWXggD9En}tRd*{IxIZvB{S)In{u47keTze}wJ;L`)8esigMX9U`!+cp`U36hUq z>>1kREp!Y-lD3Qoco{Ix!RS;rn&U3^nE3S?%>YR}=OV?&Nak{SN(NYUCu?WYb3Q`) zxY?&;y&!n`_{cyr$6pAGad~&IrWh~6q)Ql?qS##wY9vdmzFd-zb1oKqY5(e`aSK#S z^RvuuYS+FkhgBAM@G6=GBp^%ilnT!&M5~ZYTvgDkajNuAt{oJM0IT>?v=&JHue&0e z*ZMkCYSx-@JG|)@2&uMN&UP2dMIbr+u2wHLfWo#sq{yxTBxJ5uBCpMRlDPBtw7`vd zZ={8B9gt{;cGbZun(Otbq`T(!#viS36Hahv)zup#KmGn#=Kj=(J{YxVS6iRhib|zf zW3aS{(SPQS!oO5g)zS%^46WqHRT-KD#WGO?>kiN4YI&o445stTSdAOA`G`K*_JHpM zlUxTIm1;%IyK#xTwuM^C$mh*B`o{kKS`CXo-c2~^xV)|*P!>0XDbq7AWl(_Bo+Zj(Y{aZ2W>y^~@+dOu{y0=0wN#lRPMk2U?%)-WSS(Uu5I0-_&GlUqD^8 zLQUvHsT;-0Z{u+cnNH=3m?xnw8xNX|IpUDY&~t4L&}P3+_Z&0hxFZ0R&NDa?VGsD* zvSdBm!R}tV=fMcj;8jzL{fLrv^Z$MUP{XFm4s^h?N}`j?Wlb*zle9{twY>zV+~OdQ zdby{}DWe{~f{NC7)#XE_Z^Wp25Uq-w^~aP3kEuH?i9904lz4XdWW$%m1_8C?=`G`8svFD?i%95y@pqubOR1`UtFC?%rcuIns0DU*7yNj)Gek zQ5w|I0VdF*ItGXUM9t?yb2}DQshemPg5#hR{SCBsb?*3lo(*p&07*M-t#x-N_Kbbk zcA?T9F#pTZ$7>2)m*T0}Z2Yo*vY%3$Yl-WWp!p{z>o}ZKq4ZVFf9*6dG0kkAf4u7P zB8;T3<SsoZJ_hjk=CaGK9*3Fi};=C6vqcax@z6j36R=3qySL+XQ_KndDP~tXm`;^4>iE+=#8p6bn?>wrU~prP^CV zwZNvHZakf4(SO!XX{fCyJMzNXoT@wxrI>cKgX(AD1bTV($_|ICT2=NBKYch| z=OFBblip@3xv~FwS;IHMBxO>}sl@YUyWsvCGmkoSCnjkcC{K;Mz?6778n$HJoo~90Q>8!L z(}%+GuZ_F+Vmdjuli{Mx--nHym(~IXBqj-K73G2clT8+^N85RkmND|lUR%<28V^B{ zyhVOlc^FRhHnA;}!=rhjj;Lwf+dh~uayjv1K(cm44Gxck$@@$>bt|$b^EM;223L@;prJdunZczvr$U&Fq+e zyyn+0^kEEc-s(y-?pV|gB+Z~U0lb*U!IhK^k21wG&DirYK&HG1%01^5NEX-Gd{$O~ zgP=6Hj4r0rSK-84=hZZ^zlMrV!r7C%P-kc}Sz#Vd(SRe3&1_jVvy{5@X8%&1 z67ffe9qM1&KF;YqMesJVCTu@rq3|f->snF08-9&!z89X@Ri^iW6wBO>+81aQ1EZAf z)hH!ad;Ktk#9dh$40QsLdU5q|_1ho!FL1OjL4JZDC7n`f(VzA|cL%3@hA0ipr1Eo* z>7JTB&3-3p1TJEmoU;~QqwJTc)TO00&VB_7->6fueGMfGtIF@2q`tuj_41!itDr^n zLF|}+juHWOD%P_GG``a&Ycl&iK6QL@Zfd7G_(T8Qva(?O2qv=f+b=Kk!~V;HGz^QB z<-=i#(+8HP%@I&C(>xz)js8efqFCa3HN;Vf9Fnqx-NV>fr^HlCKRO>b(|WsEh>C$y zug|*v9J+;PX{qgh%~PDUA|EKK|A(ymkMVTc_e3uuBI1gOaYbBljAJ)r_Yn~hBoQW803ZuB!f3s%omM`q#C^IJWB;*RhQlV_e5JJr1tzIJWH=V{B1~h)5F= z5fKp)5fKp)5s~})toKuoJ()`V@x0&P=ULBMpY`kWeAZ`umfcv{#(r#12}S9sW62(e zS`s>S=b!7#=y+TtyrRryCxEHq-OZ43BJ8!Bs)3y3IwDx*7_6#+lQD|ywbf2f32GkX z6bmRXb3%`A{+bp~>+i3_9Zv7>Fb8#W>oQzA05iuzH@uvQjNnFQcJ5O*XCbt3W_QhO zdH<{KP+y~GBl70*bk9U~PM)AWsLOMK3@;Uf#c12Q=y}+5(Zy%VK-z)@SqDMqn6M1DLKnoH^+hVV_0?R#N0 z7~wDb_{Ik)8ZhAxmo~f3bqcksDS$OvtncsNy1k;}Z-n!Ln$AmA+k{E&ZfUzVKnXhS zn3CZ-9pO)G>uPZ`UM5y*w(WcGN?3WAoy-hZ0n(e|Hc?9M)u2Yc=T8FoUV}K=YiK#HJv-*uY9F+lEOkSUuWh5Zr-~rd9Zo#1zy? z$22f5q!tAOr?Bl?U^b7_Me0xk&3>+bz!652iE<#A$8}?L?NV8CH`$$Mcl8Gj??t3* zcb_g)3{>R2reu3PDF3VWwkY^D7T$nK)n2xx`)q(9NJ>!P@RU zZFN`pTI19`)C@o5#j_LLIpnvZ6w=OUT88Vq!zC;K^GsXkI=i25xz*1ZHL?4n3Qf=>D%}8PmONX1${Pn>Rx2`^50Zm?}JrXMWLq< z8CmW}82m3Q{lcZfGj7S(gZ+a#6kX~ecxeQn=Oh6A0c4uV>hiYj=Ddfo3V+65^SFM* zwLHqp)>2#_15?@xfo6|1`88~#W zvS`ezM*k9&n%Fu+&6mfQ^SeC$%Zr#X^61J0mju!{d@?Xyc=QS56x zeiN1A)H1=$bu~#G%tJeByBre+BzMdXs^%RaRnuZ8M)7zTsc2_jOTlnSr25YM%$EAH zc^{!T%g#9C46Ys@K&s2eWx9py2yM0BfZib-1;c zt!lgHo3{H6E_ttDtTYUGsU-=uLB~KO>kN)m3$U8$S^CZo{j(NsJo_VD@*S@U_K*h} z7@aH6fI|U^P<`8%*kPcT@*v2%*5Scg!q`H^|2rbLa|muay^?^thOQ^^I0tY&kY{ZeHl@m1pB5%Nti8ItR#$ zS4>-^v7g3FaV}D3DQ%Ud?gaTP_A7F`9gRb_^g$bAXOB=#tzQpVu{3=b@<<0euaS0=1^l>TDgZMim2} zcdmz0rw8wgL1QC^tn1UalOe-Ztz8*&`}$UURgxN>;A_#g-CvD}4U^P(wBs^*yk`(922jtHHP^<0fw1sQ@at$)at$4O1n2yr+>7gZ}y{-u)P}1dHs5f7jv>G zE7c8%1;U5eUt|PH+Wk|fOzcmrt zZigd~irFLkcjVdi_3WLlWg>@+-<3NBfu0+0lDHd@wpOPV2(F~D+=EL_Xv2zeFRW0j zE%ZtIz9gajw=W)A0V0`eVGre+_(q)&QIR3{$!G?mA&$-=3po1GXZPv$4N zzd}3$Is%+QwkEBnz_!)br}1gjmu}amnvW$)#^y>*e>T@EHf^F9xK87~@XzT6kgSx` zV$Jq1fRW{(5Ja>CSZx@%DJU-mm`&y6qI^c~eyCUhm z0i_CURGl!Ys-!n@^17v(|G`}EE4#znuG3Ox^h`It(?2}x=pAt-<@sG)nzd=U*+Spz z?;34`M2&;*SF4r$EN9iD@x|CW{i11&RTfG-<&#ZPldp9a7O3ACdm|u9MkKrj5nlRtNe4 z7XfZzlB^GzA2DeoXD+8C{Qc7Jv(7%L)we@25#a8b8lVn?z2UNoadmkA+lsdB=mnok|(5G-ovzcEB6a9(`Aa<4O5{$!BwZW^Qt`sk{2ubB5 z{|7FYcqRUywkutWi}q39eme3(=QKIyhg29x_v@5k9FaD{LP>kb@7X_5)5*5{-r|Rr z?f?=1wSk+T5>3Gh>=-&yn+D|l=NI`Hoz0CJ@E+ZQ$^hp*qRB8cfZbSAOR!cld?oBg zN^HBWkGv&-bomWtvi(6kC~I}-dMMREVbNx8$gg(L)SPr<|7+s%-qd4JB>odkA-J>~ z=e^Jr;MB@c9gR{x=(nQMinel@joN=3u4~$io#iuhJ4Tt9i<@oYj-*pTXllN#dF0OA zp^yDdJ#bfG%~93x?*_XRpRXl!sskp~BWgwU`+Iw0MSa9jA9{k0T`sEkBeeaC{(?~< zzZplKjQRS({^pUn<{0`ABDK&4o&!A`uW;=TgQ*mC<|Asdw8ck~1_Qz9JaYd$Ec1{;@X_?M4yh<=M>)-Mea#t>T^KfcnXq{Rh={B(_qqEUAyk|i)V6!@vv?A zdlpQ;uTi$_In{Zd!x9(sbsgyWA88MWwEK1&n@6eZD&hq{c>9i5e!KWPS_Bj^tgrJ= zUjkFxHh@eEV&{RE`&(@ErcQvG_Wp|H@|x?kKK5a)@AcferMz~?=M7MW{MpZ_5&fOD zNI{i=lf5n^?9zFuZzqYB+)iu5>N}toS-ryAOAGP!E=u39?4#W80TI^iaI~Kmulf!S;qC)PhCc4 zYsz5vS$?@>qlFBYNwMjA6bVGvLVlCAzAy9eTFOXmul@>*z$fOMGvB7*uW`x7?shou zH}FzpoEtB5j#~K^nOCjdxN+4GRU#?14~?bWmEYs?`tij_ca*yM1BUQcyMrzPbmM4w zSv+0tQMDd<$b(BS^rj^F(nO9# zBs06};9a*Ig;DtCdQzT%RZU0tk8#%?Gi4ov$e1L0`Bru*{t~EUWkXflaY@ElLSra* zRrB`oxV&s`LV$Sf;slJ!+*0G>iTx987n`qtdPaU11cQ!|r)w>mpekFZV91T<5mB7l zKVD9mHV%9IG+gB2>nfn|^dALW(}xJbf0RM2nA3?<>pt^8V&a z1$r?)o}HUDWw}2G=p4TCouSf{+oXK1Uotk(cPkiV8-&ioMuL25?FUet^HIs|#uhUD z0@$FiKHI}Cgd*QlufC9`(Zg-EU~(}iX)p zHBhIsl-arVE19;}VTs0w(*@pLkI>h4jZrIH%BU!F1g$k}f|Iq~b?*02epdB-Excd^ z?)uyBEPH4On=#3tkHV(!ut+2k&E4!kxd(ge9YLuECxiLU$BS$mOp2T_9;Hk4Hxrthr{E+gC}qXh zRwMsP)c4B#k5T2r7^vtkNnd%dJF>0;t z7T@nWBTkvM$Mqkr{(59Gz=q8GohWWVrFQFF=NqAukNn>Wj_ChD=dFNZDq*R0-sJa) z#L|Xtd^7Bg3pJJA(x-Hp{N9>h2Ik4)wp_PJUAMbVIm*skqr)ATNQp$@C0K`y%>|6ZrhvCT883Q#Q(KJvbb5Zra$6U)-DOTl9 z`8e3MXGdij>~#Ala1lbSUd=BELcuSh!Asn}-Y&u*UdiZaCv#Depno zNvn?D^2FN+1um!RZXNj@OlLb{?9JCEA>W>_&UgC+Mt6@^1APzCHMGvWQMv|_jJH_< zrC^eFUd@4OO_QkHKWn?(Uk?KI!i_Rcn8r!jhiZ^YX8$7y;MK z)(6Aq{hbGIsb!)sf;CfTf|!ZFgqK=FeRa2Gim#HwXj{Vj8c1GNjVr}Bpt}6)I?D9h z{--t7MZe2q?6!*ZeSnT;So{IVP;S|rg1mi8Ic@!zTQ;>26NmhEsgd#QZ{c_k#VFL` zfqBElVSrrJ0fF^>dpMW|xG>#0d>ny_knF82_xvOKd$c5B=4I-rq*9x(%Cqihu*+7h zjF(@S5*~x~UR%G_=*d9Jv5twj#Wp)7zw=4_JIVu)*ELPfpm7=|U3vp!g_0@h>9`bq%(ACsm-RO( zxNp6h63)bFas0(=PCpAuy&FU9E^Y^;FGqG&z2J$nd$_B%+`zDAyAU%$Xy(rgu;i@<M zYx27xr0fvnaxEey8QNFV`54?wg>zc7F^=~)8G=>KBe-DF`r0+XYQ< zE!@^rf5%GEZm0*j!{ocVzT7mcSxl;avZ{U#B6V3IcYijqk20_Gtte*x6XFnDs%=5`mMk#RGgu6!}?Deb98Y*yn(>`LZUl zKjdDS+*qOWUg&?Goq2`*=S4W9pie=e511Zu$M)&n+~gJeWmt3BHK2H}y7s04Esk2y zKRUKh3-eS1OftX8mJ%6#BhPNDNRn^5*1lKHi1|!0fYLBym#^{R?cBY8pM1XKI_X5$HYj zkv2P@qX9lfMS`o^KG;v-ymz;7&g%11MDo7QvY^JGnm)r-SN@x7IG+RFp}KryPz?I} zSN7*geVJPr##)$}uL9Tdi>hpY4a$OHZmel;-vq0~8h2<1aEe7^`rEgh@An-hnY?0R zt_&LABO*Xw&LteG0xI${zgZM*k%@mq%D6KRJaouIOD(>+93Kj%pj~`WSvw3D=@_qN z<#0F#BsDv^eQO_e^N2pJv1&#~=D99#8+`$mVGq$`t2Z5uNH1Y1tCl`rgWfS%t?$qN z?9V6+d4v?ycDZI8he-YeJ;K%3(eb&dY|IsFf!5I9WI2?>PSxOvIE`dv#lZSi)P_7F zU5o3bV4a+weW%Qrk0V6UYvOLPEEOLI;}`|KXX-sxtFDUu1N2E9v^|J-%*x29WjQ2`*Q-9B%2?4LljycrdBlgaO z5n!ahXQHB9RWsV$Q+u{;cMzR%GbmJ5ni#S4*0skwbGcS%GP#co|ARG`X(Uh*W^o2fYVTS*3f?o=yj+09K6+~M7Zph zsBeQJk`;9pQKfr(?%nCj@(!1>#-~{k?hL5#F;oK}g8jwMDF#qdNnBU0;U1KHZ?C3( zuj^!Hq`ngF12b@Bv9e+jQVa6HLY*D*fNN5y=HTl{wLX|1g_L6xa4l2AZ7t&fkXmtg z53Q&M>-tfWpq5Ma)jfI~2)PL4*>>W!>B6Z+K zCGlLJ#ERyD@;uzNSSHoBsqF<+y7OgQn$7D)L`2Yhnzv6H^F#%sC1eNrnY%>WU_QX~SiQMKr}i@o6&P3bR}(-2&yz?<53`h!VDZ|e?% zdK;l8?ENUC*E{{~(_)lxa)8rgvanA`xJjArob^rW)jttbw%Y{PWzQV5=u; zspJbdBBygL#82`|9EqAvTbz=w0zI;>K&Df&_xF7V40B z`ayn{QC=OTs~nE-xWMOsS5}fEa(B6hD*2K9-KNvh3y;d(9v`m{iE*^6qe=$QWZ zoudYqV?mwQrN+C!;UycV!JVPg6kBdiZOl16kNnjtEozx-A}hxYg*-C} z*r+t!Ok8Kd>Zp$U-Op%5D$Dci&hq{`+qELs_A7cp9wn|_&9CEJSi+QxnhVc^Qk9oh zC<{tKf4eiZ-EaY%*5KF*--omVjP5w;MHjhL#v+FK-2RTnVK9tuxkvZ)AT}pN_DI&)0#NSNDuy@hxKWHJDWJ zE<-$}08ZvE{B!;tV_=e1{nlQp!p3plo4ARS0b=vZ#I}G{duNT$I{;#AAD!0QX$6SP zWrEKvjMc}YYMaI;1H;X^X|~4#IcR}%J+7r{+5wy#N%_CmEI~uS$)~z|FSWY7%5KOL&Ag`<-`L+#_H~*Um7z~$wXX{*1DqzZVS6)a+=9?V zwADZ7jd5%LbNRRGQnw+Jrwz5pe|w+|`CO(tfGLt_t~H;^)17@1+{{WXxeJkIGCtv> zL&@$=Dty9xsnH@pO?rDBPkL|v^r)3p8MqITSFo(sZgzsY9~VgoM6kbE+#f(yQ|7}$ zk?4OnROAEmq5ST1S_K~fQghB+pt?K^S2rOw=n+VEvNytY#IEgrsd9u{@cm4{%D)!qNtor*j91+XPA)&%i0+rcvRi)EmtKCr1v|Z3;tw zM{@^iedu{yI%vfU)Bj8MFXS-=sjr+D`^Sb$#cHlIFZCQXKrPl3^)gO@r)nYpRo5wB z#d~eZyoQRj#&~_;rS$onDI*TQ?7*FFeQDQ9oZhlsq*ZX4MvYw<_8RKc)D zT@C1Cj8c|Mo8`A=O8W$*5I$jQ`T5iS5zCeBE9WzeY%RZ-A;Dz?a>e5Fn$s6>`p9G@ z{$>BHW&C#b(pUWrmn=R*O#qdCp=QT#TzAde;$}?l-{MlW?ck7v?cQg&Z?c|NkJsp8obXAT71gq3Y`H;rB`J0+Fw8f=ORlu)l$xL9kH&mGD>TJy>E(% zsHAm4ZXK!-_rm-nr_C|>A}}S_ADTt!VocXe{;AfYnY%<@uId=@OR`;R&~;7A9mGWv zn-ZpXH9}T4+soKYscVA0@2&q>-c{>hgYnR1myOUQ0QqG9f3{w*5lm( z+y1N}Ok}Z3Sf_3|X9Ou1+YB1De}YW`(S2doQpfKVLsP!8PmRTby^%73>4t2_GBkU_ z)hMm?&wjzQ;8La2MM`VD7E-do%et7CV{pV#+h1d_8^?8;-)hd_;q}!DUwwhQRtbzY&v9WP?WA_LyMt zH{m5WQy&sH=X%F3-SrmNGCeR=LCS9hx?aCft@}2(vPe~cZVwu+EkD!-NQQ@+J*OtP zJ448%Z_v^Z?m|QaD{D@?WreYQUL@6A2qqI#5Wdtd*^Sh?=q z56X@=46a~$fMj69#Pq`2=4|m`e>Zy?>q8GkkDxDrDO&<*JeJY%77rDGtOGZ z?BLp)?5L?~e>|v6aL^MFiLJkE<)xMyfK&kGx;aZcm7kposo6fAC*}AOz33SzS=eB| z9R&eSqhQ{gp(-&epehr;`jzzs*IuMoGkm|0A1=CpVdzEI)f;bp>o>J>_7a%3%$6)* zFG*IeUq*LrpMk`@ zZES|>^m)K^^QibDH>$n;RX1Pex1Fpj|KgCZ0=7>q{yk*?=reRv4aJlKT-x`lnr~Ok z)ztniG7?@}R_X70xOqT}{vM1Fhw1%<_yZz^;>~D+{t-?GSiRc(|6iAy&(P>Tdb&zF z6jddysCl>00YELI#;@kb)$M0H9G&cr*}6)dma`*pX)Rk8pKfOeADM@hzJ05g7jE5n z6uN69rFR|;b`>9U$}vABWYwYuhGQ|wb)7VN9F#I`*WS%FMzHuI$0{Z^H5e!hyUX)sHJD26Vt=ebc>QRdWtvNT$z;!>oBP?5s^8u~|a`x)0%Wb@5H-mz<+eL9ZgrWD}P zLMaNA1xi64+1_^TT-`rnif2o$wtCG^k5s&k|A%gXNy)Cu?*B1Fa&bvnyvIRpbu_;1 zlTcc~5J}Sq`lqeNRi<|!(#d_;W=AN^07+OsD=&a)*V1Eds86O@DCs#ZsI-FaR~w*x zG|fYi(H2IvX5ri2Q$tH9;O#|4G!;X{-jKhcAK-{uKPC6;fxKiVjg^i7r~B1P-;GdO zWZ6m5J6IU7DMwoqjziVWd9aSPQubT=WVYy}w?fIq?(JgXG%NgVIHF`jm|y%Ibs-Ow z|FGJ-BR^_kgSEZ=PEd};d^Hc=6`-Y((cQUmY2o`GaA|@~ps0H>s<62}@DHRVAm~F= z1bTmd^A?7ZT48(uK^QBoBsZJ@}wq?lUvj{ofl;~2=1+@iOIs>Hb?JR%w7xIfKxa#jkNVZjZGjzR_ z8z;&y;bqqZSXPx+bC)@_nUr4(B+oUq7WR4%*>fofpnR_$sw2nV1gcsp{8{@bJQ%{W zOomm=w|n9W=PsJg-a&MOf)SaM07U^Mmlj`IfXDa1r4CaQ;QM_NEB7-_QVBE`J0GVaxW4EP2SoOOG1_ z*yd}NJ{0GrS#PB}^tbThu~DTyPY=iC+ky{aRQBeYa|Aw>Fg!nDv6v+RL#nm=P^BIP zdAF14Hc=P=B3@r@@)*}?>%;S-Bg3eje1#&VCg2okp~5zt=~`u)n$3cy3`IH%l>ygeTmJdYD`h!0O~rog3EPXyV0AW9 z>3z7h&-imdVjEQHl!TuiupZ3MtH#RnkZH`Kim3DR`!e zyV{aS4HOq)RKrAhuI#F%t&0%^`%9l`11?h|!xeUYu!k$_!*n%B?9JuJQUsLh+@epA z_BsU7{IaI>^?7pn^1tv;I{-;af8dTBzwb?`>Zi|_p=c<;+KGlY5>Oi<=>|YPcWM!M z&Lq~fuPf2sHM&E)y2`a|iOEu11FnXY=C6h+1TMXTNkQ(e1=91Z>00zbjrCM#d884b z$hfSeZI+vayJqqCYO^_KZo_r8>2xBxc#Wz%kV}izTxN1$0DdY7YO4ENKzI1p)NotMT3fd*da|BHco` z+=?OhOH2;8<>s0TwpT#s+u_t<>5IM?GpyZ#_F7J^f2f+ivwtcZ8t>}y>b0v44|l`q zT82)lZdL>D!FugAKW9#G87T-iBx*EWp=XRZJdvpkn8;|Q3jL+xV8G9w3o+G+Uj_$2TwqGom~v| zMfYTWZhPNp3jNRaGM26DX+$b&Ypv!z1A6yJIio)7I)&dbBY1~y{TwDm9ci2Yp3fbF zKkXQJ0izL!D5Mv?7(gQ@%9nt2mSKyFZS;8=l~zIgW4``W?5nt{!TO5-I~E2od0^me z0ft`3BoE~zOo!<4*h0AlzX{91;-j?|da(a-PkZCr`O(*zihJize}vzKBZ{e7vUo3W zVOJc<-v=YuagtNI4-g8Z3pbN7Y3;2?Zm*%UwTAK=DHkLcl4IpTi_s=)EF8JdG@En~EHC9^R= zDS${XRXyM2=NW!D(6>-mKN|Mbgu3`H)LS*lnc!+5`MyuYNrkm(8jv|{6jx${=ZB~}(2D7Dsy_}O z!r8>?I6i29RWR)VBI?V^P2@z^T_!5*PtDsW^;E)sE6~ZPRAvH&Qzych>l5;bnE{hd z(e^^OW_w!yoZ)-%w=#Kpf0xe?_WA25Wy^4}=a-vRnW~z%^i#A7zob#I!IA8G(>T5Ed}d0f5Td(VVsYU!mf#Ov$+6B zIpuD$#<2@A$y>Kc(CT@H?2G)Ol6N+bM4AJbtXePe-~gNaDd^qOC{DQrDHwKgy@zsE7K)C!bxOqvH79e~uuPi=b$ zmj-X4!bZkcK_kfIdV{q^Dn@@3O|G4urxRR>Oi`M`*iN~mYG9N1!Bqp7UqajH)7rLB zcJgcB2-6XZj(encV3r0d6V4cDzFIjz*KjHKdz!It66i|JmAR_PSoJg`1U@BLS>J>- zK{?)mObLWRQ1Mf+hVMMn8f2%TrAFzzlNOe878l{!KNbh?xg^rI%hfnA56g~73r3UO zfD~=@EN7>^{nHhdwZ(_skIGA0P_Qjk{nz6<$GSf%!3)ap&rJzdjvM@zHpLsR9sV{! zZ>mY;M!!U4JQP|5-Gqsh#aJ#w>dlDwMlT)yYMigAf4BG{!W}Nx_*=oqWyJYW6cJeG z7_Cqcx98Tj{n?Xu1eU*UTh0KLcUv`VCW`!MVK`_RP6k|QJc11ZsLO^x&pghFp;`{9IKtBDU{6vgL&?+=Ox*ealfe>(uB`YzK# zo2B$&)c@3Ay1hD&B%O+tUIlv$l-pXJ++IF6kHfOXwLrUh0!Xsv^zwD0f#h*zUB7lC z6(o;yPmI0yX*kWXEIpQ5YUqCknbHl6?yHwRn?&kpygC*7x%{p{)TTBI1kWQ<Ll)O5t7xWworP$gOazh@c9;&x9@SJ zGd5v*`@wZyJLZUM`UxCyTv002A&)GjzJmRn;&dn?zb~up#fO0&ubunNTyc2+vn`ia zKETc-P-B!%(;I0_j7Ro2bKzjhNLn(!r@4(B-D9UG5c4tp?Zfqbd@PuDGcr>{vD_Yq ziY&T=XpZlR6+VMBfD?LRT^)%=JL!o%+b4FKpie?1*$PM7wyvMt-y>{Jjrpg9SlUlV zGYLU+qrsJOei|ZT9iEu-ZGSo(u{p??KGOd@I5DA(o(UT##CQSD0#sm^nKH3du<;A>D7jNe zD;U#-KRwD5gAF71I~=~bl3fgDRH_|srIZ?#29QeNJOd950%@gN1v)G*^3^>fsCWye zxCRr6TvwCHIxtnYE^+bKBU0{3`$XD6vN4ZX&t<}=g7kNYz`A{6k6aA(sc_^kMSdiY zDBC3!xOj8_Nb~rr;q*#WmZj2Nw_@LYOLXo~OkG0Qsf1Y3b zox1YI>%j1iZ*@dQ| z-PZold#N1#^ZIl7klc;vhwv@DVZG!YT)AV?WS#+?x=821{I4tPPtrg95b0P` zoNo@w51{0)x%ey9gZ&+b_1?-xmT3X-o-$_UD<-@2^@ ztp>b@CO`*qoknMsfJk1369~duZzAiIfvaqbulBc&URT?YUhDCO*4kf(QzO)r1-tzi zM^Ik7hYCRl37}(=<3XU>lEvMMKoU2$I9+p5jqDh!%*vEra?3PJ+u#e-ouxGcdzVxk0K-yaNE>D13`F| z-7w7%^kaVK>^YZBI)^;El*X{F+sy;{P*hsR{^r+z7@XV+LBtx8C)i5(z-GhJ5&a!g zwL#-ZP+>*8u9`UtlH7>i*$yf^8rC#ShHChj+$w5S*`SVv@}|MTAqq#JHHCZ1ukUy; z^*KBv+}NYd*W(0aWT0Cbp2*lluE=lxY6=C-;b4`GW&Zr!wS79_JTCwfsOu{9~qML<`>O@F!=PJ*j)0_9ZOk~EMM7Ju7ZL^YBTx`VNv`8hCkEB7ZD91C(2b|YhlhOI2M1qt3Dm?gvk4hnj`OWEtwj@ z%E)^+s101Jncw3wvR=*QQOCMBzg_SzX%sFceq9SOc|RbzE!DjqaGmlr8*r`vJ(!=@ zRPqnG&X7D|@4pXrL-qk&Drab>BF;YCkHg-#f}=<6 zc&rblCvv|`8)2UW6nv}kOwW1>N;Nl^V$9PR#iu~GZD`Mc$;)Khd;TmO(d&IBN}n;b z25btsMM&s&_WARu6s#FDTA0=sa1o$*0JWI>BErkeRm1ho`4X5mI=qq60Oi#cSDdEM zKRv1F%Jmu|)~@nX_!Cpd>wX}hT{C4SeFNwklp)(hO=mzw$?07~Yp(IjLBHgkLQ}}m z+prvor&qJhI~}ScY$y6Be5Z@Y6nl%UYQu37ybQC zA0pH*;h%;JD!?D!`cLIM^%Xvu_Z7_4R0{pqxMa@aQPVZP>6xWMe~U>K?xzQSm*49H zXYVFvSvmwpajZdWYd`dl@0r^_@ydT@!@zX%Z(fauJhn6~i-s`HxvX@vLy@`Zt^d37 zdKj$CK8l+Y!Qr4+#HsLz{@z-RpgzDU*VJgu%uR{F$@9J_q(?(K@7lptGzixz@$9~> ztx}K0q&00)fo-GCaj2*cTPlw4#&+NFNoAl^wi8^-kk$vB2&fT5Qkm-wODE;d%gW?) zvg_ndP(?jyUJadsOY+v%mFOafBw38_G$eZdeYI%oS@^4Uxv#P~>h!S5eM^)40|xv?wCyB8YB(t;L_`Is?Tn zqeQLRR)Xi}j^SE)xxjVGP@#`nYrZf)^Yy1khAIB-3X<8J}YY~-h^2CWY_+g z$Wt3bc;z15V!R*8wLNug7Os;Gp;2q~&nvIQdBrZ@K?bL*pvYjD0GfmP)u^s@|Hrp} zZKVXR9@@GgMPzloz!P{=p+`?wTw8cS2@?Fsa=8!TdUa1G>fmC~$NVq_> zkz;rNocB|D+m_qC$drAJ(12|KUMDBH}fnB<`5f%%HJdK)V8Hmq1lIJp%ls_aNlAY_Td2Q|ZW z-eq6$R9lgL3Y7tBs#g4;&fQnkN9r@Klhi7nJetw7h%O6toOi88)JXaqI$2nJrj9#$ z9!`~-9-3q73m7kE6oUqH1eiAs&+n@#@v{)kB+$afex3(dZJMFw3(%`)re<}@FM$;6s%HKF zs>gK%C%pldwZZa-{U+B773$|(*Akf?ty5XP13E?IfO(w0SYIv_27F|)x;}M(0J~|W z>3sXzyzwJ8?SMxa_cp5^|KC!c24?Dm?NHdeY{Zt~!vHnMkWrS*!~0v;IHTRl2i%Pl zR-9|rIub)X6xq%r@~9+G2MTBxM<;=b$lh{uOnzmaD~rLgK}22Vs^cKV`FZhmX{B8cWc(N8ib;xjT?SEl?`e>e%3dgJa_3sWceH;IThD=dYZPQelX8E0I; z@ZdVqZ1ekRU2`3=d04qBMT+pxhx!*KNYVu;FM8|O z)q^h#5G+UMy$DF%)zDq0-it9x+&s&ys15|GjTXjeu!qxSw_FXTlsw%_o@)>hdhHj^ zdd)hV47Jwa!?V_m*7whCaJo2AZbT5}Se;u@i|U*5jMo~FXB;AF!J|v24jgmtNF_6Z zlGnFx*7SYQZcZW|GPg_gO4!I$=cHZL|0Fm*Azck8pNT`wcWh!*_#aU%FX;Ug!N*6=#yA8Q8rJC113#oe00AlcdEzN zwXM6;Jr-D)JZJk9#%(RCCNPIl+1&{V^H9cp3+=Q0F)zE(sh3Tot$Xi95XE1Z{Pw#{ zF*l6L!S#VPYg91S;dftmO#(WVW`7Ki%KB-r@l}5rqL2y@jEFYZs~W zS)^>P+DuV!>AlV|W?`EwwO0z>1`st<}a~%9AVWgXd+}WYwH=)by)h zMBW0i(+~2yC#M$=&<}dJzYe8)1I&Aer)H=`Z|3I(3x_oc9R$-KE6!bgo4<`o>D%^& zE9_o#(0!=?XZR8RvoC!tZ_vr!0)5 zRZ|}!RHg4FLiiX+-gea@gXcfNL=-Im@TXw1+BwTL3*2Y@V=GMp)!IJCB=gpV7|=^^ z{36c^FuE%HFI%L~FR`gn-gWacwPMZ+flMxUj0$W_l?c(Iv?Wj_B8{k7gUe6v+y0?l z**W+fA{8;!{9L|=lPSB8Y+^DBl>4Haj2^S>Byd$vOrwp;ZYd%;Ny~lcr>8=h8oNLr41c} zPz@8)an?K*?99-9j>Xx{EmZY!eoM1nwVI*edNxBs;w@v0GO@5fP!7p_Hfk z{Ygopwi1y2$&hzfKPgMfDPT9YSSj6B9x11yG|QdaHSg2%th-+kE%bD#TUM-HBhR-@ zdf6w^C&NBkjg796M`u(Pft&?N^n$C|W|#LjFFxAE=RX_O6>O&BJfG9w!rsg+Uop;2 z3TOOk8M8!xyYoKWem<;F<-J|6zM%h^OOBr}?6DOtnYk#pD^+tCy%>y)m;Ik~3n)!u z)(LF&i7?nde))WvTUWzIs1=veEc&0gXsPOTa5oB>-`7K_9&M@owl{{zr%O#cn-E?5 zE9VBCWeAfV#42)~<73NKJc3N6ZLA4wbKqNlOKZqU3UuEvo5 zFMnaCy~cGi{H0R*GyQuex^fEBI`h8Q_CzO`7S$C`IpXNQtlPC$!&Dk~r--T1DLjO@Vl14KaH$Sj@5NQ+iMAO*4usRg+ zxYUFD^628u|to*w`sF1@&^BoFpX)4x3aQ2)qy^}YjOGFM|3t@jT!44lmU zb$xX_;<}#{M96B(8IK{;sDA#JG>o5;D3z?OGdzLonz4wQH77ioXD%BWtP_)->YrK3 z995h4C>gjkvhAj0!hHszUGn@&08J6czbMIZO~4A0k5Ot68?d>GUFM)2B?-$Cy%Iz}@(x$7gp~!mw=*#~P z+XS3Rinv)Ao5N#Uz5TXN%Wzz~Q8kJ0aLTiSo3dC!8qD{Ie7JLRiJ`u2h5i8_(Y5tn zrTP(*7n^65;*j4hWwpk4UBMu7C@xRUTWzTm{|>|G7%M7P&Ec*ihOM>r;RsNIJ|D`z zhFX!I*=XnM?60E&RjyAeS_PP-oubvIy<;#0xAL-$BMcU~TZlSdC@dCWiCDZgHFP|b ztk=#-dPJUF{_%}>(;o%oP8PLV-<_;)glY>|v*)Wcz1l{QM%;3LqlcKST98Grw(j9v>Y7NUm8v{kR-X zTK{HY@zJr0!*e!Do^;%5N$2G0#RD}ppBpgIrke8tY9ll4A;6-HXD$Hp5(_noabb^r zS;@pjaO6<2V5)Opj8SrLtgyYLJAjah3T^D?K}hk|O;l>D0jV1l1hjVRnmnr`48~7$ zU2Z_k&s3vY-`~J-u#DCl5#3<>Ae+NKmkDtbE;YvV#Rnqu$`DpI>a-ROVC1Lg92#nn z);c%iQkIFf)sZUEr^H>LmIhjMimR~NENz~R!nNXfk<45JC_0C{ZnNmMxpQV**2i3@ zDzB>6JPvkx!_(QgU0ImKO3sJ7;b|L?3f*V{sC}#NK-C-CiLzDJDMV7euBNMLuw-rM zl%Lrozz%b}95uyc4pseas`Q6EyZGqb%;G=tg$Qg%J9v06*tPKAXA;|w>9YJx*>_6e zqCQ|{S@j!?Z|EPol;T@ed?O|uVTFFGj&JIT^;zw?8Iff5ud;BoHTqkyN>WW>E$tx> z8AaNjAi4vhYy2~%gx(HE4uk90Tg&Kwc1nh7x)V+_;kDmIe7mdXF0n4YtL>D%yMOM| zwxj1BShAZ-8Qn{50F`xOtoE1O2beC~G39nqW*)yE*;-i}10Tra3ef`AJ_r*2%F9jH z54rA4!&XddWX@OcfuDG$z8bC5I3LDGj_ViL^r;buv<_!UX5-^yC^i<``*stffw|(? z(I(JdJ9?b~{t4HS)8_g*e-f14+Smg<1*ImI-dh#?G&V0P^J^RZo{1m48F(TCd$E>nBL)*CHfgp;dnwTki*C|7e6V`IAN%aE7N zlsWI!{K5uYSg5x^Jbn_9oI4&9}Fr3wYR(td5dUF z^oIVqOPZ1D-5v|DMrC;qPF=7vwmlt)^py>an%lLM4=@qhHlBlRko^$l4RhO7-bb#L zaGp+OnEn__>oio^AXuA$Kf!esRpHt`1+_e17`{n91C|uE@~>~nf8IZ^s)pe&!1$3= zls@j9WdN<2>q|d)H6g5!&##~qr6yU=eT_)Q^+VR zPLy?x)_{>}DP9wEwH)ySLiX2QvSx&)5HPc4#vpgd6YbXRlM`F^wGA+bB2w`6bvVIc zpeLCgs04@SW_jQ08$;HP2qD%{WyOn*M9Aw3jxNoO^e8xa)0*0WD@S7_cu6yp9RtLN zm&Qk*tkI`i|321F)y5}i+Q+$01&z-*2c#`^9-nlqqRYn#Kty!uT%Cq+A{?=fjyvy! zzJQ2WcX7gQ9*-xZQj5G|Cb&9P{!c;5-Qx4rA5R66s!BHEoCXsO$J=&>@abST_dQpU z|LU7+87{SZ1>v3jZnr!?+h|Zj=-E(2<=e6Cmp=y+o9(JU-Nt(^ zI%U~nF|IASo`*_S?5f;nVNwe|AD7pagR$IP@Dq{nw-+Mv#{JWyJL)`#i!hR|W0>2l z{3Ly%zlq(iRoVcC7|KVfToVTaH44!V=oDZEv5JH}w=-MU)?hnXITqGFaC7H6T*@)L zpz=%qUyq9TuKjb$1*8eIg@;Z3&7%voDM0~;P-&@qN);K&vsbJg9Pz!o8A|CZ{*!!N z*%Omf3$?s)6(XhQywJ8iT#ZSBBQ?BTlP8Ayz_`~UG!8lS_!yApb44A-oUroa$fP-B z4W+CIlbDRg^^Mca?rj*@hBq4jg<|e-S%cBG?NzENDCzoWvVXLBUrZzA%rw=!k!Ayl zd`Iceb70DP`CQxPGLMkr;%_b6P%NNiN;}(L{b?^IlBW|?+%|RzRNA^_J8koNST_1i zB+ZU^L;sx66Lp9J{Q{MDJHD(`#G4R#n=^dc68FuRB)v@pYnBN(l{~M!w?ZlJKCNqF zu6<|S)<1Ia&f183dyj1|_mVqcFL5q3zwsu|J9Ed(ZkxUre`g5oS4`A# zxc305<+W8o_ktzV+`de&DMNZIANfKwiLi zzMWz41SXO*#hB#UBKnhg=B>M`hdl+P*9}b2!+icyC;D_uIL&9~8B9u-wcTfXJmb^P zx(BSO&eLz7cS%^QjpSTGb=VgW>QdXTx$Q+rF^xg?64N7cw_>)B6RHFv`C;8uL{)qgUeKoeGI15AA5Yo+8S{W`NyT-ool8Lhr%gDEe5CIABIy1%it8dZl#7= zf$gf&^zYFl5NX*XKSfG9vL_RNtS!|Xg-ov)mS~MXM`OBKh42>tp1_Ym5rW*$ zHgrCe;@Eo+D(Y0 z#yg;e0w2olD_5+bHMo}0;v>!2w;Adh&z5a6v!C9O8`MVKeift=%aOlCb2XTJnRiPe zz6Oz(QR3R@dM!rYc2%69G1n@~mYnQm8i(_`fjZ}{JUAv%UQn-_)5*4hdBGKS3#qvs zh|Cq;(9nXeQXBFd4WX@?PJ<;M3J3YjLVEGQU(prvgY<{jGC@F{r2pPmFl}x(Chz~% z8ESSf*mdGgJ*O(*lBb~wo66`4h%~WnqA<|TtKHpzOvBvN!WQ2Mt8RuAKivf)vx8fo!cJI*^MgO)ur7-gqDf4!)>hiI+aqf=%Xb)&} z7rnE8eB8%QGY{N_QZ-vAjE#5a?(!R}QRE&_ZV&!_tsdN)`?gd>k^5XnVk5?|@@Tpr zle`Ym3~Qq*1);x-Q$y?S4`L$Mzbe)LA&_+TG?mBu4#2Wrf%f&ShoSVi`rvIQ2-$c9 zo6iB3y@^@Q7mJUQDZg@=_Ogo) ziB!KvNY&Ptwn^_BFsV`^Cb-0w+V?Gzkc}>N=IwV-ay`0h-*t8P!uLHx=PzoOH;OEzuogZQeQ*Qt+X*moP%OP99hI+*Qek=f|c!AK^O5m>qSk zBVqYpIvMP!{#hPG)i;kukUo3AJRFmoHQ`G(T~0a3Z~M1bxa{KqIaqe)8I~wqr-+H# z%jA$>hgKL=PjpQjV^ju(KM9fn(rcgHC+EhQxdl3a>mb@$jvgaVT+QU*29gp z1a>-D!w}yFiU5#;mPv^k04K4Ez*RcwS^d+ys&LB#7k{Tc$k*9<-kDKp-{%B-wewkx zI_CxtFKzKU502CaR$Wr@XwFB(rd6twuZh@;=>mQrsqI^RPhIF*>6N|N^)BiY*)roR zfD(X6u7{g>iXwm^J^3gL>0tl+RGssVS)C;K25!qr)EWe-SWGeqtqb5XrR%;=U}! z&AAGxUzL}~)&1|jKWdG)igFFI3q+t-7>@2~zWje|*5`XTKlr^HQHp!MhU76^1S(>e zg$po+S~pYcuaj^Jwc36?L+v(%$`~A2Nn6OXhMnKk05%0y({HP<(?E(O9J8%m)C5c_ zVpc`XK}nb$u{!-cB5%H`eM#o~N|#(6(pS==~Srn3h?Z<$*BEqj9N)Wy&EEIb6IR8A0F zFoMz;@~nBMjjs=bDZ~mZebt>G!N`(uk?wvBNT%yxa;L_XS>thJQms|o=2-p&iu5Tm zn!e8PB%J9(SkDSX$TCQ2z{==`+N1Ea>v|0ohqOmJ)4^mG=^Ni{A>Ap z-nG6mt)sr+GIf4Q3r_PQoWhj;S_A$|m?T_7k8e{g<7He#w1TznRVcFDRRw;n|8bjf z_jM@6Fp4NYcS+;p8`!*d19v;h0<0*@&iL2Y(h`7bXL@^;>}`z-iPwYqK8Z0MThfv+aELwyXKG{xL0#q(6sK)dZ9(&nAK@fv$C3pMVm#!ZmLA#GVjUg|CmX(k>XY#>ghEtg-#Yf;@chnSN!*3s ztG*);alJqo?BJZN=~~{lT?nS|1JN{Z#sOt!tl-CZ1AbO95R5MtqKsu95#tM3T*%S6%HRrGQ&#jvE(KH$&BD5goLk~jxSnu2oFPNQ=X1iNQqY*(|cpVuc)!9c3BoR7&{ zXU1AURQ>h>Tq=JDdyGg9GzygR?S9!_-iva*v%E4dcAbVhT%*|lm<;Th*-@UOgNWpq z9@acCR%1Gk(WlzyN59X1jbD`Im75k`d7e%ImAKlTE?NaB$KCSz|@@&mM7o3n{tpRnpLVbk7p2Gxu;eA zvw6Ji^Ua*lKW>4q>5I=}lKFK_3wQyJ{3vSG#a~PcYGSIwGQ0$)y)%Y(k+V^%V{3`( z)&6In#uNb}cn#Gpy;NkAe}3!V8#bS$FyO0I*AB8@(-Z<*If(d8P@-r2oKwR=*O8lF zZhx{+v5rDr*s6EOf1LflkWq`(9D*y=q|bCet?f`8A#^J zM)F}E zI8(mG-vKEJkGGtl^gSxgY^)rge*opQ4X*}p3PYYR=Lf37Q|TAZaXf;&={JJi>yk^$4}B`-73{$i5#(Eb zEpm1e6#2%7w!VT-#>u=bonw`cQ~FyD{>F^dHv624ORH^;-l7GUW6fz;8Qd~4>OH3e zDYF=jEmqeuOvJ|myRnS?JPwa1LFU^13as*b1#r!W-?|djFw$3QzL3w6efQ$6k2o{viN)s=(!lwhJW!(mYsqAQCn6LyKpdfJ1e=ZF|7vGBYRvKca79*5b{&2)!O?y zNSQ}AP!wEtqe(4=*m|mw8cjCh<>lWlR3qFJu&M2a83NLbd`VjD8G+MgY7W+mH|K5} zOU)lw2JCK!UR>2by1v=uu7>5RbK|)NQdjcuZ0jg(RJ#`WKh=6OM~-3B(Pw977qaZ7 zT;u5Uy1%LsWHL~;C(9zcEf4X+UbG5ku&wEo%77+}fAurQ2AA@)?2K!FY4va#NC#m)IT|EveB4tM&x~_C&vHs7PtkcCb#de zZ^B!FwCWAU+)iuV~?Spi;pO6t9uyPDILGHnsT6(j2hF zHCD%!?KE`U-QQJ1XjAV==N{}*=Wq5lMYknbss)Z@xzm&#>S0L1YUWpU8vP>(Md*+BdJNVy zE;m>{o}avMsMX37aB5|KfsXQI|MNgwba<-An=IVWD&VN`j03jt?W#~pZPET2zsS-n zH*eWbXwO3Fj$HuOvU{qf=kRKMXPv+EyzA75_0sB|FCbE9v$ems2GAE#8TS_dcD#jF zlgLX+WXr4+MN&B_@%G*M7d>xR(fh=IX0p(?!?HKjF>`fF| zSRrrQY7XWOk*#WrdpkbrZIrihmXnQlfaKq)cx7^X7m-G}X8U~Go%^4;@>30>pSV^k6}n+PQv{U0 zE)*#NeAfT^3%0D!p`_bR0&8x9U*M!WQD@nH={ho@j0@kblDh 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", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "1": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "2": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32000": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32001": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32002": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32003": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32004": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32005": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32006": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32007": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32008": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32009": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32010": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32011": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32012": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32013": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32014": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32015": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32016": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32017": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32018": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32019": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32020": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32021": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32022": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32023": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32024": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32025": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32026": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32027": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32028": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32029": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32030": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32031": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32032": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32033": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32034": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32035": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32036": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32037": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32038": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32039": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32040": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32041": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32042": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32043": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32044": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32045": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32046": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32047": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32048": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32049": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32050": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32051": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32052": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32053": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32054": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32055": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32056": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32057": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32058": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32059": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32060": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32061": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32062": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32063": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32064": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32065": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32066": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32067": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32068": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32069": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32070": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32071": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32072": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32073": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32074": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32075": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32076": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32077": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32078": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32079": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32080": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32081": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32082": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32083": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32084": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32085": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32086": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32087": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32088": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32089": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32090": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32091": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32092": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32093": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32094": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32095": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32096": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32097": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32098": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32099": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + } + }, + "additional_special_tokens": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "bos_token": "", + "clean_up_tokenization_spaces": false, + "eos_token": "", + "legacy": false, + "model_max_length": 512, + "pad_token": null, + "padding_side": "right", + "sp_model_kwargs": {}, + "spaces_between_special_tokens": false, + "tokenizer_class": "LlamaTokenizer", + "unk_token": "", + "use_default_system_prompt": false +} diff --git a/requirements.txt b/requirements.txt index 108958d2f..6febc3d68 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,8 @@ torchsde torchvision torchaudio einops -transformers>=4.25.1 +transformers>=4.28.1 +tokenizers>=0.13.3 safetensors>=0.4.2 aiohttp pyyaml From 8e012043a9d0af3979bbe2cea8dc1ec7768f9d88 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 11 Jul 2024 17:51:56 -0400 Subject: [PATCH 096/123] Add a ModelSamplingAuraFlow node to change the shift value. Set the default AuraFlow shift value to 1.73 (sqrt(3)). --- comfy/supported_models.py | 1 + comfy_extras/nodes_model_advanced.py | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/comfy/supported_models.py b/comfy/supported_models.py index ccf8c333e..a030f6229 100644 --- a/comfy/supported_models.py +++ b/comfy/supported_models.py @@ -564,6 +564,7 @@ class AuraFlow(supported_models_base.BASE): sampling_settings = { "multiplier": 1.0, + "shift": 1.73, } unet_extra_config = {} diff --git a/comfy_extras/nodes_model_advanced.py b/comfy_extras/nodes_model_advanced.py index 97559cf56..22ba9547b 100644 --- a/comfy_extras/nodes_model_advanced.py +++ b/comfy_extras/nodes_model_advanced.py @@ -144,7 +144,7 @@ class ModelSamplingSD3: CATEGORY = "advanced/model" - def patch(self, model, shift): + def patch(self, model, shift, multiplier=1000): m = model.clone() sampling_base = comfy.model_sampling.ModelSamplingDiscreteFlow @@ -154,10 +154,22 @@ class ModelSamplingSD3: pass model_sampling = ModelSamplingAdvanced(model.model.model_config) - model_sampling.set_parameters(shift=shift) + model_sampling.set_parameters(shift=shift, multiplier=multiplier) m.add_object_patch("model_sampling", model_sampling) return (m, ) +class ModelSamplingAuraFlow(ModelSamplingSD3): + @classmethod + def INPUT_TYPES(s): + return {"required": { "model": ("MODEL",), + "shift": ("FLOAT", {"default": 1.73, "min": 0.0, "max": 100.0, "step":0.01}), + }} + + FUNCTION = "patch_aura" + + def patch_aura(self, model, shift): + return self.patch(model, shift, multiplier=1.0) + class ModelSamplingContinuousEDM: @classmethod def INPUT_TYPES(s): @@ -271,5 +283,6 @@ NODE_CLASS_MAPPINGS = { "ModelSamplingContinuousV": ModelSamplingContinuousV, "ModelSamplingStableCascade": ModelSamplingStableCascade, "ModelSamplingSD3": ModelSamplingSD3, + "ModelSamplingAuraFlow": ModelSamplingAuraFlow, "RescaleCFG": RescaleCFG, } From b6f09cf649a8e06783f148a0f5824405ed460003 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 11 Jul 2024 22:58:03 -0400 Subject: [PATCH 097/123] Add sentencepiece dependency. --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 6febc3d68..4c2c0b2b2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,7 @@ torchaudio einops transformers>=4.28.1 tokenizers>=0.13.3 +sentencepiece safetensors>=0.4.2 aiohttp pyyaml From 29c2e26724d4982a3e33114eb9064f1a11f4f4ed Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Fri, 12 Jul 2024 01:08:45 -0400 Subject: [PATCH 098/123] Better tokenizing code for AuraFlow. --- comfy/text_encoders/aura_t5.py | 6 +- comfy/text_encoders/llama_tokenizer.py | 22 + .../t5_pile_tokenizer/added_tokens.json | 102 -- .../t5_pile_tokenizer/special_tokens_map.json | 125 --- .../t5_pile_tokenizer/tokenizer_config.json | 945 ------------------ 5 files changed, 25 insertions(+), 1175 deletions(-) create mode 100644 comfy/text_encoders/llama_tokenizer.py delete mode 100644 comfy/text_encoders/t5_pile_tokenizer/added_tokens.json delete mode 100644 comfy/text_encoders/t5_pile_tokenizer/special_tokens_map.json delete mode 100644 comfy/text_encoders/t5_pile_tokenizer/tokenizer_config.json diff --git a/comfy/text_encoders/aura_t5.py b/comfy/text_encoders/aura_t5.py index 0e84189aa..95f942ef5 100644 --- a/comfy/text_encoders/aura_t5.py +++ b/comfy/text_encoders/aura_t5.py @@ -1,5 +1,5 @@ from comfy import sd1_clip -from transformers import LlamaTokenizerFast +from .llama_tokenizer import LLAMATokenizer import comfy.t5 import os @@ -10,8 +10,8 @@ class PT5XlModel(sd1_clip.SDClipModel): class PT5XlTokenizer(sd1_clip.SDTokenizer): def __init__(self, embedding_directory=None): - tokenizer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "t5_pile_tokenizer") - super().__init__(tokenizer_path, pad_with_end=False, embedding_size=2048, embedding_key='pile_t5xl', tokenizer_class=LlamaTokenizerFast, has_start_token=False, pad_to_max_length=False, max_length=99999999, min_length=256, pad_token=1) + tokenizer_path = os.path.join(os.path.join(os.path.dirname(os.path.realpath(__file__)), "t5_pile_tokenizer"), "tokenizer.model") + super().__init__(tokenizer_path, pad_with_end=False, embedding_size=2048, embedding_key='pile_t5xl', tokenizer_class=LLAMATokenizer, has_start_token=False, pad_to_max_length=False, max_length=99999999, min_length=256, pad_token=1) class AuraT5Tokenizer(sd1_clip.SD1Tokenizer): def __init__(self, embedding_directory=None): diff --git a/comfy/text_encoders/llama_tokenizer.py b/comfy/text_encoders/llama_tokenizer.py new file mode 100644 index 000000000..a6db1da62 --- /dev/null +++ b/comfy/text_encoders/llama_tokenizer.py @@ -0,0 +1,22 @@ +import os + +class LLAMATokenizer: + @staticmethod + def from_pretrained(path): + return LLAMATokenizer(path) + + def __init__(self, tokenizer_path): + import sentencepiece + self.tokenizer = sentencepiece.SentencePieceProcessor(model_file=tokenizer_path) + self.end = self.tokenizer.eos_id() + + def get_vocab(self): + out = {} + for i in range(self.tokenizer.get_piece_size()): + out[self.tokenizer.id_to_piece(i)] = i + return out + + def __call__(self, string): + out = self.tokenizer.encode(string) + out += [self.end] + return {"input_ids": out} diff --git a/comfy/text_encoders/t5_pile_tokenizer/added_tokens.json b/comfy/text_encoders/t5_pile_tokenizer/added_tokens.json deleted file mode 100644 index 3f5132007..000000000 --- a/comfy/text_encoders/t5_pile_tokenizer/added_tokens.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "": 32099, - "": 32089, - "": 32088, - "": 32087, - "": 32086, - "": 32085, - "": 32084, - "": 32083, - "": 32082, - "": 32081, - "": 32080, - "": 32098, - "": 32079, - "": 32078, - "": 32077, - "": 32076, - "": 32075, - "": 32074, - "": 32073, - "": 32072, - "": 32071, - "": 32070, - "": 32097, - "": 32069, - "": 32068, - "": 32067, - "": 32066, - "": 32065, - "": 32064, - "": 32063, - "": 32062, - "": 32061, - "": 32060, - "": 32096, - "": 32059, - "": 32058, - "": 32057, - "": 32056, - "": 32055, - "": 32054, - "": 32053, - "": 32052, - "": 32051, - "": 32050, - "": 32095, - "": 32049, - "": 32048, - "": 32047, - "": 32046, - "": 32045, - "": 32044, - "": 32043, - "": 32042, - "": 32041, - "": 32040, - "": 32094, - "": 32039, - "": 32038, - "": 32037, - "": 32036, - "": 32035, - "": 32034, - "": 32033, - "": 32032, - "": 32031, - "": 32030, - "": 32093, - "": 32029, - "": 32028, - "": 32027, - "": 32026, - "": 32025, - "": 32024, - "": 32023, - "": 32022, - "": 32021, - "": 32020, - "": 32092, - "": 32019, - "": 32018, - "": 32017, - "": 32016, - "": 32015, - "": 32014, - "": 32013, - "": 32012, - "": 32011, - "": 32010, - "": 32091, - "": 32009, - "": 32008, - "": 32007, - "": 32006, - "": 32005, - "": 32004, - "": 32003, - "": 32002, - "": 32001, - "": 32000, - "": 32090 -} diff --git a/comfy/text_encoders/t5_pile_tokenizer/special_tokens_map.json b/comfy/text_encoders/t5_pile_tokenizer/special_tokens_map.json deleted file mode 100644 index 19fb1d5f4..000000000 --- a/comfy/text_encoders/t5_pile_tokenizer/special_tokens_map.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "additional_special_tokens": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "bos_token": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false - }, - "eos_token": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false - }, - "unk_token": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false - } -} diff --git a/comfy/text_encoders/t5_pile_tokenizer/tokenizer_config.json b/comfy/text_encoders/t5_pile_tokenizer/tokenizer_config.json deleted file mode 100644 index 81f8e11e9..000000000 --- a/comfy/text_encoders/t5_pile_tokenizer/tokenizer_config.json +++ /dev/null @@ -1,945 +0,0 @@ -{ - "add_bos_token": false, - "add_eos_token": true, - "add_prefix_space": true, - "added_tokens_decoder": { - "0": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "1": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "2": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32000": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32001": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32002": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32003": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32004": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32005": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32006": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32007": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32008": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32009": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32010": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32011": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32012": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32013": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32014": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32015": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32016": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32017": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32018": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32019": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32020": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32021": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32022": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32023": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32024": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32025": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32026": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32027": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32028": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32029": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32030": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32031": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32032": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32033": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32034": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32035": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32036": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32037": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32038": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32039": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32040": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32041": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32042": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32043": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32044": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32045": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32046": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32047": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32048": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32049": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32050": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32051": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32052": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32053": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32054": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32055": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32056": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32057": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32058": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32059": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32060": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32061": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32062": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32063": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32064": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32065": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32066": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32067": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32068": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32069": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32070": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32071": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32072": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32073": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32074": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32075": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32076": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32077": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32078": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32079": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32080": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32081": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32082": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32083": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32084": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32085": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32086": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32087": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32088": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32089": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32090": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32091": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32092": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32093": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32094": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32095": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32096": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32097": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32098": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32099": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - } - }, - "additional_special_tokens": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "bos_token": "", - "clean_up_tokenization_spaces": false, - "eos_token": "", - "legacy": false, - "model_max_length": 512, - "pad_token": null, - "padding_side": "right", - "sp_model_kwargs": {}, - "spaces_between_special_tokens": false, - "tokenizer_class": "LlamaTokenizer", - "unk_token": "", - "use_default_system_prompt": false -} From 4ca9b9cc29fefaa899cba67d61a8252ae9f16c0d Mon Sep 17 00:00:00 2001 From: Robin Huang Date: Fri, 12 Jul 2024 10:33:57 -0700 Subject: [PATCH 099/123] Add Github Workflow for releasing stable versions and standalone bundle. (#3949) * Add stable release. * Only build CUDA 12.1 + 3.11 Python. * Upgrade checkout and setup-python to latest version. * lzma2 * Update artifact name to be ComfyUI_windows_portable_nvidia.7z --- .github/workflows/stable-release.yml | 109 +++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 .github/workflows/stable-release.yml diff --git a/.github/workflows/stable-release.yml b/.github/workflows/stable-release.yml new file mode 100644 index 000000000..1fd76b530 --- /dev/null +++ b/.github/workflows/stable-release.yml @@ -0,0 +1,109 @@ + +name: "Release Stable Version" + +on: + push: + tags: + - 'v*' + +jobs: + package_comfy_windows: + permissions: + contents: "write" + packages: "write" + pull-requests: "read" + runs-on: windows-latest + strategy: + matrix: + python_version: [3.11.8] + cuda_version: [121] + steps: + - name: Calculate Minor Version + shell: bash + run: | + # Extract the minor version from the Python version + MINOR_VERSION=$(echo "${{ matrix.python_version }}" | cut -d'.' -f2) + echo "MINOR_VERSION=$MINOR_VERSION" >> $GITHUB_ENV + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python_version }} + + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + persist-credentials: false + - shell: bash + run: | + echo "@echo off + call update_comfyui.bat nopause + echo - + echo This will try to update pytorch and all python dependencies. + echo - + echo If you just want to update normally, close this and run update_comfyui.bat instead. + echo - + pause + ..\python_embeded\python.exe -s -m pip install --upgrade torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu${{ matrix.cuda_version }} -r ../ComfyUI/requirements.txt pygit2 + pause" > update_comfyui_and_python_dependencies.bat + + python -m pip wheel --no-cache-dir torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu${{ matrix.cuda_version }} -r requirements.txt pygit2 -w ./temp_wheel_dir + python -m pip install --no-cache-dir ./temp_wheel_dir/* + echo installed basic + ls -lah temp_wheel_dir + mv temp_wheel_dir cu${{ matrix.cuda_version }}_python_deps + mv cu${{ matrix.cuda_version }}_python_deps ../ + mv update_comfyui_and_python_dependencies.bat ../ + cd .. + pwd + ls + + cp -r ComfyUI ComfyUI_copy + curl https://www.python.org/ftp/python/${{ matrix.python_version }}/python-${{ matrix.python_version }}-embed-amd64.zip -o python_embeded.zip + unzip python_embeded.zip -d python_embeded + cd python_embeded + echo ${{ env.MINOR_VERSION }} + echo 'import site' >> ./python3${{ env.MINOR_VERSION }}._pth + curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py + ./python.exe get-pip.py + ./python.exe --version + echo "Pip version:" + ./python.exe -m pip --version + + set PATH=$PWD/Scripts:$PATH + echo $PATH + ./python.exe -s -m pip install ../cu${{ matrix.cuda_version }}_python_deps/* + sed -i '1i../ComfyUI' ./python3${{ env.MINOR_VERSION }}._pth + cd .. + + git clone https://github.com/comfyanonymous/taesd + cp taesd/*.pth ./ComfyUI_copy/models/vae_approx/ + + mkdir ComfyUI_windows_portable + mv python_embeded ComfyUI_windows_portable + mv ComfyUI_copy ComfyUI_windows_portable/ComfyUI + + cd ComfyUI_windows_portable + + mkdir update + cp -r ComfyUI/.ci/update_windows/* ./update/ + cp -r ComfyUI/.ci/windows_base_files/* ./ + cp ../update_comfyui_and_python_dependencies.bat ./update/ + + cd .. + + "C:\Program Files\7-Zip\7z.exe" a -t7z -m0=lzma2 -mx=8 -mfb=64 -md=32m -ms=on -mf=BCJ2 ComfyUI_windows_portable.7z ComfyUI_windows_portable + mv ComfyUI_windows_portable.7z ComfyUI/ComfyUI_windows_portable_nvidia.7z + + cd ComfyUI_windows_portable + python_embeded/python.exe -s ComfyUI/main.py --quick-test-for-ci --cpu + + ls + + - name: Upload binaries to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ComfyUI_windows_portable_nvidia.7z + tag: ${{ github.ref }} + overwrite: true + From ce2473bb016748a4d98e9bce02d675b4fc22f4ac Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Fri, 12 Jul 2024 15:25:07 -0400 Subject: [PATCH 100/123] Add link to AuraFlow example in Readme. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 35e3238a1..5f747321f 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ This ui will let you design and execute advanced stable diffusion pipelines usin - [Model Merging](https://comfyanonymous.github.io/ComfyUI_examples/model_merging/) - [LCM models and Loras](https://comfyanonymous.github.io/ComfyUI_examples/lcm/) - [SDXL Turbo](https://comfyanonymous.github.io/ComfyUI_examples/sdturbo/) +- [AuraFlow](https://comfyanonymous.github.io/ComfyUI_examples/aura_flow/) - Latent previews with [TAESD](#how-to-show-high-quality-previews) - Starts up very fast. - Works fully offline: will never download anything. From a3dffc447a7b9f4948037a988fd143eeffd87bd1 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sat, 13 Jul 2024 13:51:40 -0400 Subject: [PATCH 101/123] Support AuraFlow Lora and loading model weights in diffusers format. You can load model weights in diffusers format using the UNETLoader node. --- comfy/lora.py | 8 +++++ comfy/model_detection.py | 66 +++++++++++++++++++++---------------- comfy/sd.py | 33 +++++++++---------- comfy/utils.py | 70 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 133 insertions(+), 44 deletions(-) diff --git a/comfy/lora.py b/comfy/lora.py index 037431775..e36b354f0 100644 --- a/comfy/lora.py +++ b/comfy/lora.py @@ -274,4 +274,12 @@ def model_lora_keys_unet(model, key_map={}): key_lora = "lora_transformer_{}".format(k[:-len(".weight")].replace(".", "_")) #OneTrainer lora key_map[key_lora] = to + if isinstance(model, comfy.model_base.AuraFlow): #Diffusers lora AuraFlow + diffusers_keys = comfy.utils.auraflow_to_diffusers(model.model_config.unet_config, output_prefix="diffusion_model.") + for k in diffusers_keys: + if k.endswith(".weight"): + to = diffusers_keys[k] + key_lora = "transformer.{}".format(k[:-len(".weight")]) #simpletrainer and probably regular diffusers lora format + key_map[key_lora] = to + return key_map diff --git a/comfy/model_detection.py b/comfy/model_detection.py index dd5bff82a..c62e2b822 100644 --- a/comfy/model_detection.py +++ b/comfy/model_detection.py @@ -109,6 +109,10 @@ def detect_unet_config(state_dict, key_prefix): unet_config = {} unet_config["max_seq"] = state_dict['{}positional_encoding'.format(key_prefix)].shape[1] unet_config["cond_seq_dim"] = state_dict['{}cond_seq_linear.weight'.format(key_prefix)].shape[1] + double_layers = count_blocks(state_dict_keys, '{}double_layers.'.format(key_prefix) + '{}.') + single_layers = count_blocks(state_dict_keys, '{}single_layers.'.format(key_prefix) + '{}.') + unet_config["n_double_layers"] = double_layers + unet_config["n_layers"] = double_layers + single_layers return unet_config if '{}input_blocks.0.0.weight'.format(key_prefix) not in state_dict_keys: @@ -450,37 +454,45 @@ def model_config_from_diffusers_unet(state_dict): return None def convert_diffusers_mmdit(state_dict, output_prefix=""): - num_blocks = count_blocks(state_dict, 'transformer_blocks.{}.') - if num_blocks > 0: + out_sd = {} + + if 'transformer_blocks.0.attn.add_q_proj.weight' in state_dict: #SD3 + num_blocks = count_blocks(state_dict, 'transformer_blocks.{}.') depth = state_dict["pos_embed.proj.weight"].shape[0] // 64 - out_sd = {} sd_map = comfy.utils.mmdit_to_diffusers({"depth": depth, "num_blocks": num_blocks}, output_prefix=output_prefix) - for k in sd_map: - weight = state_dict.get(k, None) - if weight is not None: - t = sd_map[k] + elif 'joint_transformer_blocks.0.attn.add_k_proj.weight' in state_dict: #AuraFlow + num_joint = count_blocks(state_dict, 'joint_transformer_blocks.{}.') + num_single = count_blocks(state_dict, 'single_transformer_blocks.{}.') + sd_map = comfy.utils.auraflow_to_diffusers({"n_double_layers": num_joint, "n_layers": num_joint + num_single}, output_prefix=output_prefix) + else: + return None - if not isinstance(t, str): - if len(t) > 2: - fun = t[2] - else: - fun = lambda a: a - offset = t[1] - if offset is not None: - old_weight = out_sd.get(t[0], None) - if old_weight is None: - old_weight = torch.empty_like(weight) - old_weight = old_weight.repeat([3] + [1] * (len(old_weight.shape) - 1)) + for k in sd_map: + weight = state_dict.get(k, None) + if weight is not None: + t = sd_map[k] - w = old_weight.narrow(offset[0], offset[1], offset[2]) - else: - old_weight = weight - w = weight - w[:] = fun(weight) - t = t[0] - out_sd[t] = old_weight + if not isinstance(t, str): + if len(t) > 2: + fun = t[2] else: - out_sd[t] = weight - state_dict.pop(k) + fun = lambda a: a + offset = t[1] + if offset is not None: + old_weight = out_sd.get(t[0], None) + if old_weight is None: + old_weight = torch.empty_like(weight) + old_weight = old_weight.repeat([3] + [1] * (len(old_weight.shape) - 1)) + + w = old_weight.narrow(offset[0], offset[1], offset[2]) + else: + old_weight = weight + w = weight + w[:] = fun(weight) + t = t[0] + out_sd[t] = old_weight + else: + out_sd[t] = weight + state_dict.pop(k) return out_sd diff --git a/comfy/sd.py b/comfy/sd.py index 6028029d6..b5bbcef61 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -562,26 +562,25 @@ def load_unet_state_dict(sd): #load unet in diffusers or regular format if model_config is not None: new_sd = sd - elif 'transformer_blocks.0.attn.add_q_proj.weight' in sd: #MMDIT SD3 + else: new_sd = model_detection.convert_diffusers_mmdit(sd, "") - if new_sd is None: - return None - model_config = model_detection.model_config_from_unet(new_sd, "") - if model_config is None: - return None - else: #diffusers - model_config = model_detection.model_config_from_diffusers_unet(sd) - if model_config is None: - return None + if new_sd is not None: #diffusers mmdit + model_config = model_detection.model_config_from_unet(new_sd, "") + if model_config is None: + return None + else: #diffusers unet + model_config = model_detection.model_config_from_diffusers_unet(sd) + if model_config is None: + return None - diffusers_keys = comfy.utils.unet_to_diffusers(model_config.unet_config) + diffusers_keys = comfy.utils.unet_to_diffusers(model_config.unet_config) - new_sd = {} - for k in diffusers_keys: - if k in sd: - new_sd[diffusers_keys[k]] = sd.pop(k) - else: - logging.warning("{} {}".format(diffusers_keys[k], k)) + new_sd = {} + for k in diffusers_keys: + if k in sd: + new_sd[diffusers_keys[k]] = sd.pop(k) + else: + logging.warning("{} {}".format(diffusers_keys[k], k)) offload_device = model_management.unet_offload_device() unet_dtype = model_management.unet_dtype(model_params=parameters, supported_dtypes=model_config.supported_inference_dtypes) diff --git a/comfy/utils.py b/comfy/utils.py index 48618e076..1e4b5ef88 100644 --- a/comfy/utils.py +++ b/comfy/utils.py @@ -332,6 +332,76 @@ def mmdit_to_diffusers(mmdit_config, output_prefix=""): return key_map + +def auraflow_to_diffusers(mmdit_config, output_prefix=""): + n_double_layers = mmdit_config.get("n_double_layers", 0) + n_layers = mmdit_config.get("n_layers", 0) + + key_map = {} + for i in range(n_layers): + if i < n_double_layers: + index = i + prefix_from = "joint_transformer_blocks" + prefix_to = "{}double_layers".format(output_prefix) + block_map = { + "attn.to_q.weight": "attn.w2q.weight", + "attn.to_k.weight": "attn.w2k.weight", + "attn.to_v.weight": "attn.w2v.weight", + "attn.to_out.0.weight": "attn.w2o.weight", + "attn.add_q_proj.weight": "attn.w1q.weight", + "attn.add_k_proj.weight": "attn.w1k.weight", + "attn.add_v_proj.weight": "attn.w1v.weight", + "attn.to_add_out.weight": "attn.w1o.weight", + "ff.linear_1.weight": "mlpX.c_fc1.weight", + "ff.linear_2.weight": "mlpX.c_fc2.weight", + "ff.out_projection.weight": "mlpX.c_proj.weight", + "ff_context.linear_1.weight": "mlpC.c_fc1.weight", + "ff_context.linear_2.weight": "mlpC.c_fc2.weight", + "ff_context.out_projection.weight": "mlpC.c_proj.weight", + "norm1.linear.weight": "modX.1.weight", + "norm1_context.linear.weight": "modC.1.weight", + } + else: + index = i - n_double_layers + prefix_from = "single_transformer_blocks" + prefix_to = "{}single_layers".format(output_prefix) + + block_map = { + "attn.to_q.weight": "attn.w1q.weight", + "attn.to_k.weight": "attn.w1k.weight", + "attn.to_v.weight": "attn.w1v.weight", + "attn.to_out.0.weight": "attn.w1o.weight", + "norm1.linear.weight": "modCX.1.weight", + "ff.linear_1.weight": "mlp.c_fc1.weight", + "ff.linear_2.weight": "mlp.c_fc2.weight", + "ff.out_projection.weight": "mlp.c_proj.weight" + } + + for k in block_map: + key_map["{}.{}.{}".format(prefix_from, index, k)] = "{}.{}.{}".format(prefix_to, index, block_map[k]) + + MAP_BASIC = { + ("positional_encoding", "pos_embed.pos_embed"), + ("register_tokens", "register_tokens"), + ("t_embedder.mlp.0.weight", "time_step_proj.linear_1.weight"), + ("t_embedder.mlp.0.bias", "time_step_proj.linear_1.bias"), + ("t_embedder.mlp.2.weight", "time_step_proj.linear_2.weight"), + ("t_embedder.mlp.2.bias", "time_step_proj.linear_2.bias"), + ("cond_seq_linear.weight", "context_embedder.weight"), + ("init_x_linear.weight", "pos_embed.proj.weight"), + ("init_x_linear.bias", "pos_embed.proj.bias"), + ("final_linear.weight", "proj_out.weight"), + ("modF.1.weight", "norm_out.linear.weight", swap_scale_shift), + } + + for k in MAP_BASIC: + if len(k) > 2: + key_map[k[1]] = ("{}{}".format(output_prefix, k[0]), None, k[2]) + else: + key_map[k[1]] = "{}{}".format(output_prefix, k[0]) + + return key_map + def repeat_to_batch_size(tensor, batch_size, dim=0): if tensor.shape[dim] > batch_size: return tensor.narrow(dim, 0, batch_size) From 79547efb65ebb41a964ce7686170c4e6c3641eb2 Mon Sep 17 00:00:00 2001 From: pythongosssss <125205205+pythongosssss@users.noreply.github.com> Date: Sun, 14 Jul 2024 07:04:40 +0100 Subject: [PATCH 102/123] New menu fixes - fix send to workflow (#3909) * Fix send to workflow Fix center align of close workflow dialog Better support for elements around canvas * More resilent to extra elements added to body --- web/scripts/ui/menu/workflows.js | 8 +++++++- web/style.css | 25 +++++++++++++++++-------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/web/scripts/ui/menu/workflows.js b/web/scripts/ui/menu/workflows.js index afdff538a..3b904fb4b 100644 --- a/web/scripts/ui/menu/workflows.js +++ b/web/scripts/ui/menu/workflows.js @@ -182,6 +182,11 @@ export class ComfyWorkflowsMenu { * @param {ComfyWorkflow} workflow */ async function sendToWorkflow(img, workflow) { + const openWorkflow = app.workflowManager.openWorkflows.find((w) => w.path === workflow.path); + if (openWorkflow) { + workflow = openWorkflow; + } + await workflow.load(); let options = []; const nodes = app.graph.computeExecutionOrder(false); @@ -214,7 +219,8 @@ export class ComfyWorkflowsMenu { nodeType.prototype["getExtraMenuOptions"] = function (_, options) { const r = getExtraMenuOptions?.apply?.(this, arguments); - if (app.ui.settings.getSettingValue("Comfy.UseNewMenu", false) === true) { + const setting = app.ui.settings.getSettingValue("Comfy.UseNewMenu", false); + if (setting && setting != "Disabled") { const t = /** @type { {imageIndex?: number, overIndex?: number, imgs: string[]} } */ /** @type {any} */ (this); let img; if (t.imageIndex != null) { diff --git a/web/style.css b/web/style.css index e983b652a..8ef1d0dd1 100644 --- a/web/style.css +++ b/web/style.css @@ -41,7 +41,7 @@ body { background-color: var(--bg-color); color: var(--fg-color); grid-template-columns: auto 1fr auto; - grid-template-rows: auto auto 1fr auto; + grid-template-rows: auto 1fr auto; min-height: -webkit-fill-available; max-height: -webkit-fill-available; min-width: -webkit-fill-available; @@ -49,32 +49,37 @@ body { } .comfyui-body-top { - order: 0; + order: -5; grid-column: 1/-1; z-index: 10; + display: flex; + flex-direction: column; } .comfyui-body-left { - order: 1; + order: -4; z-index: 10; + display: flex; } #graph-canvas { width: 100%; height: 100%; - order: 2; - grid-column: 1/-1; + order: -3; } .comfyui-body-right { - order: 3; + order: -2; z-index: 10; + display: flex; } .comfyui-body-bottom { - order: 4; + order: -1; grid-column: 1/-1; z-index: 10; + display: flex; + flex-direction: column; } .comfy-multiline-input { @@ -408,8 +413,12 @@ dialog::backdrop { background: rgba(0, 0, 0, 0.5); } -.comfy-dialog.comfyui-dialog { +.comfy-dialog.comfyui-dialog.comfy-modal { top: 0; + left: 0; + right: 0; + bottom: 0; + transform: none; } .comfy-dialog.comfy-modal { From 7914c47d5afb1c5ffab49d665f9a1ac86a458821 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sun, 14 Jul 2024 10:07:36 -0400 Subject: [PATCH 103/123] Quick fix for the promax controlnet. --- comfy/cldm/cldm.py | 6 +++--- comfy/controlnet.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/comfy/cldm/cldm.py b/comfy/cldm/cldm.py index d4d32b87e..4a58c823f 100644 --- a/comfy/cldm/cldm.py +++ b/comfy/cldm/cldm.py @@ -92,7 +92,7 @@ class ControlNet(nn.Module): transformer_depth_middle=None, transformer_depth_output=None, attn_precision=None, - union_controlnet=False, + union_controlnet_num_control_type=None, device=None, operations=comfy.ops.disable_weight_init, **kwargs, @@ -320,8 +320,8 @@ class ControlNet(nn.Module): self.middle_block_out = self.make_zero_conv(ch, operations=operations, dtype=self.dtype, device=device) self._feature_size += ch - if union_controlnet: - self.num_control_type = 6 + if union_controlnet_num_control_type is not None: + self.num_control_type = union_controlnet_num_control_type num_trans_channel = 320 num_trans_head = 8 num_trans_layer = 1 diff --git a/comfy/controlnet.py b/comfy/controlnet.py index 84286f1fa..b8e27c71f 100644 --- a/comfy/controlnet.py +++ b/comfy/controlnet.py @@ -414,7 +414,7 @@ def load_controlnet(ckpt_path, model=None): new_sd[diffusers_keys[k]] = controlnet_data.pop(k) if "control_add_embedding.linear_1.bias" in controlnet_data: #Union Controlnet - controlnet_config["union_controlnet"] = True + controlnet_config["union_controlnet_num_control_type"] = controlnet_data["task_embedding"].shape[0] for k in list(controlnet_data.keys()): new_k = k.replace('.attn.in_proj_', '.attn.in_proj.') new_sd[new_k] = controlnet_data.pop(k) From 1305fb294ca69d0a44d88c5bf7ce8c682abd0c8a Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Mon, 15 Jul 2024 17:36:24 -0400 Subject: [PATCH 104/123] Refactor: Move some code to the comfy/text_encoders folder. --- comfy/sd.py | 20 +++++++++---------- comfy/supported_models.py | 8 ++++---- comfy/text_encoders/aura_t5.py | 4 ++-- comfy/{ => text_encoders}/sa_t5.py | 4 ++-- comfy/{ => text_encoders}/sd3_clip.py | 4 ++-- comfy/{ => text_encoders}/t5.py | 0 comfy/{ => text_encoders}/t5_config_base.json | 0 comfy/{ => text_encoders}/t5_config_xxl.json | 0 .../t5_tokenizer/special_tokens_map.json | 0 .../t5_tokenizer/tokenizer.json | 0 .../t5_tokenizer/tokenizer_config.json | 0 11 files changed, 20 insertions(+), 20 deletions(-) rename comfy/{ => text_encoders}/sa_t5.py (88%) rename comfy/{ => text_encoders}/sd3_clip.py (98%) rename comfy/{ => text_encoders}/t5.py (100%) rename comfy/{ => text_encoders}/t5_config_base.json (100%) rename comfy/{ => text_encoders}/t5_config_xxl.json (100%) rename comfy/{ => text_encoders}/t5_tokenizer/special_tokens_map.json (100%) rename comfy/{ => text_encoders}/t5_tokenizer/tokenizer.json (100%) rename comfy/{ => text_encoders}/t5_tokenizer/tokenizer_config.json (100%) diff --git a/comfy/sd.py b/comfy/sd.py index b5bbcef61..17df5faff 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -19,8 +19,8 @@ from . import model_detection from . import sd1_clip from . import sd2_clip from . import sdxl_clip -from . import sd3_clip -from . import sa_t5 +import comfy.text_encoders.sd3_clip +import comfy.text_encoders.sa_t5 import comfy.text_encoders.aura_t5 import comfy.model_patcher @@ -414,27 +414,27 @@ def load_clip(ckpt_paths, embedding_directory=None, clip_type=CLIPType.STABLE_DI weight = clip_data[0]["encoder.block.23.layer.1.DenseReluDense.wi_1.weight"] dtype_t5 = weight.dtype if weight.shape[-1] == 4096: - clip_target.clip = sd3_clip.sd3_clip(clip_l=False, clip_g=False, t5=True, dtype_t5=dtype_t5) - clip_target.tokenizer = sd3_clip.SD3Tokenizer + clip_target.clip = comfy.text_encoders.sd3_clip.sd3_clip(clip_l=False, clip_g=False, t5=True, dtype_t5=dtype_t5) + clip_target.tokenizer = comfy.text_encoders.sd3_clip.SD3Tokenizer elif weight.shape[-1] == 2048: clip_target.clip = comfy.text_encoders.aura_t5.AuraT5Model clip_target.tokenizer = comfy.text_encoders.aura_t5.AuraT5Tokenizer elif "encoder.block.0.layer.0.SelfAttention.k.weight" in clip_data[0]: - clip_target.clip = sa_t5.SAT5Model - clip_target.tokenizer = sa_t5.SAT5Tokenizer + clip_target.clip = comfy.text_encoders.sa_t5.SAT5Model + clip_target.tokenizer = comfy.text_encoders.sa_t5.SAT5Tokenizer else: clip_target.clip = sd1_clip.SD1ClipModel clip_target.tokenizer = sd1_clip.SD1Tokenizer elif len(clip_data) == 2: if clip_type == CLIPType.SD3: - clip_target.clip = sd3_clip.sd3_clip(clip_l=True, clip_g=True, t5=False) - clip_target.tokenizer = sd3_clip.SD3Tokenizer + clip_target.clip = comfy.text_encoders.sd3_clip.sd3_clip(clip_l=True, clip_g=True, t5=False) + clip_target.tokenizer = comfy.text_encoders.sd3_clip.SD3Tokenizer else: clip_target.clip = sdxl_clip.SDXLClipModel clip_target.tokenizer = sdxl_clip.SDXLTokenizer elif len(clip_data) == 3: - clip_target.clip = sd3_clip.SD3ClipModel - clip_target.tokenizer = sd3_clip.SD3Tokenizer + clip_target.clip = comfy.text_encoders.sd3_clip.SD3ClipModel + clip_target.tokenizer = comfy.text_encoders.sd3_clip.SD3Tokenizer clip = CLIP(clip_target, embedding_directory=embedding_directory) for c in clip_data: diff --git a/comfy/supported_models.py b/comfy/supported_models.py index a030f6229..b4d1059ef 100644 --- a/comfy/supported_models.py +++ b/comfy/supported_models.py @@ -5,8 +5,8 @@ from . import utils from . import sd1_clip from . import sd2_clip from . import sdxl_clip -from . import sd3_clip -from . import sa_t5 +import comfy.text_encoders.sd3_clip +import comfy.text_encoders.sa_t5 import comfy.text_encoders.aura_t5 from . import supported_models_base @@ -524,7 +524,7 @@ class SD3(supported_models_base.BASE): t5 = True dtype_t5 = state_dict[t5_key].dtype - return supported_models_base.ClipTarget(sd3_clip.SD3Tokenizer, sd3_clip.sd3_clip(clip_l=clip_l, clip_g=clip_g, t5=t5, dtype_t5=dtype_t5)) + return supported_models_base.ClipTarget(comfy.text_encoders.sd3_clip.SD3Tokenizer, comfy.text_encoders.sd3_clip.sd3_clip(clip_l=clip_l, clip_g=clip_g, t5=t5, dtype_t5=dtype_t5)) class StableAudio(supported_models_base.BASE): unet_config = { @@ -555,7 +555,7 @@ class StableAudio(supported_models_base.BASE): return utils.state_dict_prefix_replace(state_dict, replace_prefix) def clip_target(self, state_dict={}): - return supported_models_base.ClipTarget(sa_t5.SAT5Tokenizer, sa_t5.SAT5Model) + return supported_models_base.ClipTarget(comfy.text_encoders.sa_t5.SAT5Tokenizer, comfy.text_encoders.sa_t5.SAT5Model) class AuraFlow(supported_models_base.BASE): unet_config = { diff --git a/comfy/text_encoders/aura_t5.py b/comfy/text_encoders/aura_t5.py index 95f942ef5..6b9e4fe53 100644 --- a/comfy/text_encoders/aura_t5.py +++ b/comfy/text_encoders/aura_t5.py @@ -1,12 +1,12 @@ from comfy import sd1_clip from .llama_tokenizer import LLAMATokenizer -import comfy.t5 +import comfy.text_encoders.t5 import os class PT5XlModel(sd1_clip.SDClipModel): def __init__(self, device="cpu", layer="last", layer_idx=None, dtype=None): textmodel_json_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "t5_pile_config_xl.json") - super().__init__(device=device, layer=layer, layer_idx=layer_idx, textmodel_json_config=textmodel_json_config, dtype=dtype, special_tokens={"end": 2, "pad": 1}, model_class=comfy.t5.T5, enable_attention_masks=True, zero_out_masked=True) + super().__init__(device=device, layer=layer, layer_idx=layer_idx, textmodel_json_config=textmodel_json_config, dtype=dtype, special_tokens={"end": 2, "pad": 1}, model_class=comfy.text_encoders.t5.T5, enable_attention_masks=True, zero_out_masked=True) class PT5XlTokenizer(sd1_clip.SDTokenizer): def __init__(self, embedding_directory=None): diff --git a/comfy/sa_t5.py b/comfy/text_encoders/sa_t5.py similarity index 88% rename from comfy/sa_t5.py rename to comfy/text_encoders/sa_t5.py index acc302f67..038558e7a 100644 --- a/comfy/sa_t5.py +++ b/comfy/text_encoders/sa_t5.py @@ -1,12 +1,12 @@ from comfy import sd1_clip from transformers import T5TokenizerFast -import comfy.t5 +import comfy.text_encoders.t5 import os class T5BaseModel(sd1_clip.SDClipModel): def __init__(self, device="cpu", layer="last", layer_idx=None, dtype=None): textmodel_json_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "t5_config_base.json") - super().__init__(device=device, layer=layer, layer_idx=layer_idx, textmodel_json_config=textmodel_json_config, dtype=dtype, special_tokens={"end": 1, "pad": 0}, model_class=comfy.t5.T5, enable_attention_masks=True, zero_out_masked=True) + super().__init__(device=device, layer=layer, layer_idx=layer_idx, textmodel_json_config=textmodel_json_config, dtype=dtype, special_tokens={"end": 1, "pad": 0}, model_class=comfy.text_encoders.t5.T5, enable_attention_masks=True, zero_out_masked=True) class T5BaseTokenizer(sd1_clip.SDTokenizer): def __init__(self, embedding_directory=None): diff --git a/comfy/sd3_clip.py b/comfy/text_encoders/sd3_clip.py similarity index 98% rename from comfy/sd3_clip.py rename to comfy/text_encoders/sd3_clip.py index 0713eb285..70127e509 100644 --- a/comfy/sd3_clip.py +++ b/comfy/text_encoders/sd3_clip.py @@ -1,7 +1,7 @@ from comfy import sd1_clip from comfy import sdxl_clip from transformers import T5TokenizerFast -import comfy.t5 +import comfy.text_encoders.t5 import torch import os import comfy.model_management @@ -10,7 +10,7 @@ import logging class T5XXLModel(sd1_clip.SDClipModel): def __init__(self, device="cpu", layer="last", layer_idx=None, dtype=None): textmodel_json_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "t5_config_xxl.json") - super().__init__(device=device, layer=layer, layer_idx=layer_idx, textmodel_json_config=textmodel_json_config, dtype=dtype, special_tokens={"end": 1, "pad": 0}, model_class=comfy.t5.T5) + super().__init__(device=device, layer=layer, layer_idx=layer_idx, textmodel_json_config=textmodel_json_config, dtype=dtype, special_tokens={"end": 1, "pad": 0}, model_class=comfy.text_encoders.t5.T5) class T5XXLTokenizer(sd1_clip.SDTokenizer): def __init__(self, embedding_directory=None): diff --git a/comfy/t5.py b/comfy/text_encoders/t5.py similarity index 100% rename from comfy/t5.py rename to comfy/text_encoders/t5.py diff --git a/comfy/t5_config_base.json b/comfy/text_encoders/t5_config_base.json similarity index 100% rename from comfy/t5_config_base.json rename to comfy/text_encoders/t5_config_base.json diff --git a/comfy/t5_config_xxl.json b/comfy/text_encoders/t5_config_xxl.json similarity index 100% rename from comfy/t5_config_xxl.json rename to comfy/text_encoders/t5_config_xxl.json diff --git a/comfy/t5_tokenizer/special_tokens_map.json b/comfy/text_encoders/t5_tokenizer/special_tokens_map.json similarity index 100% rename from comfy/t5_tokenizer/special_tokens_map.json rename to comfy/text_encoders/t5_tokenizer/special_tokens_map.json diff --git a/comfy/t5_tokenizer/tokenizer.json b/comfy/text_encoders/t5_tokenizer/tokenizer.json similarity index 100% rename from comfy/t5_tokenizer/tokenizer.json rename to comfy/text_encoders/t5_tokenizer/tokenizer.json diff --git a/comfy/t5_tokenizer/tokenizer_config.json b/comfy/text_encoders/t5_tokenizer/tokenizer_config.json similarity index 100% rename from comfy/t5_tokenizer/tokenizer_config.json rename to comfy/text_encoders/t5_tokenizer/tokenizer_config.json From 136c93cb477e4c5c308791746583499805ab29aa Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Mon, 15 Jul 2024 20:01:49 -0400 Subject: [PATCH 105/123] Fix bug with workflow not registering change. There was an issue when only the class type of a node changed with all the inputs staying the same. --- execution.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/execution.py b/execution.py index 76225a962..8b3d116c6 100644 --- a/execution.py +++ b/execution.py @@ -247,6 +247,8 @@ def recursive_output_delete_if_changed(prompt, old_prompt, outputs, current_item to_delete = True elif unique_id not in old_prompt: to_delete = True + elif class_type != old_prompt[unique_id]['class_type']: + to_delete = True elif inputs == old_prompt[unique_id]['inputs']: for x in inputs: input_data = inputs[x] From 33346fd9b8856942187ad8c818498a080a2027b5 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Mon, 15 Jul 2024 20:36:03 -0400 Subject: [PATCH 106/123] Fix bug with custom nodes on other drives. --- nodes.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/nodes.py b/nodes.py index 5778f0609..998b316b7 100644 --- a/nodes.py +++ b/nodes.py @@ -1890,29 +1890,29 @@ NODE_DISPLAY_NAME_MAPPINGS = { EXTENSION_WEB_DIRS = {} -def get_relative_module_name(module_path: str) -> str: +def get_module_name(module_path: str) -> str: """ Returns the module name based on the given module path. Examples: - get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node.py") -> "custom_nodes.my_custom_node" - get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node") -> "custom_nodes.my_custom_node" - get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/") -> "custom_nodes.my_custom_node" - get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/__init__.py") -> "custom_nodes.my_custom_node" - get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/__init__") -> "custom_nodes.my_custom_node" - get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/__init__/") -> "custom_nodes.my_custom_node" - get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node.disabled") -> "custom_nodes.my + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node.py") -> "my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node") -> "my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/") -> "my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/__init__.py") -> "my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/__init__") -> "my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node/__init__/") -> "my_custom_node" + get_module_name("C:/Users/username/ComfyUI/custom_nodes/my_custom_node.disabled") -> "custom_nodes Args: module_path (str): The path of the module. Returns: str: The module name. """ - relative_path = os.path.relpath(module_path, folder_paths.base_path) + base_path = os.path.basename(module_path) if os.path.isfile(module_path): - relative_path = os.path.splitext(relative_path)[0] - return relative_path.replace(os.sep, '.') + base_path = os.path.splitext(base_path)[0] + return base_path -def load_custom_node(module_path: str, ignore=set()) -> bool: +def load_custom_node(module_path: str, ignore=set(), module_parent="custom_nodes") -> bool: module_name = os.path.basename(module_path) if os.path.isfile(module_path): sp = os.path.splitext(module_path) @@ -1939,7 +1939,7 @@ def load_custom_node(module_path: str, ignore=set()) -> bool: for name, node_cls in module.NODE_CLASS_MAPPINGS.items(): if name not in ignore: NODE_CLASS_MAPPINGS[name] = node_cls - node_cls.RELATIVE_PYTHON_MODULE = get_relative_module_name(module_path) + node_cls.RELATIVE_PYTHON_MODULE = "{}.{}".format(module_parent, get_module_name(module_path)) if hasattr(module, "NODE_DISPLAY_NAME_MAPPINGS") and getattr(module, "NODE_DISPLAY_NAME_MAPPINGS") is not None: NODE_DISPLAY_NAME_MAPPINGS.update(module.NODE_DISPLAY_NAME_MAPPINGS) return True @@ -1974,7 +1974,7 @@ def init_external_custom_nodes(): if os.path.isfile(module_path) and os.path.splitext(module_path)[1] != ".py": continue if module_path.endswith(".disabled"): continue time_before = time.perf_counter() - success = load_custom_node(module_path, base_node_names) + success = load_custom_node(module_path, base_node_names, module_parent="custom_nodes") node_import_times.append((time.perf_counter() - time_before, module_path, success)) if len(node_import_times) > 0: @@ -2040,7 +2040,7 @@ def init_builtin_extra_nodes(): import_failed = [] for node_file in extras_files: - if not load_custom_node(os.path.join(extras_dir, node_file)): + if not load_custom_node(os.path.join(extras_dir, node_file), module_parent="comfy_extras"): import_failed.append(node_file) return import_failed From 99458e8aca3c48c7b2de3c404f66536991c37182 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Tue, 16 Jul 2024 11:26:11 -0400 Subject: [PATCH 107/123] Add `FrontendManager` to manage non-default front-end impl (#3897) * Add frontend manager * Add tests * nit * Add unit test to github CI * Fix path * nit * ignore * Add logging * Install test deps * Remove 'stable' keyword support * Update test * Add web-root arg * Rename web-root to front-end-root * Add test on non-exist version number * Use repo owner/name to replace hard coded provider list * Inline cmd args * nit * Fix unit test --- .github/workflows/test-ui.yaml | 4 + .gitignore | 3 +- app/__init__.py | 0 app/frontend_management.py | 187 +++++++++++++++++++ comfy/cli_args.py | 35 ++++ pytest.ini | 7 +- server.py | 11 +- tests-unit/README.md | 8 + tests-unit/app_test/__init__.py | 0 tests-unit/app_test/frontend_manager_test.py | 100 ++++++++++ tests-unit/requirements.txt | 1 + 11 files changed, 350 insertions(+), 6 deletions(-) create mode 100644 app/__init__.py create mode 100644 app/frontend_management.py create mode 100644 tests-unit/README.md create mode 100644 tests-unit/app_test/__init__.py create mode 100644 tests-unit/app_test/frontend_manager_test.py create mode 100644 tests-unit/requirements.txt diff --git a/.github/workflows/test-ui.yaml b/.github/workflows/test-ui.yaml index 4b8b97934..d947e9d5f 100644 --- a/.github/workflows/test-ui.yaml +++ b/.github/workflows/test-ui.yaml @@ -24,3 +24,7 @@ jobs: npm run test:generate npm test -- --verbose working-directory: ./tests-ui + - name: Run Unit Tests + run: | + pip install -r tests-unit/requirements.txt + python -m pytest tests-unit diff --git a/.gitignore b/.gitignore index a9beebe73..5092c98f4 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,5 @@ venv/ !/web/extensions/core/ /tests-ui/data/object_info.json /user/ -*.log \ No newline at end of file +*.log +web_custom_versions/ \ No newline at end of file diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/app/frontend_management.py b/app/frontend_management.py new file mode 100644 index 000000000..0855f4160 --- /dev/null +++ b/app/frontend_management.py @@ -0,0 +1,187 @@ +import argparse +import logging +import os +import re +import tempfile +import zipfile +from dataclasses import dataclass +from functools import cached_property +from pathlib import Path +from typing import TypedDict + +import requests +from typing_extensions import NotRequired +from comfy.cli_args import DEFAULT_VERSION_STRING + + +REQUEST_TIMEOUT = 10 # seconds + + +class Asset(TypedDict): + url: str + + +class Release(TypedDict): + id: int + tag_name: str + name: str + prerelease: bool + created_at: str + published_at: str + body: str + assets: NotRequired[list[Asset]] + + +@dataclass +class FrontEndProvider: + owner: str + repo: str + + @property + def folder_name(self) -> str: + return f"{self.owner}_{self.repo}" + + @property + def release_url(self) -> str: + return f"https://api.github.com/repos/{self.owner}/{self.repo}/releases" + + @cached_property + def all_releases(self) -> list[Release]: + releases = [] + api_url = self.release_url + while api_url: + response = requests.get(api_url, timeout=REQUEST_TIMEOUT) + response.raise_for_status() # Raises an HTTPError if the response was an error + releases.extend(response.json()) + # GitHub uses the Link header to provide pagination links. Check if it exists and update api_url accordingly. + if "next" in response.links: + api_url = response.links["next"]["url"] + else: + api_url = None + return releases + + @cached_property + def latest_release(self) -> Release: + latest_release_url = f"{self.release_url}/latest" + response = requests.get(latest_release_url, timeout=REQUEST_TIMEOUT) + response.raise_for_status() # Raises an HTTPError if the response was an error + return response.json() + + def get_release(self, version: str) -> Release: + if version == "latest": + return self.latest_release + else: + for release in self.all_releases: + if release["tag_name"] in [version, f"v{version}"]: + return release + raise ValueError(f"Version {version} not found in releases") + + +def download_release_asset_zip(release: Release, destination_path: str) -> None: + """Download dist.zip from github release.""" + asset_url = None + for asset in release.get("assets", []): + if asset["name"] == "dist.zip": + asset_url = asset["url"] + break + + if not asset_url: + raise ValueError("dist.zip not found in the release assets") + + # Use a temporary file to download the zip content + with tempfile.TemporaryFile() as tmp_file: + headers = {"Accept": "application/octet-stream"} + response = requests.get( + asset_url, headers=headers, allow_redirects=True, timeout=REQUEST_TIMEOUT + ) + response.raise_for_status() # Ensure we got a successful response + + # Write the content to the temporary file + tmp_file.write(response.content) + + # Go back to the beginning of the temporary file + tmp_file.seek(0) + + # Extract the zip file content to the destination path + with zipfile.ZipFile(tmp_file, "r") as zip_ref: + zip_ref.extractall(destination_path) + + +class FrontendManager: + DEFAULT_FRONTEND_PATH = str(Path(__file__).parents[1] / "web") + CUSTOM_FRONTENDS_ROOT = str(Path(__file__).parents[1] / "web_custom_versions") + + @classmethod + def parse_version_string(cls, value: str) -> tuple[str, str, str]: + """ + Args: + value (str): The version string to parse. + + Returns: + tuple[str, str]: A tuple containing provider name and version. + + Raises: + argparse.ArgumentTypeError: If the version string is invalid. + """ + VERSION_PATTERN = r"^([a-zA-Z0-9][a-zA-Z0-9-]{0,38})/([a-zA-Z0-9_.-]+)@(\d+\.\d+\.\d+|latest)$" + match_result = re.match(VERSION_PATTERN, value) + if match_result is None: + raise argparse.ArgumentTypeError(f"Invalid version string: {value}") + + return match_result.group(1), match_result.group(2), match_result.group(3) + + @classmethod + def init_frontend_unsafe(cls, version_string: str) -> str: + """ + Initializes the frontend for the specified version. + + Args: + version_string (str): The version string. + + Returns: + str: The path to the initialized frontend. + + Raises: + Exception: If there is an error during the initialization process. + main error source might be request timeout or invalid URL. + """ + if version_string == DEFAULT_VERSION_STRING: + return cls.DEFAULT_FRONTEND_PATH + + repo_owner, repo_name, version = cls.parse_version_string(version_string) + provider = FrontEndProvider(repo_owner, repo_name) + release = provider.get_release(version) + + semantic_version = release["tag_name"].lstrip("v") + web_root = str( + Path(cls.CUSTOM_FRONTENDS_ROOT) / provider.folder_name / semantic_version + ) + if not os.path.exists(web_root): + os.makedirs(web_root, exist_ok=True) + logging.info( + "Downloading frontend(%s) version(%s) to (%s)", + provider.folder_name, + semantic_version, + web_root, + ) + logging.debug(release) + download_release_asset_zip(release, destination_path=web_root) + return web_root + + @classmethod + def init_frontend(cls, version_string: str) -> str: + """ + Initializes the frontend with the specified version string. + + Args: + version_string (str): The version string to initialize the frontend with. + + Returns: + str: The path of the initialized frontend. + """ + try: + return cls.init_frontend_unsafe(version_string) + except Exception as e: + logging.error("Failed to initialize frontend: %s", e) + logging.info("Falling back to the default frontend.") + return cls.DEFAULT_FRONTEND_PATH diff --git a/comfy/cli_args.py b/comfy/cli_args.py index b72bf3998..6251e3d28 100644 --- a/comfy/cli_args.py +++ b/comfy/cli_args.py @@ -1,7 +1,10 @@ import argparse import enum +import os +from typing import Optional import comfy.options + class EnumAction(argparse.Action): """ Argparse action for handling Enums @@ -124,6 +127,38 @@ parser.add_argument("--multi-user", action="store_true", help="Enables per-user parser.add_argument("--verbose", action="store_true", help="Enables more debug prints.") +# The default built-in provider hosted under web/ +DEFAULT_VERSION_STRING = "comfyanonymous/ComfyUI@latest" + +parser.add_argument( + "--front-end-version", + type=str, + default=DEFAULT_VERSION_STRING, + help=""" + Specifies the version of the frontend to be used. This command needs internet connectivity to query and + download available frontend implementations from GitHub releases. + + The version string should be in the format of: + [repoOwner]/[repoName]@[version] + where version is one of: "latest" or a valid version number (e.g. "1.0.0") + """, +) + +def is_valid_directory(path: Optional[str]) -> Optional[str]: + """Validate if the given path is a directory.""" + if path is None: + return None + + if not os.path.isdir(path): + raise argparse.ArgumentTypeError(f"{path} is not a valid directory.") + return path + +parser.add_argument( + "--front-end-root", + type=is_valid_directory, + default=None, + help="The local filesystem path to the directory where the frontend is located. Overrides --front-end-version.", +) if comfy.options.args_parsing: args = parser.parse_args() diff --git a/pytest.ini b/pytest.ini index b5a68e0f1..8b7a747e7 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,5 +1,8 @@ [pytest] markers = inference: mark as inference test (deselect with '-m "not inference"') -testpaths = tests -addopts = -s \ No newline at end of file +testpaths = + tests + tests-unit +addopts = -s +pythonpath = . diff --git a/server.py b/server.py index ce7c7532d..03c4c4219 100644 --- a/server.py +++ b/server.py @@ -25,9 +25,10 @@ import mimetypes from comfy.cli_args import args import comfy.utils import comfy.model_management - +from app.frontend_management import FrontendManager from app.user_manager import UserManager + class BinaryEventTypes: PREVIEW_IMAGE = 1 UNENCODED_PREVIEW_IMAGE = 2 @@ -83,8 +84,12 @@ class PromptServer(): max_upload_size = round(args.max_upload_size * 1024 * 1024) self.app = web.Application(client_max_size=max_upload_size, middlewares=middlewares) self.sockets = dict() - self.web_root = os.path.join(os.path.dirname( - os.path.realpath(__file__)), "web") + self.web_root = ( + FrontendManager.init_frontend(args.front_end_version) + if args.front_end_root is None + else args.front_end_root + ) + logging.info(f"[Prompt Server] web root: {self.web_root}") routes = web.RouteTableDef() self.routes = routes self.last_node_id = None diff --git a/tests-unit/README.md b/tests-unit/README.md new file mode 100644 index 000000000..94abd9853 --- /dev/null +++ b/tests-unit/README.md @@ -0,0 +1,8 @@ +# Pytest Unit Tests + +## Install test dependencies + +`pip install -r tests-units/requirements.txt` + +## Run tests +`pytest tests-units/` diff --git a/tests-unit/app_test/__init__.py b/tests-unit/app_test/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests-unit/app_test/frontend_manager_test.py b/tests-unit/app_test/frontend_manager_test.py new file mode 100644 index 000000000..637869cfb --- /dev/null +++ b/tests-unit/app_test/frontend_manager_test.py @@ -0,0 +1,100 @@ +import argparse +import pytest +from requests.exceptions import HTTPError + +from app.frontend_management import ( + FrontendManager, + FrontEndProvider, + Release, +) +from comfy.cli_args import DEFAULT_VERSION_STRING + + +@pytest.fixture +def mock_releases(): + return [ + Release( + id=1, + tag_name="1.0.0", + name="Release 1.0.0", + prerelease=False, + created_at="2022-01-01T00:00:00Z", + published_at="2022-01-01T00:00:00Z", + body="Release notes for 1.0.0", + assets=[{"name": "dist.zip", "url": "https://example.com/dist.zip"}], + ), + Release( + id=2, + tag_name="2.0.0", + name="Release 2.0.0", + prerelease=False, + created_at="2022-02-01T00:00:00Z", + published_at="2022-02-01T00:00:00Z", + body="Release notes for 2.0.0", + assets=[{"name": "dist.zip", "url": "https://example.com/dist.zip"}], + ), + ] + + +@pytest.fixture +def mock_provider(mock_releases): + provider = FrontEndProvider( + owner="test-owner", + repo="test-repo", + ) + provider.all_releases = mock_releases + provider.latest_release = mock_releases[1] + FrontendManager.PROVIDERS = [provider] + return provider + + +def test_get_release(mock_provider, mock_releases): + version = "1.0.0" + release = mock_provider.get_release(version) + assert release == mock_releases[0] + + +def test_get_release_latest(mock_provider, mock_releases): + version = "latest" + release = mock_provider.get_release(version) + assert release == mock_releases[1] + + +def test_get_release_invalid_version(mock_provider): + version = "invalid" + with pytest.raises(ValueError): + mock_provider.get_release(version) + + +def test_init_frontend_default(): + version_string = DEFAULT_VERSION_STRING + frontend_path = FrontendManager.init_frontend(version_string) + assert frontend_path == FrontendManager.DEFAULT_FRONTEND_PATH + + +def test_init_frontend_invalid_version(): + version_string = "test-owner/test-repo@1.100.99" + with pytest.raises(HTTPError): + FrontendManager.init_frontend_unsafe(version_string) + + +def test_init_frontend_invalid_provider(): + version_string = "invalid/invalid@latest" + with pytest.raises(HTTPError): + FrontendManager.init_frontend_unsafe(version_string) + + +def test_parse_version_string(): + version_string = "owner/repo@1.0.0" + repo_owner, repo_name, version = FrontendManager.parse_version_string( + version_string + ) + assert repo_owner == "owner" + assert repo_name == "repo" + assert version == "1.0.0" + + +def test_parse_version_string_invalid(): + version_string = "invalid" + with pytest.raises(argparse.ArgumentTypeError): + FrontendManager.parse_version_string(version_string) diff --git a/tests-unit/requirements.txt b/tests-unit/requirements.txt new file mode 100644 index 000000000..0587502f8 --- /dev/null +++ b/tests-unit/requirements.txt @@ -0,0 +1 @@ +pytest>=7.8.0 From e1630391d6d190c3dd9ef4609f0c84af72be54af Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 16 Jul 2024 11:29:38 -0400 Subject: [PATCH 108/123] Allow version names like v0.0.1 for the FrontendManager. --- app/frontend_management.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/frontend_management.py b/app/frontend_management.py index 0855f4160..5452f6e11 100644 --- a/app/frontend_management.py +++ b/app/frontend_management.py @@ -123,7 +123,7 @@ class FrontendManager: Raises: argparse.ArgumentTypeError: If the version string is invalid. """ - VERSION_PATTERN = r"^([a-zA-Z0-9][a-zA-Z0-9-]{0,38})/([a-zA-Z0-9_.-]+)@(\d+\.\d+\.\d+|latest)$" + VERSION_PATTERN = r"^([a-zA-Z0-9][a-zA-Z0-9-]{0,38})/([a-zA-Z0-9_.-]+)@(v?\d+\.\d+\.\d+|latest)$" match_result = re.match(VERSION_PATTERN, value) if match_result is None: raise argparse.ArgumentTypeError(f"Invalid version string: {value}") From 821f93872ecf3f1769b8abebd640a804839f4ab9 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 16 Jul 2024 15:18:24 -0400 Subject: [PATCH 109/123] Allow model sampling to set number of timesteps. --- comfy/model_sampling.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/comfy/model_sampling.py b/comfy/model_sampling.py index 2d95a83dc..25bb7e043 100644 --- a/comfy/model_sampling.py +++ b/comfy/model_sampling.py @@ -59,8 +59,9 @@ class ModelSamplingDiscrete(torch.nn.Module): beta_schedule = sampling_settings.get("beta_schedule", "linear") linear_start = sampling_settings.get("linear_start", 0.00085) linear_end = sampling_settings.get("linear_end", 0.012) + timesteps = sampling_settings.get("timesteps", 1000) - self._register_schedule(given_betas=None, beta_schedule=beta_schedule, timesteps=1000, linear_start=linear_start, linear_end=linear_end, cosine_s=8e-3) + self._register_schedule(given_betas=None, beta_schedule=beta_schedule, timesteps=timesteps, linear_start=linear_start, linear_end=linear_end, cosine_s=8e-3) self.sigma_data = 1.0 def _register_schedule(self, given_betas=None, beta_schedule="linear", timesteps=1000, From 8270c625301034767c77b7d7b1e5a135172d1ebb Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 16 Jul 2024 17:01:40 -0400 Subject: [PATCH 110/123] Add SetUnionControlNetType to set the type of the union controlnet model. --- comfy/controlnet.py | 8 ++++++- comfy_extras/nodes_controlnet.py | 37 ++++++++++++++++++++++++++++++++ nodes.py | 1 + 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 comfy_extras/nodes_controlnet.py diff --git a/comfy/controlnet.py b/comfy/controlnet.py index b8e27c71f..12e5f16c8 100644 --- a/comfy/controlnet.py +++ b/comfy/controlnet.py @@ -45,6 +45,7 @@ class ControlBase: self.timestep_range = None self.compression_ratio = 8 self.upscale_algorithm = 'nearest-exact' + self.extra_args = {} if device is None: device = comfy.model_management.get_torch_device() @@ -90,6 +91,7 @@ class ControlBase: c.compression_ratio = self.compression_ratio c.upscale_algorithm = self.upscale_algorithm c.latent_format = self.latent_format + c.extra_args = self.extra_args.copy() c.vae = self.vae def inference_memory_requirements(self, dtype): @@ -135,6 +137,10 @@ class ControlBase: o[i] = prev_val + o[i] #TODO: change back to inplace add if shared tensors stop being an issue return out + def set_extra_arg(self, argument, value=None): + self.extra_args[argument] = value + + class ControlNet(ControlBase): def __init__(self, control_model=None, global_average_pooling=False, compression_ratio=8, latent_format=None, device=None, load_device=None, manual_cast_dtype=None): super().__init__(device) @@ -191,7 +197,7 @@ class ControlNet(ControlBase): timestep = self.model_sampling_current.timestep(t) x_noisy = self.model_sampling_current.calculate_input(t, x_noisy) - control = self.control_model(x=x_noisy.to(dtype), hint=self.cond_hint, timesteps=timestep.float(), context=context.to(dtype), y=y) + control = self.control_model(x=x_noisy.to(dtype), hint=self.cond_hint, timesteps=timestep.float(), context=context.to(dtype), y=y, **self.extra_args) return self.control_merge(control, control_prev, output_dtype) def copy(self): diff --git a/comfy_extras/nodes_controlnet.py b/comfy_extras/nodes_controlnet.py new file mode 100644 index 000000000..e550436b0 --- /dev/null +++ b/comfy_extras/nodes_controlnet.py @@ -0,0 +1,37 @@ + +UNION_CONTROLNET_TYPES = {"auto": -1, + "openpose": 0, + "depth": 1, + "hed/pidi/scribble/ted": 2, + "canny/lineart/anime_lineart/mlsd": 3, + "normal": 4, + "segment": 5, + "tile": 6, + "repaint": 7, + } + +class SetUnionControlNetType: + @classmethod + def INPUT_TYPES(s): + return {"required": {"control_net": ("CONTROL_NET", ), + "type": (list(UNION_CONTROLNET_TYPES.keys()),) + }} + + CATEGORY = "conditioning" + RETURN_TYPES = ("CONTROL_NET",) + + FUNCTION = "set_controlnet_type" + + def set_controlnet_type(self, control_net, type): + control_net = control_net.copy() + type_number = UNION_CONTROLNET_TYPES[type] + if type_number >= 0: + control_net.set_extra_arg("control_type", [type_number]) + else: + control_net.set_extra_arg("control_type", []) + + return (control_net,) + +NODE_CLASS_MAPPINGS = { + "SetUnionControlNetType": SetUnionControlNetType, +} diff --git a/nodes.py b/nodes.py index 998b316b7..89a2f21d2 100644 --- a/nodes.py +++ b/nodes.py @@ -2036,6 +2036,7 @@ def init_builtin_extra_nodes(): "nodes_audio.py", "nodes_sd3.py", "nodes_gits.py", + "nodes_controlnet.py", ] import_failed = [] From 60383f3b64aa4477edfea325879bb04d3695161c Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 16 Jul 2024 17:08:25 -0400 Subject: [PATCH 111/123] Move controlnet nodes to conditioning/controlnet. --- comfy_extras/nodes_controlnet.py | 2 +- comfy_extras/nodes_sd3.py | 2 +- nodes.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/comfy_extras/nodes_controlnet.py b/comfy_extras/nodes_controlnet.py index e550436b0..ef7cfc6ab 100644 --- a/comfy_extras/nodes_controlnet.py +++ b/comfy_extras/nodes_controlnet.py @@ -17,7 +17,7 @@ class SetUnionControlNetType: "type": (list(UNION_CONTROLNET_TYPES.keys()),) }} - CATEGORY = "conditioning" + CATEGORY = "conditioning/controlnet" RETURN_TYPES = ("CONTROL_NET",) FUNCTION = "set_controlnet_type" diff --git a/comfy_extras/nodes_sd3.py b/comfy_extras/nodes_sd3.py index 548b1ad6a..0aafa2426 100644 --- a/comfy_extras/nodes_sd3.py +++ b/comfy_extras/nodes_sd3.py @@ -92,7 +92,7 @@ class ControlNetApplySD3(nodes.ControlNetApplyAdvanced): "start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), "end_percent": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001}) }} - CATEGORY = "_for_testing/sd3" + CATEGORY = "conditioning/controlnet" NODE_CLASS_MAPPINGS = { "TripleCLIPLoader": TripleCLIPLoader, diff --git a/nodes.py b/nodes.py index 89a2f21d2..fbdcb6c91 100644 --- a/nodes.py +++ b/nodes.py @@ -748,7 +748,7 @@ class ControlNetApply: RETURN_TYPES = ("CONDITIONING",) FUNCTION = "apply_controlnet" - CATEGORY = "conditioning" + CATEGORY = "conditioning/controlnet" def apply_controlnet(self, conditioning, control_net, image, strength): if strength == 0: @@ -783,7 +783,7 @@ class ControlNetApplyAdvanced: RETURN_NAMES = ("positive", "negative") FUNCTION = "apply_controlnet" - CATEGORY = "conditioning" + CATEGORY = "conditioning/controlnet" def apply_controlnet(self, positive, negative, control_net, image, strength, start_percent, end_percent, vae=None): if strength == 0: From f2298799ba58e915a1f22fec336d455c0913f409 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Tue, 16 Jul 2024 18:20:39 -0400 Subject: [PATCH 112/123] Fix annotation (#4035) --- app/frontend_management.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/frontend_management.py b/app/frontend_management.py index 5452f6e11..fb57b23f3 100644 --- a/app/frontend_management.py +++ b/app/frontend_management.py @@ -1,3 +1,4 @@ +from __future__ import annotations import argparse import logging import os From c5a48b15bddab089f0054af0ed72eea868263ef6 Mon Sep 17 00:00:00 2001 From: Thomas Ward Date: Tue, 16 Jul 2024 18:27:09 -0400 Subject: [PATCH 113/123] Make default hash lib configurable without code changes via CLI argument (#3947) * cli_args: Add --duplicate-check-hash-function. * server.py: compare_image_hash configurable hash function Uses an argument added in cli_args to specify the type of hashing to default to for duplicate hash checking. Uses an `eval()` to identify the specific hashlib class to utilize, but ultimately safely operates because we have specific options and only those options/choices in the arg parser. So we don't have any unsafe input there. * Add hasher() to node_helpers * hashlib selection moved to node_helpers * default-hashing-function instead of dupe checking hasher This makes a default-hashing-function option instead of previous selected option. * Use args.default_hashing_function * Use safer handling for node_helpers.hasher() Uses a safer handling method than `eval` to evaluate default hashing function. * Stray parentheses are evil. * Indentation fix. Somehow when I hit save I didn't notice I missed a space to make indentation work proper. Oops! --- comfy/cli_args.py | 1 + node_helpers.py | 13 +++++++++++++ server.py | 7 +++++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/comfy/cli_args.py b/comfy/cli_args.py index 6251e3d28..2397de3d6 100644 --- a/comfy/cli_args.py +++ b/comfy/cli_args.py @@ -112,6 +112,7 @@ vram_group.add_argument("--lowvram", action="store_true", help="Split the unet i vram_group.add_argument("--novram", action="store_true", help="When lowvram isn't enough.") vram_group.add_argument("--cpu", action="store_true", help="To use the CPU for everything (slow).") +parser.add_argument("--default-hashing-function", type=str, choices=['md5', 'sha1', 'sha256', 'sha512'], default='sha256', help="Allows you to choose the hash function to use for duplicate filename / contents comparison. Default is sha256.") parser.add_argument("--disable-smart-memory", action="store_true", help="Force ComfyUI to agressively offload to regular ram instead of keeping models in vram when it can.") parser.add_argument("--deterministic", action="store_true", help="Make pytorch use slower deterministic algorithms when it can. Note that this might not make images deterministic in all cases.") diff --git a/node_helpers.py b/node_helpers.py index 43b9e829f..fee628790 100644 --- a/node_helpers.py +++ b/node_helpers.py @@ -1,3 +1,7 @@ +import hashlib + +from comfy.cli_args import args + from PIL import ImageFile, UnidentifiedImageError def conditioning_set_values(conditioning, values={}): @@ -22,3 +26,12 @@ def pillow(fn, arg): if prev_value is not None: ImageFile.LOAD_TRUNCATED_IMAGES = prev_value return x + +def hasher(): + hashfuncs = { + "md5": hashlib.md5, + "sha1": hashlib.sha1, + "sha256": hashlib.sha256, + "sha512": hashlib.sha512 + } + return hashfuncs[args.default_hashing_function] diff --git a/server.py b/server.py index 03c4c4219..23ca2fd33 100644 --- a/server.py +++ b/server.py @@ -25,6 +25,7 @@ import mimetypes from comfy.cli_args import args import comfy.utils import comfy.model_management +import node_helpers from app.frontend_management import FrontendManager from app.user_manager import UserManager @@ -161,10 +162,12 @@ class PromptServer(): return type_dir, dir_type def compare_image_hash(filepath, image): + hasher = node_helpers.hasher() + # function to compare hashes of two images to see if it already exists, fix to #3465 if os.path.exists(filepath): - a = hashlib.sha256() - b = hashlib.sha256() + a = hasher() + b = hasher() with open(filepath, "rb") as f: a.update(f.read()) b.update(image.file.read()) From 1cde6b2eff5721175725e9cc5f80191d8276e1e8 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Tue, 16 Jul 2024 21:15:08 -0400 Subject: [PATCH 114/123] Disallow use of eval with pylint (#4033) --- .github/workflows/pylint.yml | 23 +++++++++++++++++++++++ .pylintrc | 3 +++ 2 files changed, 26 insertions(+) create mode 100644 .github/workflows/pylint.yml create mode 100644 .pylintrc diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml new file mode 100644 index 000000000..5effbea35 --- /dev/null +++ b/.github/workflows/pylint.yml @@ -0,0 +1,23 @@ +name: Python Linting + +on: [push, pull_request] + +jobs: + pylint: + name: Run Pylint + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: 3.x + + - name: Install Pylint + run: pip install pylint + + - name: Run Pylint + run: pylint --rcfile=.pylintrc $(find . -type f -name "*.py") diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 000000000..a5da56e57 --- /dev/null +++ b/.pylintrc @@ -0,0 +1,3 @@ +[MESSAGES CONTROL] +disable=all +enable=eval-used From 281ad42df4fae74ed11c1e7ff14cff6b7db6498c Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 17 Jul 2024 10:16:31 -0400 Subject: [PATCH 115/123] Fix lowvram union controlnet bug. --- comfy/cldm/cldm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/comfy/cldm/cldm.py b/comfy/cldm/cldm.py index 4a58c823f..1d7294bd6 100644 --- a/comfy/cldm/cldm.py +++ b/comfy/cldm/cldm.py @@ -361,7 +361,7 @@ class ControlNet(nn.Module): controlnet_cond = self.input_hint_block(hint[idx], emb, context) feat_seq = torch.mean(controlnet_cond, dim=(2, 3)) if idx < len(control_type): - feat_seq += self.task_embedding[control_type[idx]] + feat_seq += self.task_embedding[control_type[idx]].to(dtype=feat_seq.dtype, device=feat_seq.device) inputs.append(feat_seq.unsqueeze(1)) condition_list.append(controlnet_cond) From 6f7869f365ca4ec34b017f9002b9dcb9bce56b1a Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 17 Jul 2024 13:05:38 -0400 Subject: [PATCH 116/123] Get clip vision image size from config. --- comfy/clip_vision.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/comfy/clip_vision.py b/comfy/clip_vision.py index acc86be85..ac39c6227 100644 --- a/comfy/clip_vision.py +++ b/comfy/clip_vision.py @@ -34,6 +34,7 @@ class ClipVisionModel(): with open(json_config) as f: config = json.load(f) + self.image_size = config.get("image_size", 224) self.load_device = comfy.model_management.text_encoder_device() offload_device = comfy.model_management.text_encoder_offload_device() self.dtype = comfy.model_management.text_encoder_dtype(self.load_device) @@ -50,7 +51,7 @@ class ClipVisionModel(): def encode_image(self, image): comfy.model_management.load_model_gpu(self.patcher) - pixel_values = clip_preprocess(image.to(self.load_device)).float() + pixel_values = clip_preprocess(image.to(self.load_device), size=self.image_size).float() out = self.model(pixel_values=pixel_values, intermediate_output=-2) outputs = Output() From 855789403b346c7d7772e2c7ed0a6a327f56047f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=B5=E5=93=A9=E4=B8=AA=E5=92=AA?= Date: Thu, 18 Jul 2024 01:12:50 +0800 Subject: [PATCH 117/123] support clip-vit-large-patch14-336 (#4042) * support clip-vit-large-patch14-336 * support clip-vit-large-patch14-336 --- comfy/clip_vision.py | 5 ++++- comfy/clip_vision_config_vitl_336.json | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 comfy/clip_vision_config_vitl_336.json diff --git a/comfy/clip_vision.py b/comfy/clip_vision.py index ac39c6227..20dc3345d 100644 --- a/comfy/clip_vision.py +++ b/comfy/clip_vision.py @@ -94,7 +94,10 @@ def load_clipvision_from_sd(sd, prefix="", convert_keys=False): elif "vision_model.encoder.layers.30.layer_norm1.weight" in sd: json_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "clip_vision_config_h.json") elif "vision_model.encoder.layers.22.layer_norm1.weight" in sd: - json_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "clip_vision_config_vitl.json") + if sd["vision_model.embeddings.position_embedding.weight"].shape[0] == 577: + json_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "clip_vision_config_vitl_336.json") + else: + json_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "clip_vision_config_vitl.json") else: return None diff --git a/comfy/clip_vision_config_vitl_336.json b/comfy/clip_vision_config_vitl_336.json new file mode 100644 index 000000000..f26945273 --- /dev/null +++ b/comfy/clip_vision_config_vitl_336.json @@ -0,0 +1,18 @@ +{ + "attention_dropout": 0.0, + "dropout": 0.0, + "hidden_act": "quick_gelu", + "hidden_size": 1024, + "image_size": 336, + "initializer_factor": 1.0, + "initializer_range": 0.02, + "intermediate_size": 4096, + "layer_norm_eps": 1e-5, + "model_type": "clip_vision_model", + "num_attention_heads": 16, + "num_channels": 3, + "num_hidden_layers": 24, + "patch_size": 14, + "projection_dim": 768, + "torch_dtype": "float32" +} From 374e093e09c94b528d7c9dfc337c65cc5c433ee3 Mon Sep 17 00:00:00 2001 From: bymyself Date: Wed, 17 Jul 2024 13:11:10 -0700 Subject: [PATCH 118/123] Disable audio widget trying to get previews (#4044) --- web/extensions/core/uploadAudio.js | 1 - 1 file changed, 1 deletion(-) diff --git a/web/extensions/core/uploadAudio.js b/web/extensions/core/uploadAudio.js index 0ac9cb807..6cc3863a1 100644 --- a/web/extensions/core/uploadAudio.js +++ b/web/extensions/core/uploadAudio.js @@ -17,7 +17,6 @@ function getResourceURL(subfolder, filename, type = "input") { "filename=" + encodeURIComponent(filename), "type=" + type, "subfolder=" + subfolder, - app.getPreviewFormatParam().substring(1), app.getRandParam().substring(1) ].join("&") From ff6ca2a892c25c5c6edb25c0c674445a7fe6b562 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 18 Jul 2024 17:20:05 -0400 Subject: [PATCH 119/123] Move PAG to model_patches/unet section. Move other unet model_patches nodes to model_patches/unet section. --- comfy_extras/nodes_freelunch.py | 4 ++-- comfy_extras/nodes_hypertile.py | 2 +- comfy_extras/nodes_pag.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/comfy_extras/nodes_freelunch.py b/comfy_extras/nodes_freelunch.py index c5ebcf26f..e3ac58447 100644 --- a/comfy_extras/nodes_freelunch.py +++ b/comfy_extras/nodes_freelunch.py @@ -34,7 +34,7 @@ class FreeU: RETURN_TYPES = ("MODEL",) FUNCTION = "patch" - CATEGORY = "model_patches" + CATEGORY = "model_patches/unet" def patch(self, model, b1, b2, s1, s2): model_channels = model.model.model_config.unet_config["model_channels"] @@ -73,7 +73,7 @@ class FreeU_V2: RETURN_TYPES = ("MODEL",) FUNCTION = "patch" - CATEGORY = "model_patches" + CATEGORY = "model_patches/unet" def patch(self, model, b1, b2, s1, s2): model_channels = model.model.model_config.unet_config["model_channels"] diff --git a/comfy_extras/nodes_hypertile.py b/comfy_extras/nodes_hypertile.py index ae55d23dd..227133f39 100644 --- a/comfy_extras/nodes_hypertile.py +++ b/comfy_extras/nodes_hypertile.py @@ -32,7 +32,7 @@ class HyperTile: RETURN_TYPES = ("MODEL",) FUNCTION = "patch" - CATEGORY = "model_patches" + CATEGORY = "model_patches/unet" def patch(self, model, tile_size, swap_size, max_depth, scale_depth): model_channels = model.model.model_config.unet_config["model_channels"] diff --git a/comfy_extras/nodes_pag.py b/comfy_extras/nodes_pag.py index 63f43fd62..aec78bd8a 100644 --- a/comfy_extras/nodes_pag.py +++ b/comfy_extras/nodes_pag.py @@ -19,7 +19,7 @@ class PerturbedAttentionGuidance: RETURN_TYPES = ("MODEL",) FUNCTION = "patch" - CATEGORY = "_for_testing" + CATEGORY = "model_patches/unet" def patch(self, model, scale): unet_block = "middle" From 011b11d8d767da3355555fe1253b162f55e985c5 Mon Sep 17 00:00:00 2001 From: bymyself Date: Thu, 18 Jul 2024 18:59:18 -0700 Subject: [PATCH 120/123] LoadAudio restores file value from workflow (#4043) * LoadAudio restores file value from workflow * use onAfterGraphConfigured * Don't use anonnymous function --- web/extensions/core/uploadAudio.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/web/extensions/core/uploadAudio.js b/web/extensions/core/uploadAudio.js index 6cc3863a1..9dfa029bf 100644 --- a/web/extensions/core/uploadAudio.js +++ b/web/extensions/core/uploadAudio.js @@ -149,6 +149,15 @@ app.registerExtension({ } audioWidget.callback = onAudioWidgetUpdate + // Load saved audio file widget values if restoring from workflow + const onGraphConfigured = node.onGraphConfigured; + node.onGraphConfigured = function() { + onGraphConfigured?.apply(this, arguments) + if (audioWidget.value) { + onAudioWidgetUpdate() + } + } + const fileInput = document.createElement("input") fileInput.type = "file" fileInput.accept = "audio/*" From 6ab8cad22ee376c0a9a506924cca278bb650afcc Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Fri, 19 Jul 2024 17:44:56 -0400 Subject: [PATCH 121/123] Implement beta sampling scheduler. It is based on: https://arxiv.org/abs/2407.12173 Add "beta" to the list of schedulers and the BetaSamplingScheduler node. --- comfy/samplers.py | 18 +++++++++++++++++- comfy_extras/nodes_custom_sampler.py | 20 ++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/comfy/samplers.py b/comfy/samplers.py index bbf9219f7..0ab08a4cd 100644 --- a/comfy/samplers.py +++ b/comfy/samplers.py @@ -6,6 +6,8 @@ from comfy import model_management import math import logging import comfy.sampler_helpers +import scipy +import numpy def get_area_and_mult(conds, x_in, timestep_in): dims = tuple(x_in.shape[2:]) @@ -337,6 +339,18 @@ def normal_scheduler(model_sampling, steps, sgm=False, floor=False): sigs += [0.0] return torch.FloatTensor(sigs) +# Implemented based on: https://arxiv.org/abs/2407.12173 +def beta_scheduler(model_sampling, steps, alpha=0.6, beta=0.6): + total_timesteps = (len(model_sampling.sigmas) - 1) + ts = 1 - numpy.linspace(0, 1, steps, endpoint=False) + ts = numpy.rint(scipy.stats.beta.ppf(ts, alpha, beta) * total_timesteps) + + sigs = [] + for t in ts: + sigs += [float(model_sampling.sigmas[int(t)])] + sigs += [0.0] + return torch.FloatTensor(sigs) + def get_mask_aabb(masks): if masks.numel() == 0: return torch.zeros((0, 4), device=masks.device, dtype=torch.int) @@ -703,7 +717,7 @@ def sample(model, noise, positive, negative, cfg, device, sampler, sigmas, model return cfg_guider.sample(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed) -SCHEDULER_NAMES = ["normal", "karras", "exponential", "sgm_uniform", "simple", "ddim_uniform"] +SCHEDULER_NAMES = ["normal", "karras", "exponential", "sgm_uniform", "simple", "ddim_uniform", "beta"] SAMPLER_NAMES = KSAMPLER_NAMES + ["ddim", "uni_pc", "uni_pc_bh2"] def calculate_sigmas(model_sampling, scheduler_name, steps): @@ -719,6 +733,8 @@ def calculate_sigmas(model_sampling, scheduler_name, steps): sigmas = ddim_scheduler(model_sampling, steps) elif scheduler_name == "sgm_uniform": sigmas = normal_scheduler(model_sampling, steps, sgm=True) + elif scheduler_name == "beta": + sigmas = beta_scheduler(model_sampling, steps) else: logging.error("error invalid scheduler {}".format(scheduler_name)) return sigmas diff --git a/comfy_extras/nodes_custom_sampler.py b/comfy_extras/nodes_custom_sampler.py index 64a8c0631..b7ab88c27 100644 --- a/comfy_extras/nodes_custom_sampler.py +++ b/comfy_extras/nodes_custom_sampler.py @@ -111,6 +111,25 @@ class SDTurboScheduler: sigmas = torch.cat([sigmas, sigmas.new_zeros([1])]) return (sigmas, ) +class BetaSamplingScheduler: + @classmethod + def INPUT_TYPES(s): + return {"required": + {"model": ("MODEL",), + "steps": ("INT", {"default": 20, "min": 1, "max": 10000}), + "alpha": ("FLOAT", {"default": 0.6, "min": 0.0, "max": 50.0, "step":0.01, "round": False}), + "beta": ("FLOAT", {"default": 0.6, "min": 0.0, "max": 50.0, "step":0.01, "round": False}), + } + } + RETURN_TYPES = ("SIGMAS",) + CATEGORY = "sampling/custom_sampling/schedulers" + + FUNCTION = "get_sigmas" + + def get_sigmas(self, model, steps, alpha, beta): + sigmas = comfy.samplers.beta_scheduler(model.get_model_object("model_sampling"), steps, alpha=alpha, beta=beta) + return (sigmas, ) + class VPScheduler: @classmethod def INPUT_TYPES(s): @@ -638,6 +657,7 @@ NODE_CLASS_MAPPINGS = { "ExponentialScheduler": ExponentialScheduler, "PolyexponentialScheduler": PolyexponentialScheduler, "VPScheduler": VPScheduler, + "BetaSamplingScheduler": BetaSamplingScheduler, "SDTurboScheduler": SDTurboScheduler, "KSamplerSelect": KSamplerSelect, "SamplerEulerAncestral": SamplerEulerAncestral, From 11b74147ee67944c1707b4cc0b4db1cedc73aacc Mon Sep 17 00:00:00 2001 From: Greg Wainer Date: Fri, 19 Jul 2024 17:39:04 -0500 Subject: [PATCH 122/123] Fix/webp exif little endian (#4061) * Fix for isLittleEndian flag in parseExifData. * Add break after reading first exif chunk in getWebpMetadata. --- web/scripts/pnginfo.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/scripts/pnginfo.js b/web/scripts/pnginfo.js index 2c03cf74a..8b1b2c61c 100644 --- a/web/scripts/pnginfo.js +++ b/web/scripts/pnginfo.js @@ -49,7 +49,7 @@ export function getPngMetadata(file) { function parseExifData(exifData) { // Check for the correct TIFF header (0x4949 for little-endian or 0x4D4D for big-endian) - const isLittleEndian = new Uint16Array(exifData.slice(0, 2))[0] === 0x4949; + const isLittleEndian = String.fromCharCode(...exifData.slice(0, 2)) === "II"; // Function to read 16-bit and 32-bit integers from binary data function readInt(offset, isLittleEndian, length) { @@ -134,6 +134,7 @@ export function getWebpMetadata(file) { let index = value.indexOf(':'); txt_chunks[value.slice(0, index)] = value.slice(index + 1); } + break; } offset += 8 + chunk_length; From 95fa9545f167ccf4010849c70045a67a8800aa31 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Sat, 20 Jul 2024 12:27:42 -0400 Subject: [PATCH 123/123] Only append zero to noise schedule if last sigma isn't zero. --- comfy/samplers.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/comfy/samplers.py b/comfy/samplers.py index 0ab08a4cd..3f7633814 100644 --- a/comfy/samplers.py +++ b/comfy/samplers.py @@ -313,13 +313,18 @@ def simple_scheduler(model_sampling, steps): def ddim_scheduler(model_sampling, steps): s = model_sampling sigs = [] - ss = max(len(s.sigmas) // steps, 1) x = 1 + if math.isclose(float(s.sigmas[x]), 0, abs_tol=0.00001): + steps += 1 + sigs = [] + else: + sigs = [0.0] + + ss = max(len(s.sigmas) // steps, 1) while x < len(s.sigmas): sigs += [float(s.sigmas[x])] x += ss sigs = sigs[::-1] - sigs += [0.0] return torch.FloatTensor(sigs) def normal_scheduler(model_sampling, steps, sgm=False, floor=False): @@ -327,16 +332,23 @@ def normal_scheduler(model_sampling, steps, sgm=False, floor=False): start = s.timestep(s.sigma_max) end = s.timestep(s.sigma_min) + append_zero = True if sgm: timesteps = torch.linspace(start, end, steps + 1)[:-1] else: + if math.isclose(float(s.sigma(end)), 0, abs_tol=0.00001): + steps += 1 + append_zero = False timesteps = torch.linspace(start, end, steps) sigs = [] for x in range(len(timesteps)): ts = timesteps[x] - sigs.append(s.sigma(ts)) - sigs += [0.0] + sigs.append(float(s.sigma(ts))) + + if append_zero: + sigs += [0.0] + return torch.FloatTensor(sigs) # Implemented based on: https://arxiv.org/abs/2407.12173